containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上提供不同的结果

Lom*_*baX 7 iphone ios ios-simulator apple-watch watchkit

我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOS Target,Watchkit App Target和Watchkit App Extension Target添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOS App和WatchKit Extension访问共享文件夹URL:

延期:

@implementation ExtensionDelegate

- (void)applicationDidFinishLaunching {
    // Perform any final initialization of your application.
    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
}
Run Code Online (Sandbox Code Playgroud)

iOS应用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
// ... 
}
Run Code Online (Sandbox Code Playgroud)

但是,testNSURL是不同的:

在iOS上:

文件:///用户/ Lombardo的/库/开发商/ CoreSimulator /设备/ 38B983DB-342F-4A47-8C26-5D2C92CDB666 /数据/容器/共享/ AppGroup/8DEE182E-AFE6-47DD-BA2B-6B0520158A8B /

观看:

文件:///用户/ Lombardo的/库/开发商/ CoreSimulator /设备/ BF52D613-25FF-4092-A5B2-9C3F1B616160 /数据/容器/共享/ AppGroup/CECB5EFC-7FBD-4C84-A878-1314CB7CF211 /

因此我无法在iOS App和WatchKit Extension之间共享数据.

因为我的Apple Watch上没有WatchOS 2.0,所以我可以尝试使用真正的设备.有什么建议?谢谢

更新 我做了一些其他的测试:

  • 安装了WatchOS 2后,问题仍然存在于真实设备上.

这是我iPhone的商店网址:

NSURL*@"file:///private/var/mobile/Containers/Shared/AppGroup/3D05D159-94D6-409C-9A38-90E0830D0C3F/FiveMinutes.sqlite"

这是我的手表的商店网址:

NSURL*@"file:///private/var/mobile/Containers/Shared/AppGroup/F1E89377-F456-4FC2-BAAC-3DD705EF381A/FiveMinutes.sqlite"

这两个应用程序从两个不同的.sqlite文件读取和写入.

  • 在模拟器上,如果我对其中一个URL进行硬编码,iOS模拟器和Watch模拟器都能够读写相同的.sqlite文件并共享内容.但是,这在实际设备上是不可能的,因为Watch扩展无法写入iOS路径:

URL:file:///private/var/mobile/Containers/Shared/AppGroup/3D05D159-94D6-409C-9A38-90E0830D0C3F/FiveMinutes.sqlite options:(null)...返回错误错误Domain = NSCocoaErrorDomain Code = 512"该文件无法保存." UserInfo = {reason =创建文件失败; user =fo字典的代码= 2} {reason ="创建文件失败;代码= 2"; }

Lom*_*baX 12

好的,我想我找到了答案.我记得,随着向Watch OS 2的过渡,扩展代码现在直接在Apple Watch上执行,而在配对的iPhone上则不再.所以很明显这两个设备不共享相同的存储空间.

我做的第一件事是创建一个新项目,从一个基础iOS项目开始,然后添加一个Watch OS 1(旧版本)App Target.在这种情况下,目录是相同的,他们可以沟通:

监视路径:file:/// Users/Lombardo/Library/Developer/CoreSimulator/Devices/BF52D613-25FF-4092-A5B2-9C3F1B616160/data/Containers/Shared/AppGroup/30B39103-CEEB-4C64-9531-FB27DC40180D /

iOS路径文件:///用户/ Lombardo/Library/Developer/CoreSimulator/Devices/BF52D613-25FF-4092-A5B2-9C3F1B616160/data/Containers/Shared/AppGroup/30B39103-CEEB-4C64-9531-FB27DC40180D /

然后,我做了每个程序员应该做的第一件事:阅读文档.在WatchOS 2过渡指南的第一页中有这样一句话:

您的扩展程序现在可以在Apple Watch上存储文件和数据.任何不属于Watch应用程序或WatchKit扩展程序包的数据都必须从网络或用户iPhone上运行的配套iOS应用程序中获取.您不能依赖共享组容器与iOS应用程序交换文件.获取文件涉及将它们无线传输到Apple Watch.