在Simulator中测试跨应用程序组的NSUserDefaults同步

时间:2016-12-21 16:26:47

标签: ios swift ios-simulator xcode8

我已为我的应用及其iMessage扩展程序启用了App Groups,因此我可以在两者之间共享数据。我在两个代码库中实现了NSUserDefaults同步。但是,我还没有找到一种测试同步的好方法。

在我的主应用程序的一个ViewControllers中,我添加了这个:

var defaults = NSUserDefaults(suiteName: "group.com.myAppGroup")
                defaults?.setObject(movieTitles, forKey: "movieTitles")
                defaults?.synchronize()
                print("synchronizing movieTitles as \(movieTitles)")

在iMessage扩展程序中,我添加了这个:

var defaults = NSUserDefaults(suiteName: "group.com.myAppGroup")
    defaults?.synchronize()

    // Check for null value before setting
    if let movieTitles = defaults!.stringForKey("movieTitles") {
        print("synchronized movieTitles from \(movieTitles)")
    }
    else {
        print("Cannot synchronize movieTitles")
    }

当我在Simulator中运行应用程序时,我可以在控制台中看到正在进行同步。当我在模拟器中运行扩展程序时,我可以在控制台中看到它正在尝试同步(并且失败,因为应用程序没有运行,因此无法同步)。每当我尝试在Simulator中同时运行两个目标时,我就会因iMessage扩展而崩溃:

libsystem_kernel.dylib`mach_msg_trap:
    0x109d2b380 <+0>:  movq   %rcx, %r10
    0x109d2b383 <+3>:  movl   $0x100001f, %eax          ; imm = 0x100001F 
    0x109d2b388 <+8>:  syscall 
->  0x109d2b38a <+10>: retq   
    0x109d2b38b <+11>: nop  

我在调试方面不够精通,不知道这意味着什么。控制台也在最后一行显示(lldb)

感谢任何帮助。我还能如何测试同步代码?

1 个答案:

答案 0 :(得分:0)

经过大量的试验和错误并重新阅读其他教程后,我明白了。这AppCoda tutorial最终成为我在工作之前读到的最后一件事。

在我的主应用程序中,我声明了一个全局变量:

_vars.scss

然后,在我想要分享的值得到更新的(主应用程序的)功能中,我使用了:

var defaults = NSUserDefaults(suiteName: "group.com.myOrg.myApp")

在扩展视图控制器中,我再次声明了全局默认值变量,并在viewDidLoad()中使用了它:

defaults?.setObject(movieTitles, forKey: "movieTitles")
defaults?.synchronize()

要测试,我首先运行应用扩展程序,然后运行主应用程序。在Simulator中切换回扩展名有时会导致崩溃,但如果我重新运行该架构,我会看到我的共享变量打印到控制台。