在模拟器中测试跨应用程序组的 NSUserDefaults 同步

Testing NSUserDefaults synchronization across app groups in Simulator

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

在我的主要应用程序的其中一个 ViewController 中,我添加了以下内容:

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")
    }

当我 运行 模拟器中的应用程序时,我可以在控制台中看到正在同步。当我 运行 模拟器中的扩展程序时,我可以在控制台中看到它正在尝试同步(但失败了,因为该应用程序未 运行ning,所以没有要同步的内容)。每当我尝试在模拟器中同时 运行 两个目标时,我都会遇到 iMessage 扩展的崩溃:

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

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

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

经过反复试验并重新阅读其他教程后,我明白了。 AppCoda tutorial 最终成为我在开始工作之前阅读的最后一本书。

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

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

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

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

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

if let extMovies = defaults.stringArrayForKey("extensionMovies") {
    print("extMovies is \(extMovies)")
} else {
    print("no extMovies to be found here")
}

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