gpt4 book ai didi

iOS swift : Send log information to iOS app from iOS framework

转载 作者:行者123 更新时间:2023-12-01 18:36:05 25 4
gpt4 key购买 nike

我正在尝试找出如何将日志信息从我的 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)
}
}

这种方法的问题是决定在哪里使用它或在哪里分配委托(delegate),这取决于您的框架做什么以及您的应用程序如何使用框架。

编辑:

免责声明:这不会是最有效的方法,但它会是最直接的。
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

稍后在您的 AppDelegate 中
MyAppLogger.delegate = self

关于iOS swift : Send log information to iOS app from iOS framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com