在iOS 8共享扩展程序和主应用程序之间共享数据

Ogu*_*ner 63 swift xcode6 ios8 ios-app-extension

最近,我一直在制作一个简单的iOS 8共享扩展来了解系统的工作原理.正如Apple在其App Extension编程指南中所述:

默认情况下,您的应用及其扩展程序无法直接访问彼此的容器.

这意味着扩展程序和包含应用程序不共享数据.但在同一页面上,Apple带来了一个解决方案:

如果您希望包含应用及其扩展能够共享数据,请使用Xcode或Developer门户为应用及其扩展启用应用组.接下来,在门户中注册应用程序组,并指定要在包含的应用程序中使用的应用程序组.

然后,可以使用NSUserDefaults在包含应用程序和扩展程序之间共享数据.这正是我想做的.但由于某种原因,它不起作用.

在同一页面中,Apple建议使用标准默认值:

var defaults = NSUserDefaults.standardUserDefaults()
Run Code Online (Sandbox Code Playgroud)

在WWDC演示文稿(217)中,他们提出了一个共同的方案:

var defaults = NSUserDefaults(suiteName: kDefaultsPackage)
Run Code Online (Sandbox Code Playgroud)

此外,我为包含应用目标和扩展目标的应用组启用了相同的应用组名称: XCode目标功能,应用程序组

但所有这些设置都是无用的.我无法从扩展程序中检索存储在包含应用程序中的数据.就好像两个目标正在使用完全不同的NSUserDefaults存储.

所以,

  1. 这种方法有解决方案吗?
  2. 如何在包含应用和共享扩展之间共享简单数据?数据只是API的用户凭据.

foo*_*gry 47

你应该像这样使用NSUserDefaults:

保存数据:

objc

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
[shared setObject:object forKey:@"yourkey"];
[shared synchronize];
Run Code Online (Sandbox Code Playgroud)

迅速

let defaults = UserDefaults(suiteName: "group.yourgroup")
defaults?.set(5.9, forKey: "yourKey")
Run Code Online (Sandbox Code Playgroud)

读取数据:

objc

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.yougroup"];
id value = [shared valueForKey:@"yourkey"];
NSLog(@"%@",value);
Run Code Online (Sandbox Code Playgroud)

迅速

let defaults = UserDefaults(suiteName: "group.yourgroup")
let x = defaults?.double(forKey: "yourKey")
print(x)
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作!

  • 请问快速语言请使用或至少添加快速语言更新您的帖子 (11认同)
  • 很高兴看到客观c沿着快速.它有助于理解差异.考虑到ObjC的代码示例,并且目前没有很多swift很好理解如何转换它. (4认同)

Cha*_*man 13

我是这样做的:

  1. 打开主应用程序目标>功能>应用程序组设置为打开
  2. 添加一个新的应用程序组并确保它已被勾选(例如group.com.seligmanventures.LightAlarmFree)
  3. 打开监视目标(具有"功能"选项卡的目标)>"应用程序组"设置为"打开"
  4. 添加一个新的应用程序组并确保它已被勾选(例如group.com.seligmanventures.LightAlarmFree - 但必须与上面的组名称相同)
  5. 将数据保存到组中,如下所示:

    var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree")
    defaults?.setObject("It worked!", forKey: "alarmTime")
    defaults?.synchronize()
    
    Run Code Online (Sandbox Code Playgroud)
  6. 从组中检索数据,如下所示:

    var defaults = NSUserDefaults(suiteName: "group.com.seligmanventures.LightAlarmFree") 
    defaults?.synchronize()
    
    // Check for null value before setting
    if let restoredValue = defaults!.stringForKey("alarmTime") {
        myLabel.setText(restoredValue)
    }
    else {
        myLabel.setText("Cannot find value")
    }
    
    Run Code Online (Sandbox Code Playgroud)


Ogu*_*ner 5

因此,显然只有在将组名用作NSUserDefaults 的套件名称时,它才有效。

该文档说NSUserDefaults.standartUserDefaults()也应该起作用,但不能起作用,这可能是一个错误。


小智 5

如果你有

group.yourappgroup
Run Code Online (Sandbox Code Playgroud)

使用

var defaults = NSUserDefaults(suiteName: "yourappgroup")
Run Code Online (Sandbox Code Playgroud)

这适合我