Ios containerURLForSecurityApplicationGroupIdentifier:在iPhone和手表模拟器上给出不同的结果

Ios containerURLForSecurityApplicationGroupIdentifier:在iPhone和手表模拟器上给出不同的结果,ios,iphone,ios-simulator,watchkit,apple-watch,Ios,Iphone,Ios Simulator,Watchkit,Apple Watch,我用默认的XCode模板创建了一个WatchKit应用程序。 我将应用程序组权限添加到iOS目标、Watchkit应用程序目标和Watchkit应用程序扩展目标。(这是应用程序组名称:group.com.lombax.fiveminutes) 然后,我尝试使用iOS应用程序和WatchKit扩展访问共享文件夹URL: @implementation ExtensionDelegate - (void)applicationDidFinishLaunching { // Perform

我用默认的XCode模板创建了一个WatchKit应用程序。 我将应用程序组权限添加到iOS目标、Watchkit应用程序目标和Watchkit应用程序扩展目标。(这是应用程序组名称:group.com.lombax.fiveminutes) 然后,我尝试使用iOS应用程序和WatchKit扩展访问共享文件夹URL:

@implementation ExtensionDelegate

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

@implementation ExtensionDelegate

- (void)applicationDidFinishLaunching {
    // Perform any final initialization of your application.
    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
}
iOS应用程序:

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

    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
// ... 
}
但是,
测试
NSURL不同:

在iOS上:

file:///Users/Lombardo/Library/Developer/CoreSimulator/Devices/38B983DB-342F-4A47-8C26-5D2C92CDB666/data/Containers/Shared/AppGroup/8DEE182E-AFE6-47DD-BA2B-6B0520158A8B/

值班:

file:///Users/Lombardo/Library/Developer/CoreSimulator/Devices/BF52D613-25FF-4092-A5B2-9C3F1B616160/data/Containers/Shared/AppGroup/CECB5EFC-7FBD-4C84-A878-1314CB7CF211/

因此,我无法在iOS应用程序和WatchKit扩展之间共享数据

因为我的Apple Watch上没有WatchOS 2.0,所以我不能在真正的设备上试用。 有什么建议吗? 谢谢

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

  • 安装了WatchOS 2后,该问题在实际设备上仍然存在
这是我的iPhone的商店url:

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

这是我手表的商店url:

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

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

  • 在模拟器上,如果我硬编码其中一个URL,iOS模拟器和Watch模拟器都能够读写相同的
    .sqlite
    文件并共享内容。但是,这在实际设备上是不可能的,因为手表扩展无法写入iOS路径:
网址:file:///private/var/mobile/Containers/Shared/AppGroup/3D05D159-94D6-409C-9A38-90E0830D0C3F/FiveMinutes.sqlite 选项:(空)。。。返回错误Domain=NSCOCAERRORDOMAIN Code=512“无法保存文件。”UserInfo={reason=无法使用UserInfo字典创建文件;Code=2}{ reason=“创建文件失败;代码=2”; }


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

我做的第一件事是创建一个新项目,从一个基本iOS项目开始,然后添加一个Watch OS 1(旧版本)应用程序目标。 在这种情况下,目录是相同的,它们可以通信:

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

iOS路径file:///Users/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


但是你有没有试着把文件放进去并访问它们?天知道模拟器是如何工作的,它使用什么文件夹。说到watchOS 2.0。现在这些都是本地应用。你不应该也添加“观看”应用程序的权限吗?是的,我试图写入文件,但它们放在不同的位置,iOS无法访问观看文件,而watch无法访问iOS文件。我在iOS应用程序、watch应用程序和watch extension中添加了权限。权限似乎添加得很好,因为如果我将权限字符串更改为其他内容,则返回的NSURL将变为零