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

时间:2015-09-23 09:58:31

标签: ios swift2 ios-extensions ios-app-group

我正在尝试将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之间有一些主要的区别?我知道app之间只有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根本没有出现在扩展名中。

2 个答案:

答案 0 :(得分:0)

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

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

我可以使用" identityCode"作为关键。

答案 1 :(得分:0)

CThere可能有几件事! 第一;你是否允许容器应用程序和扩展程序的“功能”下的钥匙串共享,你是否将钥匙串组设置为同一组?

我建议使用此:https://github.com/kefbytes/KeychainWrapper 下载它,非常简单,只需将swift文件添加到项目中

允许在cabailities下共享钥匙串, 像这样设置你的serviceName和accesgroup

  

KeychainWrapper.serviceName =“在这里给它起个名字”

(servicename是必要的,它可以工作)

  

KeychainWrapper.accessGroup =“在此处写下您的访问组名称”

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

将值保存到像这样的键

  

KeychainWrapper.setString(“2”,forKey:“identityCode”

并使用

进行检索
  

KeychainWrapper.stringForKey( “identityCode”)