【问题标题】:containerURLForSecurityApplicationGroupIdentifier: gives different results on iPhone and Watch simulatorcontainerURLForSecurityApplicationGroupIdentifier:在 iPhone 和 Watch 模拟器上给出不同的结果
【发布时间】:2015-12-16 00:53:25
【问题描述】:

我使用默认的 XCode 模板创建了一个 WatchKit 应用程序。 我向 iOS 目标、Watchkit 应用程序目标和 Watchkit 应用程序扩展目标添加了一个应用程序组权利。 (这是应用组名称:group.com.lombax.fiveminutes) 然后,我尝试使用 iOS App 和 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,实际设备上问题依然存在。

这是我 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) ... 返回错误 错误域=NSCocoaErrorDomain 代码=512 "无法保存文件。" UserInfo={原因=创建文件失败;代码 = 2} 与 userInfo 字典 { reason = "创建文件失败;代码 = 2"; }

【问题讨论】:

  • 但是您是否尝试过实际放置文件并访问它们?天知道模拟器是如何工作的以及它使用什么文件夹。说到watchOS 2.0。这些现在是本机应用程序。你不应该也添加观看应用的权利吗?
  • 是的,我尝试写入文件,它们放在不同的位置,iOS 无法访问手表文件,手表无法访问 iOS 文件。我将权利添加到 iOS 应用程序、手表应用程序和手表扩展程序。权利似乎添加得很好,因为如果我将权利字符串更改为不同的内容,则返回的 NSURL 变为 nil

标签: ios iphone ios-simulator watchkit apple-watch


【解决方案1】:

好的,我想我找到了答案。我记得随着过渡到 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 路径文件:///Users/Lombardo/Library/Developer/CoreSimulator/Devices/BF52D613-25FF-4092-A5B2-9C3F1B616160/data/Containers/Shared/AppGroup/30B39103-CEEB-4C64-9531-FB27DC40180D/

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多