为什么 Swift FileManager.default.urls(...) 返回与 ObjC 实现(iOS 模拟器)不同的结果?

问题描述 投票:0回答:1

React Native Async Storage 调用以下方法在模拟器的文件系统中查找合适的目录:

NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) .firstObject

通过打开 Finder,可以观察到这在我的机器上评估为

~/Library/Developer/CoreSimulator/Devices/6A36BEDF-71DA-4A9B-9CDD-EBC6BCE11BC0/data/Containers/Data/Application/D258BA62-85FF-4288-95BF-D1318C63B947/Library/Application Support/

我现在希望在同一个 React Native iOS 应用程序的 SwiftUI 扩展小部件中访问此文件夹。但是当我调用

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
时,其计算结果为
/Users/brandon/Library/Developer/CoreSimulator/Devices/6A36BEDF-71DA-4A9B-9CDD-EBC6BCE11BC0/data/Library/Application Support/

如您所见,这些结果截然不同。为什么 Swift 方法似乎找到了不同的文件夹,我如何更改它以访问 ObjC 方法找到的文件夹?

我期望 Swift 代码的计算结果与 ObjC 中的 React Native Async Storage 生成的代码相同

ios swift objective-c react-native asyncstorage
1个回答
0
投票

问题不在于 Swift 与 Objective-C。问题是应用程序与小部件,每个应用程序都有自己单独的沙箱。如果您希望两者能够访问共享容器,您可以使用“应用程序组”。有关在 Xcode 中添加应用程序组功能的信息,请参阅配置应用程序组

您可以使用 Objective-C 中的

containerURLForSecurityApplicationGroupIdentifier:
访问此容器:

NSURL *baseUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.domain.foo"];

在 Swift 中,使用

containerURL(forSecurityApplicationGroupIdentifier:)
:

guard let baseUrl = FileManager.default
    .containerURL(forSecurityApplicationGroupIdentifier: "group.com.domain.foo")
else {
    fatalError("app group container not found")
}
© www.soinside.com 2019 - 2024. All rights reserved.