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

containerURLForSecurityApplicationGroupIdentifier: gives different results on iPhone and Watch simulator

我使用默认 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"];
}

iOS 应用程序:

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

    NSURL *test = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.lombax.fiveminutes"];
// ... 
}

然而,testNSURL不同:

在 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。 有什么建议吗? 谢谢

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

这是 url 我的 iPhone 的商店:

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:file:///private/var/mobile/Containers/Shared/AppGroup/3D05D159-94D6-409C-9A38-90E0830D0C3F/FiveMinutes.sqlite options:(null) ... returned error Error Domain=NSCocoaErrorDomain Code=512 "The file couldn’t be saved." UserInfo={reason=Failed to create file; code = 2} with userInfo dictionary { reason = "Failed to create file; code = 2"; }

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

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

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

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

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

Your extension now stores files and data on Apple Watch. Any data that is not part of your Watch app or WatchKit extension bundle must be fetched from the network or from the companion iOS app running on the user’s iPhone. You cannot rely on a shared group container to exchange files with your iOS app. Fetching files involves transferring them wirelessly to Apple Watch.