iOS 11+下基于Xamarin通过文件应用实现跨应用文件共享的技术咨询
嘿Mark,我来帮你搞定这个iOS跨应用文件共享的问题!你想通过iOS文件应用来实现Xamarin应用/UITest写入的文件被其他应用读取,这个思路完全没问题,下面我一步步给你讲具体怎么实现:
第一步:给Xamarin.iOS应用配置文件共享权限
要让你的应用文件能被iOS文件应用识别,首先得在Info.plist里开启两个关键权限:
UIFileSharingEnabled:允许文件应用访问你的应用的文档目录LSSupportsOpeningDocumentsInPlace:允许其他应用直接在原位置打开文件(无需复制)
你可以直接在Visual Studio的Info.plist编辑器里勾选对应的选项,或者手动添加XML配置:
<key>UIFileSharingEnabled</key> <true/> <key>LSSupportsOpeningDocumentsInPlace</key> <true/>
配置完成后,你的应用在文件应用的「我的iPhone」列表里就会出现对应的入口啦。
第二步:在Xamarin.iOS应用中写入文件到共享目录
接下来要把文件写到应用的Documents目录——这是文件应用唯一能访问的应用沙箱目录。用C#代码实现很简单:
// 获取Documents目录的绝对路径 string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string targetFilePath = Path.Combine(documentsPath, "MyMediumFile.txt"); // 写入中等大小的文件内容(这里用文本示例,二进制文件同理) string fileContent = "这里是你的中等大小文件内容,可以是文本、序列化数据或二进制流"; File.WriteAllText(targetFilePath, fileContent);
运行应用后,你就能在文件应用里找到这个文件了。
第三步:用Xamarin.UITest写入文件到共享目录
如果是通过UITest自动化生成文件,你可以直接访问应用的沙箱目录来写入:
// 获取UITest上下文里的应用沙箱根目录 string appDataDir = AppContext.AppDataDirectory; // 拼接得到Documents目录的完整路径 string documentsDir = Path.Combine(appDataDir, "..", "Documents"); documentsDir = Path.GetFullPath(documentsDir); string testFilePath = Path.Combine(documentsDir, "UITest_Generated_File.txt"); string testContent = "由Xamarin.UITest生成的共享文件内容"; // 写入文件(UITest有权限访问目标应用的沙箱) File.WriteAllText(testFilePath, testContent);
这样生成的文件同样会出现在文件应用的对应应用目录下。
第四步:让另一个应用读取这些文件
要让其他应用能读取这些文件,需要做两件事:
- 给目标应用配置文件类型支持:在另一个应用的
Info.plist里添加支持打开的文件类型,比如文本文件:
<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeName</key> <string>Plain Text Files</string> <key>LSHandlerRank</key> <string>Alternate</string> <key>LSItemContentTypes</key> <array> <string>public.plain-text</string> </array> </dict> </array>
- 处理文件打开事件:在目标应用的
AppDelegate里重写OpenUrl方法来读取文件:
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { // 读取文件内容(如果是二进制文件,用File.ReadAllBytes即可) string fileContent = File.ReadAllText(url.Path); // 这里可以根据需求处理内容,比如显示在界面上 Console.WriteLine("读取到共享文件内容:" + fileContent); return true; }
之后用户在文件应用里选中文件,选择「打开方式」并选你的目标应用,就能读取到内容了。
额外注意事项
- 测试时,模拟器可能需要重启一次才能让文件应用识别到你的应用目录
- 真实设备上要确保应用签名正确,权限配置生效
- 如果是二进制文件,只需要把
File.WriteAllText/File.ReadAllText换成File.WriteAllBytes/File.ReadAllBytes即可
内容的提问来源于stack exchange,提问作者Mark Wardell
相关产品推荐
相关产品推荐

