我想创建一个与我的iOS应用每次启动相关联的唯一标识符。我正在考虑做类似的事情:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var window: UIWindow?
var uuid: String?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return true
}
func applicationDidBecomeActive(_ application: UIApplication) {
self.uuid = UUID().uuidString
}
然后每当我想在我的应用程序中使用它时,我会这样做:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
AppDelegate.uuid
}
}
除了App Delegate之外,是否有更好的地方放置此会话uuid?
答案 0 :(得分:1)
你不应该使用AppDelegate作为保存属性等的东西。你也应该尽可能地避免单身。
这种东西有2个不错的选择:
1:Use iOS Keychain,这是相当高级的,但是在GitHub上有许多好的包装器和MIT-License。我还没有检查过任何一个Swift。
2:简单的方法,使用NSUserDefault
UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
<强>旁注:强>
请记住在AppDelegate方法中每次启动应用程序时清除/删除密钥。如果要清除UUID。或者你可以简单地覆盖它而不用清理它。
另外,正如下面@DaveWeston的评论中提到的,如果你要反复多次访问这个密钥,最好将它保存在内存中,但仅为此目的创建一个单例,并不干净按照我的口味,如果你已经有人使用它。
更新:关于NSUserDefaults的内存和不良做法的评论。
让我们转到Apple Documentation并阅读它所说的内容:
在运行时,您使用NSUserDefaults对象来读取默认值 您的应用程序使用用户的默认数据库。的 NSUserDefaults的 缓存信息以避免必须打开用户的默认值 数据库每次需要默认值。 synchronize()方法, 它会定期自动调用,会保留 内存缓存与用户的默认数据库同步。
此外,NSUserDefaults实际上是一个单身人士。
答案 1 :(得分:0)
如果你真的在寻找一个非持久化的解决方案,那个应用程序每次迭代的解决方案都不同,我可能会选择UUID
(或String
)上的类别:
extension UUID {
public static let sessionUUID : String = UUID().description
}
将其用作UUID.sessionUUID