gpt4 book ai didi

ios - 在 Swift 中,我如何将永久变量从主 iOS 应用程序传递到扩展程序(例如今天的扩展程序、自定义键盘)

转载 作者:行者123 更新时间:2023-11-28 12:29:50 24 4
gpt4 key购买 nike

对于主应用,我可以使用 UserDefaults.standard 永久存储 key

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")

但这在每个新的实例中都会被删除。寻找 swift 3 解决方案。

最佳答案

以下是在两个应用程序之间设置和读取 UserDefaults 的方法:

  1. 在项目导航器中选择您的项目
  2. 选择主要应用目标并转到功能选项卡
  3. 开启“应用组”
  4. 创建一个以“group.”开头的新容器,因此将其命名为“group.foo.bar”。
  5. 选择您的键盘扩展目标并再次打开应用程序组。不要创建新容器,而是选择创建的容器 (group.foo.bar) 以表示键盘扩展是容器的成员。

这就是您写入 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)")

基本上,这允许属于该组的应用程序访问相同的 UserDefaultsUserDefaults 即使在包含的应用程序被删除后也不会被销毁。 UserDefaults 始终保存到磁盘,因此它永远不会被销毁。当您使用应用共享时,组内的应用实际上正在访问相同的UserDefaults。这就是为什么有一个 synchronize 函数,它将 UserDefaults 保存到磁盘,也是它不安全的原因,任何可以看到底层文件系统的人都可以查看它的内容。

您的扩展程序还可以“查看”UserDefaults。它只是无法访问它。创建组 ID 会告诉 iOS 您的扩展程序(甚至应用程序)已获得访问它的授权,因此它可以从中读取数据和向其中写入数据。

您的应用不需要在前台访问 UserDefaults,因为它已经保存在磁盘上了!

请记住,UserDefaults 保存到磁盘而不是存储在实例中!

关于ios - 在 Swift 中,我如何将永久变量从主 iOS 应用程序传递到扩展程序(例如今天的扩展程序、自定义键盘),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42312974/

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