可能从我的共享扩展名保存文件中获取主应用程序中的文件?
是否可以从我的共享扩展中获取保存文档文件?可能从我的共享扩展名保存文件中获取主应用程序中的文件?
我尝试构建共享扩展,共享扩展可以获取文件路径。我写了一个函数来将文件保存到我的文档文件夹。
我需要从我的主应用程序中获取文件。但是我发现我拯救份额扩展路径的文件是
/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是不一样的。
是否有可能从共享扩展名保存的文件中获取文件? 非常感谢。
你说得对。由于沙盒限制,应用程序和扩展程序无法共享个人目录。这就是他们的目录不同的原因 - 他们在不同的流程中运行。
尽管如此,应用程序组允许共享目录。您可以通过使用的NSFileManager这样的访问App集团的目录:
let groupPath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.documents")
任何目标相匹配的组授权就能从/读/写的共享目录(或容器)。所以,它们实际上并不是您的应用程序或扩展程序的一部分。查看iOS的File System Basics以了解App Group容器的体系结构可能也很有趣。
正如其他人所建议的,我也强烈建议阅读App Extension Guide,它很好地解释了容器的用法。
我尝试在共享扩展中使用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/
我不知道它为什么保存错误。
有没有人可以提供一些提示?非常感谢你。
您应该将此添加到您的原始问题中,而不是将其作为答案发布。 –
'absoluteString'是错误的API来获取文件系统我建议总是使用与URL有关的API:'NSURL * docURL = [ClassName getSharedContainerURLPath]''NSURL * fileNameURL = [docURL stringBy ...''[myFileData writeToURL :fileNameURL ...' – vadian
谢谢@ vadian。我尝试以absoluteString替换路径,它运行正确。谢谢你,你想添加另一个答案,我可以选择你的答案一个最佳答案。T非常感谢! – dickfala
你需要应用程序组。请参阅[应用程序扩展编程指南](https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html)中的*与您的包含应用程序共享数据* – vadian
我已知APP组可以共享一些数据。但我希望是保存该文件并从我的主应用程序获取文件。 – dickfala
请再次阅读链接文章中标题标题后面的第一段* ...不能直接访问对方的容器*。 – vadian