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 生成的代码相同
问题不在于 Swift 与 Objective-C。问题是应用程序与小部件,每个应用程序都有自己单独的沙箱。如果您希望两者能够访问共享容器,您可以使用“应用程序组”。有关在 Xcode 中添加应用程序组功能的信息,请参阅配置应用程序组。
containerURLForSecurityApplicationGroupIdentifier:
访问此容器:
NSURL *baseUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.domain.foo"];
containerURL(forSecurityApplicationGroupIdentifier:)
:
guard let baseUrl = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.domain.foo")
else {
fatalError("app group container not found")
}