为什么NSUserDefaults在我的应用程序&之间无法正常工作共享扩展名? [英] Why doesn't NSUserDefaults work between my app & share extension?

查看:108
本文介绍了为什么NSUserDefaults在我的应用程序&之间无法正常工作共享扩展名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有共享扩展程序的iOS应用.我试图使用NSUserDefaults和App Group在它们之间共享数据,但是,尽管我可以写入NSUD对象,对其进行读取和synchronize()且没有错误,但读取扩展名始终会导致nil.

I have an iOS app with a share extension. I am trying to share data between them using NSUserDefaults and App Groups but, while I can write into the NSUD object, read it, and synchronize() without error, reading in the extension always results in nil.

我有一个应用程序组,即文字字符串"group.net.foo.bar",对于该应用程序&扩展已在功能->应用组下配置.此字符串在我的应用程序的常量结构中:

I have an app group, the literal string "group.net.foo.bar" for which both the app & extension have configured under Capabilities -> App Groups. This string is in a constants struct in my app:

struct Forum {
    static let APP_GROUP = "group.net.foo.bar"
    static let AUTH_KEY = "AUTH_KEY"
}

在主应用中,我创建一个UserDefaults对象并写入该对象:

In the main app I create a UserDefaults object and write to it:

fileprivate lazy var userDefaults: UserDefaults = {
    let defaults = UserDefaults()
    defaults.addSuite(named: Forum.APP_GROUP)
    return defaults
}()

// later
userDefaults.set(apiKey, forKey: Forum.AUTH_KEY)
userDefaults.synchronize()

synchronize()之后创建一个新的NSUD对象,并检索AUTH_KEY.在扩展中,我创建了一个NSUD并尝试检索该值,但无济于事:

Creating a new NSUD object after that synchronize() and retrieving the AUTH_KEY works. In the extension, I create an NSUD and try to retrieve the value, to no avail:

private lazy var userDefaults: UserDefaults = {
    let defaults = UserDefaults()
    defaults.addSuite(named: Forum.APP_GROUP)
    return defaults
}()

// later
private func getApiKey() -> String? {
    return userDefaults.string(forKey: Forum.AUTH_KEY)
}
// returns nil

在阅读Apple文档以及在Stack Overflow上令人沮丧的类似问题时,我无法理解我做错了什么.

In all of my reading of the Apple docs and depressingly-similar questions here on Stack Overflow I can't divine what I've done incorrectly.

Xcode 8.0版(8A218a),也已通过Xcode 8.1 Beta 2进行了测试.在模拟器上以及与运行iOS 10的iPhone 6s上的行为相同.

Xcode Version 8.0 (8A218a), also tested with Xcode 8.1 Beta 2. Same behavior on simulator andy my iPhone 6s running iOS 10.

推荐答案

不确定defaults.addSuite(named: ...)是否与UserDefaults(suiteName: ...)相同.在我的应用程序中,我以这种方式使用appGroups,并且可以按预期工作:

Not sure if defaults.addSuite(named: ...) does the same as UserDefaults(suiteName: ...). In my app I use appGroups this way and it works as expected:

// write
if let userDefaults = UserDefaults(suiteName: appGroupName) {
    userDefaults.set("---" as AnyObject, forKey: "distance")
    userDefaults.set("---" as AnyObject, forKey: "altitude")
    ...
    userDefaults.synchronize()
}

// read
if let userDefaults = UserDefaults(suiteName: appGroupName) {
    self.distanceLabel.text = userDefaults.string(forKey: "distance")
    self.altitudeLabel.text = userDefaults.string(forKey: "altitude")
}

这篇关于为什么NSUserDefaults在我的应用程序&之间无法正常工作共享扩展名?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆