You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

这样生成的文件同样会出现在文件应用的对应应用目录下。

第四步:让另一个应用读取这些文件

要让其他应用能读取这些文件,需要做两件事:

  1. 给目标应用配置文件类型支持:在另一个应用的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>
  1. 处理文件打开事件:在目标应用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:23:22