可以从我的共享扩展保存文件中获取主应用程序中的文件吗?

时间:2017-04-21 13:46:37

标签: ios share

可以从我的共享扩展程序中获取保存文档文件吗?

我尝试构建共享扩展,共享扩展可以获取文件路径。我写了一个函数将文件保存到我的Documents文件夹。

我需要从我的主应用程序中获取该文件。但我发现我从共享扩展路径保存文件是

/var/mobile/Containers/Data/PluginKitPlugin/9EBF8983-E1DE-49E2-8589-CEE7305EB644/Documents/xxx.png

我使用主应用程序获取文档路径

/var/mobile/Containers/Data/Application/CFD67CD9-5A8A-473E-8ECF-FC1C1CF18098/Documents

文件夹ID不相同。

可以从共享扩展程序保存文件中获取文件吗? 非常感谢你。

2 个答案:

答案 0 :(得分:1)

你是对的。由于沙盒限制,应用程序和扩展程序无法共享单个目录。这就是为什么他们的目录不同 - 他们在不同的流程中运行。

然而,应用程序组允许共享的目录 。您可以使用NSFileManager访问App Group的目录,如下所示:

let groupPath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.documents")

与组权利匹配的任何目标都可以从/向共享目录(或 容器 )进行读/写。因此,它们实际上并不是您的应用程序或扩展程序的一部分。看看iOS File System Basics可能也很有趣,以便了解App Group容器的架构。

正如其他人所建议的那样,我强烈建议您阅读App Extension Guide,它可以很好地解释容器的用法。

答案 1 :(得分:1)

我尝试在共享扩展中使用objective-c编写代码。

在我的分享扩展中:

 +(NSURL*)getSharedContainerURLPath
 {
     NSFileManager *fm = [NSFileManager defaultManager];

     NSURL *groupContainerURL = [fm containerURLForSecurityApplicationGroupIdentifier:APP_GROUP];

     return groupContainerURL;
 }

 -(void) saveFileAction{
       NSString *docPath = [ClassName getSharedContainerURLPath].absoluteString;

     NSString * fileNamePathString = [docPath stringByAppendingPathComponent:[self generateMyFileName]];
     NSError *err;
BOOL fileSaveSuccess = [myFileData writeToFile: fileNamePathString
                                               options:NSDataWritingFileProtectionComplete
                                                 error:&err];


 }

然后我的主App加载文件夹数据代码:

 NSString * folderPath = [ClassName getSharedContainerURLPath].absoluteString;
 NSArray *directoryContent = [[NSFileManager defaultManager]      contentsOfDirectoryAtPath:folderPath error:NULL];
NSLog(@"directoryContent:%@",directoryContent);

我发现目录内容总是为空。

我已将APP群组设置在扩展程序和主要目标中。

我的共享扩展程序保存下面的日志文件路径:

在下面分享扩展跟踪日志:

 write file success:0 / error:Error Domain=NSCocoaErrorDomain Code=4      "The file “0421_224358.png” doesn’t exist." UserInfo=     {NSFilePath=file:/private/var/mobile/Containers/Shared/AppGroup/ACDE7845-     E0E3-45C3-893F-6F6978EC3534/0421_224358.png, NSUnderlyingError=0x174251ac0      {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

我的主应用程序跟踪下面的文件夹路径:

文件:///私人的/ var /移动/容器/共享/ AppGroup / ACDE7845-E0E3-45C3-893F-6F6978EC3534 /

我不知道为什么会保存错误。

有人可以提供一些提示吗?非常感谢你。