Microsoft Intune 应用 SDK Xamarin 绑定
重要
Xamarin.Forms 已发展成为 .NET 多平台应用 UI (MAUI) 。 现有 Xamarin 项目应迁移到 .NET MAUI。 有关将 Xamarin 项目升级到 .NET 的详细信息,请参阅 从 Xamarin 升级到 .NET & .NET MAUI 文档。
截至 2024 年 5 月 1 日,所有 Xamarin SDK(包括 Xamarin.Forms 和 Intune 应用 SDK Xamarin 绑定)的 Xamarin 支持已结束。 有关 Android 和 iOS 平台上的 Intune 支持,请参阅 Intune App SDK for .NET MAUI - Android和 Microsoft Intune App SDK for MAUI.iOS。
概述
Intune 应用 SDK Xamarin 绑定在使用 Xamarin 生成的 iOS 和 Android 应用中启用 Intune 应用保护策略 。 通过绑定,开发人员可以轻松地将 Intune 应用保护功能内置到基于 Xamarin 的应用中。
Microsoft Intune 应用 SDK Xamarin 绑定允许将 Intune 应用保护策略 (也称为 APP 或 MAM 策略) 合并到使用 Xamarin 开发的应用中。 已启用 MAM 的应用程序是与 Intune 应用 SDK 集成的应用程序。 当 Intune 主动管理应用时,IT 管理员可以将应用保护策略部署到移动应用。
支持哪些内容?
开发人员计算机
- Windows (Visual Studio 版本 15.7+)
- macOS
移动应用平台
- Android
- iOS
Intune 移动应用程序管理方案
- Intune MAM
- 已注册 Intune MDM 的设备
- 已注册第三方 EMM 的设备
使用 Intune App SDK Xamarin 绑定构建的 Xamarin 应用现在可以在 Intune 移动设备管理 (MDM) 注册设备和未注册设备上接收 Intune 应用保护策略。
先决条件
查看许可条款。 打印并保留许可条款的副本作为记录。 下载和使用 Intune App SDK Xamarin 绑定即表示你同意此类许可条款。 如果你不接受它们,请不要使用该软件。
Intune SDK 依赖于 Microsoft身份验证库 (MSAL) 来实现其 身份验证 和条件启动方案,这些方案要求使用 Microsoft Entra ID 配置应用。
如果应用程序已配置为使用 MSAL,并且具有其自己的自定义客户端 ID,用于使用 Microsoft Entra ID 进行身份验证,请确保遵循向 Xamarin 应用授予对 Intune 移动应用程序管理 (MAM) 服务的权限的步骤。 使用 Intune SDK 入门指南的“向应用授予对 Intune 移动应用管理服务的访问权限”部分中的说明。
安全注意事项
防止潜在的欺骗、信息泄露和特权提升攻击:
- 确保在安全工作站上执行 Xamarin 应用开发。
- 确保绑定来自有效的Microsoft源:
- MS Intune 应用 SDK NuGet 配置文件
- Intune App SDK Xamarin GitHub 存储库
- 为项目配置 NuGet 配置,以信任已签名且未修改的 NuGet 包。 有关详细信息 ,请参阅安装已签名的包 。
- 保护包含 Xamarin 应用的输出目录。 考虑对输出使用用户级目录。
在 iOS 移动应用中启用 Intune 应用保护策略
重要
Intune 定期发布 Intune 应用 SDK 的更新。 定期检查 Intune App SDK Xamarin 绑定是否有更新,并纳入软件开发发布周期,以确保你的应用支持最新的应用保护策略设置。
将 Microsoft.Intune.MAM.Xamarin.iOS NuGet 包 添加到 Xamarin.iOS 项目。
按照将 Intune 应用 SDK 集成到 iOS 移动应用所需的常规步骤进行操作。 可以从 Intune App SDK for iOS 开发人员指南中的集成说明步骤 3 开始。 可以跳过运行 IntuneMAMConfigurator 的该部分中的最后一步,因为此工具包含在 Microsoft.Intune.MAM.Xamarin.iOS 包中,并且将在生成时自动运行。 重要提示:在 Visual Studio 中为应用启用密钥链共享与 Xcode 略有不同。 打开应用的“权利”列表,确保已启用“启用密钥链”选项,并在该部分中添加了相应的密钥链共享组。 然后,确保在项目“iOS 捆绑签名”选项的“自定义权利”字段中指定了“权利”列表,用于所有相应的配置/平台组合。
添加绑定并正确配置应用后,应用即可开始使用 Intune SDK 的 API。 为此,必须包含以下命名空间:
using Microsoft.Intune.MAM;
若要开始接收应用保护策略,应用必须在 Intune MAM 服务中注册。 如果你的应用不使用 Microsoft 身份验证库 (MSAL) 对用户进行身份验证,并且你希望 Intune SDK 处理身份验证,则应用应将用户的 UPN 提供给 IntuneMAMEnrollmentManager 的 LoginAndEnrollAccount 方法:
IntuneMAMEnrollmentManager.Instance.LoginAndEnrollAccount([NullAllowed] string identity);
如果用户的 UPN 在调用时未知,应用可能会传入 null。 在这种情况下,系统会提示用户输入其电子邮件地址和密码。
如果应用已使用 MSAL 对用户进行身份验证,则可以在应用与 Intune SDK 之间配置单一登录 (SSO) 体验。 首先,需要将 Intune SDK 使用的默认Microsoft Entra 设置替代应用设置。 可以通过应用的 Info.plist 中的 IntuneMAMSettings 字典执行此操作(如 适用于 iOS 的 Intune App SDK 开发人员指南中所述),也可以在代码中通过 IntuneMAMSettings 类的 Microsoft entra ID 替代属性执行此操作。 对于 MSAL 设置是静态的应用程序,建议使用 Info.plist 方法,而对于在运行时确定这些值的应用程序,建议使用替代属性。 配置所有 SSO 设置后,应用应在成功进行身份验证后,将用户的 UPN 提供给 IntuneMAMEnrollmentManager 的 RegisterAndEnrollAccount 方法:
IntuneMAMEnrollmentManager.Instance.RegisterAndEnrollAccount(string identity);
应用可以通过在 IntuneMAMEnrollmentDelegate 的子类中实现 EnrollmentRequestWithStatus 方法并将 IntuneMAMEnrollmentManager 的 Delegate 属性设置为该类的实例来确定注册尝试的结果。
成功注册后,应用可以通过查询以下属性来确定已注册帐户的 UPN ((如果以前未知) ):
string enrolledAccount = IntuneMAMEnrollmentManager.Instance.EnrolledAccount;
在 Android 移动应用中启用 Intune 应用保护策略
- 将 Microsoft.Intune.MAM.Xamarin.Android NuGet 包 添加到 Xamarin.Android 项目。
- 对于 Xamarin.Forms 应用,请将 Microsoft.Intune.MAM.Remapper.Tasks NuGet 包 也添加到 Xamarin.Android 项目。
- 请遵循 将 Intune 应用 SDK 集成到 Android 移动应用所需的常规步骤,同时参考此文档了解其他详细信息。
Xamarin.Android 集成
有关集成 Intune App SDK 的完整概述,请参阅 Microsoft Intune App SDK for Android 开发人员指南。 通读指南并将 Intune 应用 SDK 与 Xamarin 应用集成时,以下部分旨在重点介绍使用 Java 开发的本机 Android 应用的实现与使用 C# 开发的 Xamarin 应用之间的差异。 这些部分应被视为补充,不能替代整个指南的阅读。
重映射器
从 1.4428.1 版本开始, Microsoft.Intune.MAM.Remapper
可将包作为 生成工具 添加到 Xamarin.Android 应用程序,以执行 MAM 类、方法和系统服务替换。 如果包含重映射器,则在生成应用程序时,将自动执行重命名的方法和 MAM 应用程序部分的 MAM 等效替换部分。
若要通过 Remapper 从 MAM-ification 中排除类,可以在项目 .csproj
文件中添加以下属性。
<PropertyGroup>
<ExcludeClasses>Semicolon separated list of relative class paths to exclude from MAM-ification</ExcludeClasses>
</PropertyGroup>
注意
重新映射器当前阻止在 Xamarin.Android 应用中进行调试。 建议手动集成来调试应用程序。
重命名的方法
在许多情况下,Android 类中可用的方法已在 MAM 替换类中标记为最终方法。 在这种情况下,MAM 替换类提供了一个名称类似的方法, (后缀为 MAM
) ,应改为重写该方法。 例如,从 MAMActivity
派生时,必须重写OnMAMCreate()
并调用 ,Activity
而不是重写OnCreate()
和调用 base.OnCreate()
base.OnMAMCreate()
。
MAM 应用程序
应用必须定义类 Android.App.Application
。 如果手动集成 MAM,它必须继承自 MAMApplication
。 请确保使用 属性正确修饰 [Application]
子类并重写 (IntPtr, JniHandleOwnership)
构造函数。
[Application]
class TaskrApp : MAMApplication
{
public TaskrApp(IntPtr handle, JniHandleOwnership transfer)
: base(handle, transfer) { }
注意
在调试模式下部署时,MAM Xamarin 绑定出现问题可能会导致应用程序崩溃。 解决方法是, Debuggable=false
必须将 属性添加到 类, Application
并且如果手动设置标志, android:debuggable="true"
则必须从清单中删除该标志。
启用需要应用参与的功能
示例:确定应用是否需要 PIN
MAMPolicyManager.GetPolicy(currentActivity).IsPinRequired;
示例:确定主 Intune 用户
IMAMUserInfo info = MAMComponents.Get<IMAMUserInfo>();
return info?.PrimaryUser;
示例:确定是否允许保存到设备或云存储
MAMPolicyManager.GetPolicy(currentActivity).GetIsSaveToLocationAllowed(SaveLocation service, String username);
从 SDK 注册通知
你的应用必须通过创建 MAMNotificationReceiver
并将其注册到 MAMNotificationReceiverRegistry
来注册 SDK 中的通知。 这是通过在 中 App.OnMAMCreate
提供接收方和所需的通知类型来完成的,如以下示例所示:
public override void OnMAMCreate()
{
// Register the notification receivers
IMAMNotificationReceiverRegistry registry = MAMComponents.Get<IMAMNotificationReceiverRegistry>();
foreach (MAMNotificationType notification in MAMNotificationType.Values())
{
registry.RegisterReceiver(new ToastNotificationReceiver(this), notification);
}
...
MAM 注册管理器
IMAMEnrollmentManager mgr = MAMComponents.Get<IMAMEnrollmentManager>();
Xamarin.Forms 集成
对于 Xamarin.Forms
应用程序,包 Microsoft.Intune.MAM.Remapper
通过将类注入 MAM
常用 Xamarin.Forms
类的类层次结构来自动执行 MAM 类替换。
注意
除了上面详述的 Xamarin.Android 集成之外,还必须完成 Xamarin.Forms 集成。 对于 Xamarin.Forms 应用,Remapper 的行为有所不同,因此仍必须手动替换 MAM。
将重新映射器添加到项目后,需要执行 MAM 等效的替换。 例如, FormsAppCompatActivity
和 FormsApplicationActivity
可以继续使用在应用程序中提供对 和 OnResume
的替代OnCreate
分别替换为 MAM 等效项OnMAMCreate
和 OnMAMResume
。
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnMAMCreate(Bundle savedInstanceState)
{
base.OnMAMCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
如果未进行替换,则在进行替换之前,可能会遇到以下编译错误:
-
编译器错误 CS0239。 此错误通常以这种形式
'MainActivity.OnCreate(Bundle)': cannot override inherited member 'MAMAppCompatActivityBase.OnCreate(Bundle)' because it is sealed
出现。 这是意料之中的,因为当 Remapper 修改 Xamarin 类的继承时,将创建sealed
某些函数,并添加新的 MAM 变体来替代。 -
编译器错误 CS0507:此错误通常以此形式
'MyActivity.OnRequestPermissionsResult()' cannot change access modifiers when overriding 'public' inherited member ...
出现。 当重新映射器更改某些 Xamarin 类的继承时,某些成员函数将更改为public
。 如果重写这些函数中的任何一个,则还需要更改这些替代public
的访问修饰符。
注意
重映射器会重新编写 Visual Studio 用于 IntelliSense 自动完成的依赖项。 因此,在为 IntelliSense 添加重映射器时,可能需要重新加载并重新生成项目,以便正确识别更改。
疑难解答
- 如果在启动时应用程序遇到空白的白屏,则可能需要强制在主线程上执行导航调用。
- Intune SDK Xamarin 绑定不支持使用跨平台框架的应用,例如 MvvmCross,因为 MvvmCross 和 Intune MAM 类之间存在冲突。 虽然某些客户在将应用移动到普通 Xamarin.Forms 后可能成功集成,但我们没有为使用 MvvmCross 的应用开发人员提供明确的指导或插件。
公司门户应用
Intune SDK Xamarin 绑定依赖于设备上的 公司门户 Android 应用来启用应用保护策略。 公司门户从 Intune 服务检索应用保护策略。 当应用初始化时,它会加载策略和代码,以从公司门户强制实施该策略。 用户无需登录。
注意
当公司门户应用不在 Android 设备上时,Intune 托管应用的行为与不支持 Intune 应用保护策略的普通应用的行为相同。
对于无需设备注册的应用保护,用户 无需 使用公司门户应用注册设备。
支持
如果你的组织是现有的 Intune 客户,请与Microsoft支持代表协作,在 GitHub 问题页面上开具支持票证并创建问题。 我们会尽快提供帮助。