9

我尝试使用- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier在 iOS 8 b4 上的容器应用程序和扩展程序之间保存/加载文件。

这是代码:

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
containerURL = [containerURL URLByAppendingPathComponent:[NSString stringWithFormat:@"Library/Caches/test.txt"]];
NSString* string = @"hihihihihi";
NSError* error;
[string writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@",error);

我将此代码放在扩展(自定义键盘)和容器应用程序中。当我在 iOS Simulator 上运行它时,它们都可以成功保存文件。但是在 iOS 设备上,扩展程序无法保存文件(而容器应用程序仍然可以)

当扩展程序尝试保存文件时,控制台显示可可错误 513。

2014-07-31 01:37:49.316 TestExtention[2359:288820] 错误域 = NSCocoaErrorDomain 代码 = 513“操作无法完成。(可可错误 513。)”用户信息 = 0x15df2100 {NSFilePath =/private/var/ mobile/Containers/Shared/AppGroup/4FA2DA5E-89C3-4BC3-AA5B-DD869827C5E7/Library/Caches/test.txt, NSUnderlyingError=0x15df1d90 "操作无法完成。操作不允许"}

这是 iOS 8 扩展的限制吗?

4

2 回答 2

4

键盘扩展还有另一个限制。您应该在Info.plist 中RequestsOpenAccess设置,然后它可以访问文件。YES

https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html#//apple_ref/doc/uid/TP40014214-CH16-SW2

于 2014-07-31T14:26:21.243 回答
2

如果包含的应用程序和扩展程序具有相同的组 ID ,则它们都可以访问同一共享组容器下的文件。

在您包含的应用程序和扩展程序中,检查它是否存在于它的 .entitlements 中。

<key>com.apple.security.application-groups</key>
<array>
    <string>your-group-id</string>
</array>


然后检查他们的 Provisioning Profile 是否有这个组 ID。

于 2014-07-31T06:31:39.483 回答