- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找出如何将日志信息从我的 iOS 框架发送到我的 iOS 应用程序。在我的 iOS 应用程序中,我有 Crashlytics 设置,并想使用 Crashlytics.sharedInstance().recordError(error)
每当我从应用程序以及我的 iOS 框架中获取一些日志时。
我通读了多个答案,提到 Crashlytics 只能在应用程序中初始化一次,不建议在框架中再次初始化。 (例如 Link 1 ),Link 2 , Link 3 )
有没有人有针对这种要求的可行解决方案?
编辑 1(从我需要从中获取错误的框架中添加更多代码)
public final class MyAppSession {
public fileprivate(set) var isValid: Bool = false
let itemKey = MyAppSession.MyAppKeychainAccount
let keychainAccessGroupName = MyAppConfigured?.keyChainGroup
/**
Attempts to restore a locally stored session.
*/
public static func savedSession() -> MyAppSession? {
do {
let itemKey = MyAppSession.MyAppKeychainAccount
let keychainAccessGroupName = MyAppConfigured?.keyChainGroup
let queryLoad: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
kSecReturnData as String: kCFBooleanTrue,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecAttrAccessGroup as String: keychainAccessGroupName as AnyObject
]
var result: AnyObject?
let resultCodeLoad = withUnsafeMutablePointer(to: &result) {
SecItemCopyMatching(queryLoad as CFDictionary, UnsafeMutablePointer($0))
}
if resultCodeLoad == noErr {
if let result = result as? Data {
if let arrayFromData = NSKeyedUnarchiver.unarchiveObject(with: result) as? NSDictionary {
// Found successfully
return MyAppSession(accessToken: (arrayFromData["accessToken"] as? String)!, refreshToken: (arrayFromData["refreshToken"] as? String)!)
}
}
} else {
MyApp.log("No Keychain elements present.", logLevel: .verbose)
MyAppLogger.sendLogs(message: "Logger Test. No Keychain elements present.")
}
let keychainData = try Locksmith.loadDataForUserAccount(userAccount: MyAppSession.MyAppKeychainAccount)
if let accessToken = keychainData?[MyAppSession.accessTokenKeychainKey] as? String,
let refreshToken = keychainData?[MyAppSession.refreshTokenKeychainKey] as? String {
MyApp.log("Restored saved session.", logLevel: .verbose)
return MyAppSession(accessToken: accessToken, refreshToken: refreshToken)
}
else {
return nil
}
}
catch {
return nil
}
}
init?(accessToken: String, refreshToken: String) {
// Save credentials to the keychain.
do {
try Locksmith.updateData(
data: [MyAppSession.accessTokenKeychainKey: accessToken as AnyObject, MyAppSession.refreshTokenKeychainKey: refreshToken as AnyObject],
forUserAccount: MyAppSession.MyAppKeychainAccount)
if let configuration = MyAppConfigured {
if configuration.keyChainGroup == "" {
let valueData = [MyAppSession.accessTokenKeychainKey: accessToken as AnyObject, MyAppSession.refreshTokenKeychainKey: refreshToken as AnyObject]
let data = NSKeyedArchiver.archivedData(withRootObject: valueData)
let queryAdd: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
kSecValueData as String: data as AnyObject,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
]
let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)
if resultCode != noErr {
MyApp.log("Keychain groupname empty: \(resultCode)", logLevel: .verbose)
}
else {
MyApp.log("KeyChain Saving Success", logLevel: .verbose)
}
}
else {
let valueData = [MyAppSession.accessTokenKeychainKey: accessToken as AnyObject, MyAppSession.refreshTokenKeychainKey: refreshToken as AnyObject]
let data = NSKeyedArchiver.archivedData(withRootObject: valueData)
let queryAdd: [String: AnyObject] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: itemKey as AnyObject,
kSecValueData as String: data as AnyObject,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked,
kSecAttrAccessGroup as String: keychainAccessGroupName as AnyObject
]
let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)
if resultCode != noErr {
MyApp.log("Error saving to Keychain: \(resultCode)", logLevel: .verbose)
}
else {
MyApp.log("KeyChain Saving Success", logLevel: .verbose)
}
}
}
isValid = true
MyApp.log("Created new session.")
}
catch {
return nil
}
}
}
最佳答案
一种选择是将错误的日志记录委托(delegate)给您的应用程序。这使它更加灵活。
例如:
protocol MyFrameworkErrorHandlingDelegate: AnyObject {
func didReceiveError(_ error: Error)
}
extension MyFrameworkErrorHandlingDelegate {
func didReceiveError(_ error: Error) {
Crashlytics.sharedInstance().recordError(error)
}
}
protocol MyFrameworkErrorHandlingDelegate: AnyObject {
func didReceiveError(_ error: Error)
}
class MyAppLogger {
static var delegate: MyFrameworkErrorHandlingDelegate?
static func log(_ error: Error) {
delegate?.didReceiveError(error)
}
}
class AppDelegate: UIApplicationDelegate, MyFrameworkErrorHandlingDelegate
MyAppLogger.delegate = self
关于iOS swift : Send log information to iOS app from iOS framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592948/
Win32 的 Delphi XE5 编译器具有新的调试信息设置:有限调试信息。 有限调试信息和调试信息有什么区别? 最佳答案 某些编译器提供调试标志的变体,可提供不同级别的调试信息和优化。根据编译和
我有一个 highcharts 散点图,我想添加一些自定义功能。对于每次单击 highcharts 中的项目(单击过滤器、数据点和关闭按钮),我想将有关单击的项目的信息发送到我在下面包含的函数“s”。
我们在 Java 应用程序中更新了安全证书,突然我们开始收到下面提到的异常: java.lang.SecurityException: class "org.hibernate.cfg.Configu
我正在使用 HttpURLConnection 实例来连接到 URL。 然后我调用 getResponseCode 方法以确定连接状态。 我正在使用此方法轮询连接,直到返回的响应代码不是 1xx: H
我很难调试 ASP.NET MVC 代码。我最终按照本 website 中的描述进行操作.调试符号已加载并适用于所有 dll,但 System.Web.MVC。当我双击 stacktrace 窗口中的
好吧,我在很多应用程序上都发现了这个文本,那就是当我安装一些应用程序时需要android.permission.READ_LOGS 权限,它们显示一些文本,例如“读取敏感日志数据的权限...”我不明白
我有一个在浏览器中运行并从 Javascript 调用的小程序。有 2 个类:PortalLauncher 和 ParamSplitter,它们位于默认包中。 Javascript 调用 Portal
我在 eclipse 中使用 OSGi 项目运行 JUnit 测试,我遇到了这个异常: java.lang.SecurityException: class "org.eclipse.core.run
我正在开发一个给 PDF 加水印的小工具,它适用于某些 PDF,但对某些其他 PDF 会崩溃。 我正在使用 iText 库和 bouncycaSTLe(依赖项) pom.xml:
很抱歉,我不知道这是否是属于mathoverflow的数学问题,还是属于这里的计算机科学问题。 就是说,我相信我理解基本的difference between data, information, a
在什么情况下“反文档频率”在信息检索中不起作用? 最佳答案 如果您不希望在系统中权衡稀有术语而不是频繁出现的术语,则可能不希望使用IDF。此外,计算idf是一项昂贵的操作。从以下事实可以明显看出这一点
我正在尝试计算 Average Precision (和 Mean Average Precision )在 Oxford Building image dataset 上. 下面是他们提供的用于计算
信息隐藏如何帮助解耦构成系统的模块? 最佳答案 封装(信息隐藏)允许您只向外界公开绝对最小值。这意味着您可以在不影响客户的情况下将未公开的位更改为您心中的内容。 一个例子。假设您已经实现了一个将字符串
想象一下,在接下来的 10 年里,你拥有世界上所有的 super 计算机。你的任务是尽可能无损地压缩 10 部完整的电影。另一个标准是普通计算机应该能够即时解压缩,并且不需要花费太多的 HD 来安装解
我生活在一个每年更改两次时间的国家。即:一年中有一段时期与 UTC 的偏移量为 -3 小时(-180 分钟),其他时期的偏移量为 -4 小时(-240 分钟) 从图形上看: |-----
在哪里可以找到有关 DrRacket 中 #:when 构造的文档? 这是完整的示例: (define (problem_9 sum) (for*/first ([c (in-range 3 (-
有人知道在网站上查找最相关的联系信息的脚本/食谱/库吗? 一些可能的情况: 在个人网页上查找联系电话号码 在博客上查找所有者电子邮件地址 查找联系页面的网址 最佳答案 查看WSO2's Mashup
你们如何管理信息溢出?你们都用什么工具?有用的工具之一是 RSS 提要阅读器。是否有任何机构使用任何其他工具或任何其他方式来有效管理信息? 最佳答案 做一个信息势利小人。 如果该博客没有绝对震撼您的世
我最近根据 Artima Inside the JVM 2-nd Ed 阅读了有关 JVM 规范的内容。其中一章提到了 Java 运行时中的类型存储,内容如下: An instance of clas
我已阅读 Permuterm indexes stanford 网站上的页面,但是我仍然无法弄清楚我们如何从以下地址到达:*X*至 X* . 那么$在哪里? ? 我可以得到这些: For X, loo
我是一名优秀的程序员,十分优秀!