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"];
// ...
}
然而,test
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,在真机上问题依然存在。
这是 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 进行硬编码,iOS 模拟器和 Watch 模拟器都能够读写相同的
.sqlite
文件并共享内容。但是,这在真实设备上是不可能的,因为 Watch 扩展无法写入 iOS 路径:
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.
我使用默认 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"];
// ...
}
然而,test
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,在真机上问题依然存在。
这是 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 进行硬编码,iOS 模拟器和 Watch 模拟器都能够读写相同的
.sqlite
文件并共享内容。但是,这在真实设备上是不可能的,因为 Watch 扩展无法写入 iOS 路径:
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.