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

时间:2017-02-18 08:36:36

标签: ios swift xcode

对于主应用,我可以使用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")

但是每次新的瞬间都会被删除。寻找一个迅速的解决方案。

1 个答案:

答案 0 :(得分:2)

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

  1. 在项目导航器中选择项目
  2. 选择主应用目标并转到功能选项卡
  3. 开启“应用群组”
  4. 创建一个以“group。”开头的新容器,因此请为其命名为“group.foo.bar”。
  5. 选择您的键盘扩展程序目标,然后再次启用应用程序组。不要创建新容器,而是选择创建的容器(group.foo.bar)以表示Keyboard Extension是容器的成员。
  6. 这是你写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已保存到磁盘而未存储在实例中!