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

问题描述:

是否可以从我的共享扩展中获取保存文档文件?可能从我的共享扩展名保存文件中获取主应用程序中的文件?

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

我需要从我的主应用程序中获取文件。但是我发现我拯救份额扩展路径的文件是

/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是不一样的。

是否有可能从共享扩展名保存的文件中获取文件? 非常感谢。

+1

你需要应用程序组。请参阅[应用程序扩展编程指南](https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html)中的*与您的包含应用程序共享数据* – vadian

+0

我已知APP组可以共享一些数据。但我希望是保存该文件并从我的主应用程序获取文件。 – dickfala

+0

请再次阅读链接文章中标题标题后面的第一段* ...不能直接访问对方的容器*。 – vadian

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

尽管如此,应用程序组允许共享目录。您可以通过使用的NSFileManager这样的访问App集团的目录:

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

任何目标相匹配的组授权就能从/读/写的共享目录(或容器)。所以,它们实际上并不是您的应用程序或扩展程序的一部分。查看iOS的File System Basics以了解App Group容器的体系结构可能也很有趣。

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

+0

请看我的重播问题,非常感谢。我尝试写一些代码但没有得到任何文件:( – dickfala

+0

谢谢@Marcel Voss ,我发现我的问题是使用了错误的API,并且感谢我提供了一些提示并建议 – dickfala

我尝试在共享扩展中使用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]; 


} 

那么我的主要应用程序加载的文件夹数据代码:

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/mobile/Containers/Shared/AppGroup/ACDE7845-E0E3-45C3-893F-6F6978EC3534/

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

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

+1

您应该将此添加到您的原始问题中,而不是将其作为答案发布。 –

+1

'absoluteString'是错误的API来获取文件系统我建议总是使用与URL有关的API:'NSURL * docURL = [ClassName getSharedContainerURLPath]''NSURL * fileNameURL = [docURL stringBy ...''[myFileData writeToURL :fileNameURL ...' – vadian

+0

谢谢@ vadian。我尝试以absoluteString替换路径,它运行正确。谢谢你,你想添加另一个答案,我可以选择你的答案一个最佳答案。T非常感谢! – dickfala