对于主应用,我可以使用UserDefaults.standard
在appDelegate
我有:
let defaults = UserDefaults.standard
let defaultValue = ["userUID" : ""]
defaults.register(defaults: defaultValue)
然后,当用户注册时我有:
let defaults = UserDefaults.standard
defaults.set(user!.uid, forKey: "userUID")
defaults.synchronize()
当我想阅读它时,它是完美的。但是,我并不确定如何通过这个" userUID"注册到自定义键盘扩展程序后,将其永久保存在那里。
我知道我可以使用应用程序组传递数据,并且:
let defaultsToKeyboard = UserDefaults.init(suiteName: "group.com.app")
但是每次新的瞬间都会被删除。寻找一个迅速的解决方案。
答案 0 :(得分:2)
以下是在两个应用之间设置和阅读UserDefaults
的方法:
这是你写UserDefaults
:
let defaults = UserDefaults(suiteName: "group.foo.bar") //replace suiteName with your container name
let defaultValue = ["userUID" : ""]
defaults!.register(defaults: defaultValue)
defaults!.set("a", forKey: "userUID")
defaults!.synchronize()
如何从键盘扩展程序中读取:
let defaultsToKeyboard = UserDefaults(suiteName: "group.foo.bar") //replace suiteName with your container name
let uid = defaultsToKeyboard?.object(forKey: "userUID")
print("\(uid)")
基本上,这允许属于该组的应用程序访问相同的UserDefaults
。即使删除了包含应用后,UserDefaults
也不会被销毁。 UserDefaults
始终保存到磁盘,因此永远不会被销毁。当您使用应用分享时,您在群组中的应用实际上正在访问相同的UserDefaults
。这就是为什么有一个synchronize
函数,它将UserDefaults
保存到磁盘以及为什么它不安全,任何可以看到底层文件系统的人都可以查看其内容。
您的扩展程序也可以“看到”UserDefaults
。它只是无法访问它。创建组ID告诉iOS您的扩展(甚至应用程序)有权访问它,因此它可以读取和写入数据。
您的应用无需位于前台即可访问UserDefaults
,因为它已保存在磁盘上!
请记住UserDefaults
已保存到磁盘而未存储在实例中!