iOS 9 通过 NSUserDefaults 在 AppGroup 之间共享数据
iOS 9 ShareData between AppGroup through NSUserDefaults
我正在尝试将 TodayExtension 添加到我现有的应用程序中,我希望该应用程序和扩展程序将通过 NSUserDefaults 共享数据。
根据本教程http://www.glimsoft.com/06/28/ios-8-today-extension-tutorial/
我确实喜欢它说:
- 使用 Today 扩展创建新目标
- 在扩展和应用程序中添加新的应用程序组
- 向应用添加代码
- 向扩展添加代码
应用代码
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")
我正在尝试将 TodayExtension 添加到我现有的应用程序中,我希望该应用程序和扩展程序将通过 NSUserDefaults 共享数据。 根据本教程http://www.glimsoft.com/06/28/ios-8-today-extension-tutorial/ 我确实喜欢它说:
- 使用 Today 扩展创建新目标
- 在扩展和应用程序中添加新的应用程序组
- 向应用添加代码
- 向扩展添加代码
应用代码
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")