iOS 9 通过 NSUserDefaults 在 AppGroup 之间共享数据

iOS 9 ShareData between AppGroup through NSUserDefaults

我正在尝试将 TodayExtension 添加到我现有的应用程序中,我希望该应用程序和扩展程序将通过 NSUserDefaults 共享数据。 根据本教程http://www.glimsoft.com/06/28/ios-8-today-extension-tutorial/ 我确实喜欢它说:

应用代码

func updateExtensionData() {
    let key = "identityCode"
    let valueForStore:Float = 2.0
    let extensiontDefaults = NSUserDefaults(suiteName: "group.company.mineSharedDefaults")
    extensiontDefaults?.setFloat(valueForStore, forKey: key)
    let results = extensiontDefaults?.synchronize()
    let checkCode = extensiontDefaults?.objectForKey(key)
    print("code for save \(valueForStore) synchronize result \(results) readed code \(checkCode!)")
}

分机号

private func updateData() {
    let key = "identityCode"
    let extensionDefaults = NSUserDefaults(suiteName: "group.company.mineSharedDefaults")
    let checkCode = extensionDefaults?.floatForKey(key)
    print("synchronize result \(resut) readed code \(checkCode!)")
}

问题

我的问题是扩展总是读取 0 而不是 2。显然我遗漏了什么。在 AppGroup 和 NSUserDefaults 的情况下,iOS8 和 9 之间有一些主要区别吗?我知道应用程序和 watchOS2 之间只有一个。

为了更清楚,这是来自 App 和 Extension NSUserDefaults 的密钥

应用程序密钥

AppleKeyboards

AppleKeyboardsExpanded

AddingEmojiKeybordHandled

AppleLanguages

ApplePasscodeKeyboards

PreferredLanguages

AppleLocale

NSInterfaceStyle

MSVLoggingMasterSwitchEnabledKey

NSLanguages

AppleITunesStoreItemKinds

identityCode

AppleLanguagesDidMigrate

PKEnableStockholmSettings

扩展密钥

AppleKeyboards

AppleKeyboardsExpanded

AddingEmojiKeybordHandled

AppleLanguages

ApplePasscodeKeyboards

PreferredLanguages

AppleLocale

NSInterfaceStyle

MSVLoggingMasterSwitchEnabledKey

NSLanguages

AppleITunesStoreItemKinds

AppleLanguagesDidMigrate

PKEnableStockholmSettings

很明显密钥 identityCode 根本没有出现在扩展中。

好的,我不确定有什么帮助,但我做了两件事:

  • 重命名当前 AppGroup 标识符并使​​用名称 group.my.entire.bundle.id.of.my.app.sharedData 而不是 group.appname.sharedData
  • 创建新标识符
  • 删除并创建新的 AppGroup 标识符

我可以使用 "identityCode" 作为密钥。

C可能有几件事! 第一的;您是否允许容器应用程序和扩展程序在 "Capabilities" 下共享钥匙串,您是否将钥匙串组设置为同一组?

我推荐使用这个:https://github.com/kefbytes/KeychainWrapper 下载吧,很简单,只需要将swiftfile添加到你的项目中

允许在功能下共享钥匙串, 像这样设置您的服务名称和访问组

KeychainWrapper.serviceName = "give it a name in here"

(服务名是它工作所必需的)

KeychainWrapper.accessGroup = "write your accessgroup name here"

(accesgroup 是可选的,因为您是在 Capabilities 下设置的)

像这样将值保存到键

KeychainWrapper.setString("2", forKey: "identityCode"

并使用

检索

KeychainWrapper.stringForKey("identityCode")