我已为我的应用及其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)
。
感谢任何帮助。我还能如何测试同步代码?
答案 0 :(得分:0)
经过大量的试验和错误并重新阅读其他教程后,我明白了。这AppCoda tutorial最终成为我在工作之前读到的最后一件事。
在我的主应用程序中,我声明了一个全局变量:
_vars.scss
然后,在我想要分享的值得到更新的(主应用程序的)功能中,我使用了:
var defaults = NSUserDefaults(suiteName: "group.com.myOrg.myApp")
在扩展视图控制器中,我再次声明了全局默认值变量,并在viewDidLoad()中使用了它:
defaults?.setObject(movieTitles, forKey: "movieTitles")
defaults?.synchronize()
要测试,我首先运行应用扩展程序,然后运行主应用程序。在Simulator中切换回扩展名有时会导致崩溃,但如果我重新运行该架构,我会看到我的共享变量打印到控制台。