如何使Xamarin.Forms iOS应用豁免Intune MDM策略以使用Share Extension
核心问题分析
Intune的「Send org data to other apps: Policy managed apps」策略会对托管应用(如Microsoft Outlook)中的组织数据加密。当你的非托管应用通过Share Extension访问这些数据时,若未被正确豁免,拿到的是加密后的原始内容,导致文件损坏。URL Scheme无法作为有效豁免标识,因为Intune是通过Bundle ID识别应用实体的。
具体解决步骤
1. 用Bundle ID替代URL Scheme添加豁免
Intune豁免应用列表需要应用/Extension的Bundle ID,而非URL Scheme,按以下操作:
- 分别获取主应用、Share Extension、Share Extension UI的Bundle ID:
- 主应用:在Xamarin项目的
Info.plist中查找CFBundleIdentifier字段 - Share Extension:在Extension项目的
Info.plist中查找对应字段,通常格式为主应用BundleID.ShareExtension - 若有独立的Share Extension UI Target,同样获取其Bundle ID
- 主应用:在Xamarin项目的
- 进入Intune控制台,找到对应的「Send org data to other apps」策略,在豁免应用/允许的应用列表中,手动添加所有上述Bundle ID,确保选择「Bundle ID」作为识别类型(而非URL Scheme)。
2. 修正Share Extension的文件读取逻辑
确保Extension通过系统API获取解密后的文件内容,避免直接读取加密文件路径:
using Foundation; using UIKit; // 在Share Extension的ViewController中 public override async void ViewDidLoad() { base.ViewDidLoad(); var extensionContext = this.ExtensionContext; if (extensionContext?.InputItems == null || extensionContext.InputItems.Count == 0) return; var item = extensionContext.InputItems[0] as NSExtensionItem; if (item?.Attachments == null || item.Attachments.Count == 0) return; var itemProvider = item.Attachments[0]; // 按文件类型选择对应的Type Identifier,这里以通用文件为例 if (itemProvider.HasItemConformingToTypeIdentifier("public.file-url")) { var fileUrl = await itemProvider.LoadItemAsync(new NSString("public.file-url")) as NSUrl; if (fileUrl != null) { // 使用NSData.FromUrl获取解密后的文件内容 var fileData = NSData.FromUrl(fileUrl); // 后续处理fileData,比如上传 } } }
3. 强制设备同步Intune策略
修改策略后,让设备主动同步MDM配置:
- 打开iOS设置 → 通用 → VPN与设备管理 → 选择你的Intune账户 → 点击「同步」
- 重启主应用和Share Extension,确保新策略生效
4. 备选:集成Intune SDK(若豁免仍无效)
如果上述步骤无法解决,可考虑集成Intune SDK到主应用,通过应用保护策略明确允许数据共享:
- 安装NuGet包
Microsoft.Intune.MAM.Xamarin.iOS - 在
AppDelegate的FinishedLaunching方法中初始化SDK:using Microsoft.Intune.MAM; public override bool FinishedLaunching(UIApplication app, NSDictionary options) { // 初始化Intune MAM SDK IntuneMAMFactory.Instance.SDKInitialize(); // 其他初始化逻辑 return base.FinishedLaunching(app, options); } - 在Intune控制台为该应用创建应用保护策略,配置「允许应用与其他应用共享数据」为「策略托管应用和豁免应用」,并将你的Extension Bundle ID加入豁免列表
内容的提问来源于stack exchange,提问作者Pelin Konaray
相关产品推荐
相关产品推荐

