阶段 3:Intune SDK 集成到 iOS 应用中

注意

本指南分为几个不同的阶段。 首先查看 规划集成

阶段目标

  • 下载Intune应用 SDK。
  • 了解 Intune App SDK 中包含的文件。
  • 在应用程序中引用Intune应用 SDK。
  • 确认Intune应用 SDK 已正确包含在生成中。
  • 使用 MSAL 进行身份验证后,为 MAM 管理注册新帐户。
  • 若要删除公司数据,请在注销时注销帐户
  • (建议) 将 MAM 登录合并到应用中。

先决条件

  • 需要具有 Xcode 16.0 或更高版本的 macOS 计算机。

  • 你的应用必须面向 iOS 16.0 或更高版本。

  • 查看适用于 iOS 的 Intune 应用 SDK 许可条款。 打印并保留许可条款的副本作为记录。 下载和使用适用于 iOS 的 Intune App SDK 即表示你同意此类许可条款。 如果你不接受它们,请不要使用该软件。

  • GitHub 上下载适用于 iOS 的 Intune App SDK 的文件。

SDK 存储库中的内容

  • IntuneMAMSwift.xcframework:Intune应用 SDK 动态框架。 建议将此框架链接到应用/扩展,以启用Intune客户端应用程序管理。 但是,某些开发人员可能更喜欢静态框架的性能优势 (IntuneMAMStatic.xcframework) 。

  • IntuneMAMStatic.xcframework:Intune应用 SDK 静态框架。 开发人员可以选择链接静态框架而不是动态框架。 由于静态框架中的可执行代码在生成时直接嵌入到应用/扩展二进制文件中,因此使用静态库在启动时具有一些性能优势。 但是,如果应用包含任何扩展,将静态框架链接到应用和扩展会导致更大的应用捆绑包大小。 可执行代码嵌入到每个应用/扩展二进制文件中。 相比之下,使用动态框架时,应用和扩展可以共享相同的Intune SDK 二进制文件,从而缩小应用大小。

  • IntuneMAMSwiftStub.xcframework:Intune应用 SDK Swift 存根框架。 此框架是 IntuneMAMSwift.xcframework 和 IntuneMAMStatic.xcframework(应用/扩展必须链接)的必需依赖项。

  • IntuneMAMConfigurator:用于配置应用或扩展的 Info.plist 的工具,其中包含Intune管理所需的最小更改。 根据应用或扩展的功能,可能需要对 Info.plist 进行更多手动更改。

  • libIntuneMAMSwift.xcframework:Intune应用 SDK 静态库。 Intune MAM iOS SDK 的此变体已弃用,并在将来的更新中删除。 建议不要链接静态库,而是将应用/扩展链接到动态框架 (IntuneMAMSwift.xcframework) 或静态框架 (IntuneMAMStatic.xcframework) 前面提到的。

  • IntuneMAMResources.bundle:包含 SDK 所依赖的资源的资源捆绑包。 只有将已弃用的静态库 (libIntuneMAMSwift.xcframework) 集成并在将来的更新中将其删除的应用才需要该资源包。

Intune应用 SDK 的工作原理

适用于 iOS 的 Intune App SDK 的目标是在最少的代码更改的情况下向 iOS 应用程序添加管理功能。 代码越少,上市时间越短,但不会影响移动应用程序的一致性和稳定性。

流程流

下图提供了适用于 iOS 的 Intune 应用 SDK 进程流:

Microsoft Intune的高级体系结构图。

将 SDK 构建到移动应用中

重要

Intune定期发布Intune应用 SDK 的更新。 定期检查适用于 iOS 的 Intune App SDK 进行更新,并纳入软件开发发布周期,以确保应用支持最新的应用保护策略设置。

若要启用 Intune 应用 SDK,请执行以下步骤:

  1. IntuneMAMSwift.xcframework链接或IntuneMAMStatic.xcframework链接到目标:将 xcframework 捆绑包拖到项目目标的“框架”、“库”和“嵌入内容”列表。 对 IntuneMAMSwiftStub.xcframework重复这些步骤。 对于主应用,请在“嵌入”列中为添加的两个 xcframeworks 选择“嵌入 & 登录”。 对于任何扩展,请选择“不嵌入”。

    Intune应用 SDK iOS 框架:Xcode 框架、库和嵌入内容示例

  2. 将以下 iOS 框架添加到项目:

    • MessageUI.framework
    • Security.framework
    • CoreServices.framework
    • SystemConfiguration.framework
    • libsqlite3.tbd
    • libc++.tbd
    • ImageIO.framework
    • LocalAuthentication.framework
    • AudioToolbox.framework
    • TztzCore.framework
    • WebKit.framework
    • MetricKit.framework
  3. 如果尚未启用密钥链共享 () ,请在每个项目目标中选择 “功能 ”并启用 “密钥链共享” 开关。 需要密钥链共享才能继续下一步。

    注意

    预配配置文件需要支持新的密钥链共享值。 密钥链访问组应支持通配符。 可以通过在文本编辑器中打开 .mobileprovision 文件、搜索 keychain-access-groups 并确保具有通配符来检查此内容。 例如:

    <key>keychain-access-groups</key>
    <array>
    <string>YOURBUNDLESEEDID.*</string>
    </array>
    
  4. 启用密钥链共享后,请按照以下步骤创建一个单独的访问组,Intune App SDK 在其中存储其数据。 可以使用 UI 或权利文件创建密钥链访问组。 如果使用 UI 创建密钥链访问组,请确保执行以下步骤:

    1. 如果移动应用未定义任何密钥链访问组,请将应用的捆绑 ID 添加为 第一个 组。

    2. 将共享密钥链组 com.microsoft.intune.mam 添加到现有访问组。 Intune App SDK 使用此访问组来存储数据。

    3. 将 添加到 com.microsoft.adalcache 现有访问组。

      Intune应用 SDK iOS:密钥链共享

      注意

      如果将 MSAL 配置为使用自定义密钥链访问组而不是 默认值 com.microsoft.adalcache,则无需在此处指定此密钥链访问组。 请改为指定自定义密钥链组。 还应将 Intune配置为通过 IntuneMAMSettings Info.plist 字典中的 ADALCacheKeychainGroupOverride 设置使用相同的自定义访问组。

    4. 如果要直接编辑权利文件,而不是使用 Xcode UI 创建密钥链访问组,请在密钥链访问组 $(AppIdentifierPrefix) 的前面附加 (Xcode 自动处理此) 。 例如:

      • $(AppIdentifierPrefix)com.microsoft.intune.mam
      • $(AppIdentifierPrefix)com.microsoft.adalcache

      注意

      权利文件是移动应用程序唯一的 XML 文件。 它用于在 iOS 应用中指定特殊权限和功能。 如果你的应用以前没有权利文件,则启用密钥链共享 (步骤 3) 应该会导致 Xcode 为应用生成一个。 确保应用的捆绑 ID 是列表中的第一个条目。

  5. 将应用传递到 UIApplication canOpenURL 的每个协议包含在应用的 Info.plist 文件的数组中 LSApplicationQueriesSchemes 。 对于此数组中列出的每个协议,将追加 -intunemam 的协议的副本添加到数组。 此外,请将以下值添加到数组:http-intunemam、、https-intunemammicrosoft-edge-http-intunemammicrosoft-edge-https-intunemamzipssmart-nslacoonsecuritybetteractiveshieldsmsecskycurelookoutwork-asewandera、、mvisionmobile、、 scmx和 。intunemam-mtd 如果你的应用使用 mailto: 协议,也添加到 ms-outlook-intunemam 数组。 在继续下一步之前保存更改。

    如果应用在其 LSApplicationQueriesSchemes 列表中空间不足,它可以删除已知也实现 Intune MAM SDK 的应用的“-intunemam”方案。 当应用从 LSApplicationQueriesSchemes 列表中删除“scheme-intunemam”时, canOpenURL() 可能会为这些方案返回不正确的响应。 若要解决此问题,请改为调用 [IntuneMAMPolicy isURLAllowed:url isKnownManagedAppScheme:YES] 该方案。 如果策略阻止打开 URL,则返回 NO 此调用。 如果返回 true,则应用可以使用空标识调用 canOpenURL() ,以确定是否可以打开 URL。 例如:

    BOOL __block canOpen = NO;
    if([policy isURLAllowed:urlForKnownManagedApp isKnownManagedAppScheme:YES])
    {
        [[IntuneMAMPolicyManager instance] setCurrentThreadAccountId:"" forScope:^{
        canOpen = [[UIApplication sharedApplication] canOpenURL:urlForKnownManagedApp];
        }];
    }
    
  6. 如果应用尚未使用 FaceID,请确保使用默认消息配置 NSFaceIDUsageDescription Info.plist 密钥 。 此步骤是必需的,以便 iOS 可以让用户知道应用打算如何使用 FaceID。 Intune应用保护策略设置允许在 IT 管理员配置时将 FaceID 用作应用访问的方法。

  7. 使用 SDK 存储库 中包含的 IntuneMAMConfigurator 工具完成应用的 Info.plist 配置。 该工具具有三个参数:

    属性 如何使用
    -我 <Path to the input plist>
    - e <Path to the entitlements file>
    - o (可选) <Path to the output plist>

    如果未指定“-o”参数,则会就地修改输入文件。 该工具是幂等的,应在对应用的 Info.plist 或权利进行更改时重新运行。 更新 Intune SDK 时,还应下载并运行该工具的最新版本,以防最新版本的 Info.plist 配置要求发生更改。

注意

如果你有 SwiftUI 应用,请确保 UISceneConfigurations Info.pist 文件中的 中的 字典 UIApplicationSceneManifest 不缺失或为空。 即使成功应用了应用保护策略,但配置此设置失败可能会阻止Intune SDK 保护你的应用。 如果没有为 UISceneConfigurations 设置特定值,则可以使用此默认配置:

<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>

Xcode 生成设置和功能

应用应在 Xcode 生成设置中同时具有“条带 Swift 符号” (STRIP_SWIFT_SYMBOLS) 和“启用 Bitcode” (ENABLE_BITCODE) 设置为 NO。 如果应用程序包括 Xcode 26+ 中提供的“增强的安全性”功能,则必须禁用“身份验证指针”和“启用只读平台内存”选项。

集成文件提供程序扩展

文件提供程序扩展具有某些内存要求,这可能会使集成完整 SDK 变得困难。 为了简化作,有一个静态库 libIntuneMAMSwiftFileProvider.xcframework,它是专门针对文件提供程序扩展的 SDK 的剥离版本。 请注意,此库适用于 FileProvider 扩展的非 UI 部分。 需要将完整的 SDK 集成到文件提供程序 UI 扩展中。

若要将这些库之一与文件提供程序扩展集成,请按照将 SDK 集成为静态库的步骤作。 请确保包含 ContainingAppBundleId 设置。

集成非复制的文件提供程序扩展

如果应用实现了 NSFileProviderExtension 协议,则使用非复制文件提供程序。 在 iOS 16.0 之前创建的所有文件提供程序都是非复制的。

In - startProvidingItemAtURL:completionHandler:如果应使用 [[IntuneMAMPolicy 实例]shouldFileProviderEncryptFiles] 加密文件,检查。 使用 IntuneMAMFileProtectionManager 中的 encryptFile:forAccountId: API 进行实际文件加密。 此外,在需要加密时共享文件的副本,因为不希望将文件的加密副本存储在云存储中。

In - importDocumentAtURL:toParentItemIdentifier:completionHandler:检查文件是否使用 intuneMAMFileProtectionManager 中的 isFileEncrytped: API 进行加密。 如果是,请使用 IntuneMAMFileProtectionManager 的 decryptFile:toCopyPath: API 对其进行解密。 在多标识应用中,还针对目标所有者的 IntuneMAMPolicy 中的 canReceiveSharedFile: API 检查,以确定所有者是否可以接收该文件。

集成复制的文件提供程序扩展

如果应用实现了在 iOS 16.0) 中添加的 NSFileProviderReplicatedExtension 协议 (,则使用复制的文件提供程序。

In - fetchContentsForItemWithIdentifier:version:request:completionHandler:如果应使用 [[IntuneMAMPolicy 实例]shouldFileProviderEncryptFiles] 加密文件,检查。 使用 IntuneMAMFileProtectionManager 中的 encryptFile:forAccountId: API 进行实际文件加密。 需要加密时共享文件的副本,因为不希望在云存储中存储文件的加密副本。

In - createItemBasedOnTemplate:fields:contents:options:request:completionHandler:检查是否使用 IntuneMAMFileProtectionManager 中的 isFileEncrypted: API 加密文件。 如果是,请使用 IntuneMAMFileProtectionManager 的 decryptFile:toCopyPath: API 对其进行解密。 在多标识应用中,还针对目标所有者的 IntuneMAMPolicy 中的 canReceiveSharedFile: API 检查,以确定所有者是否可以接收该文件。

复制文件提供程序创建 NSFileProviderItem 并将其传递到系统的任何位置,请使用项的所有者标识调用 IntuneMAMFileProtectionManager 的 protectFileProviderItem:forAccountId: API。 根据创建 NSFileProviderItem 对象并在扩展中保留的位置,可能需要在每个 NSFileProviderReplicatedExtension 的协议方法中执行此作。

配置Intune应用 SDK 的设置

可以使用应用程序的 Info.plist 文件中的 IntuneMAMSettings 字典来设置和配置 Intune App SDK。 如果 Info.plist 文件中未显示 IntuneMAMSettings 字典,则应创建它。

在 IntuneMAMSettings 字典下,可以定义以下受支持的设置来配置 Intune 应用 SDK。

前面的部分介绍了其中一些设置,有些部分不适用于所有应用。

Setting 类型类型 定义 是否必需?
ADALClientId String 应用的Microsoft Entra客户端标识符。 对于所有应用是必需的。
ADALAuthority String 正在使用的应用Microsoft Entra授权。 应使用自己的环境,在其中配置了Microsoft Entra帐户。 有关详细信息,请参阅 应用程序配置选项 如果应用是构建在单个组织/Microsoft Entra租户中使用的自定义业务线应用程序,则是必需的。 如果不存在此值,则使用通用Microsoft Entra机构 (仅支持多租户应用) 。
ADALRedirectUri String 应用的Microsoft Entra重定向 URI。 所有应用都需要 ADALRedirectUri 或 ADALRedirectScheme。
ADALRedirectScheme String 应用的Microsoft Entra ID重定向方案。 如果应用程序的重定向 URI 的格式 scheme://bundle_id为 ,则可以使用它来代替 ADALRedirectUri。 所有应用都需要 ADALRedirectUri 或 ADALRedirectScheme。
ADALLogOverrideDisabled 布尔值 指定 SDK 是否将所有 MSAL 日志 (包括来自应用的 MSAL 调用(如果有任何) 路由到其自己的日志文件)。 默认为 NO。 如果应用设置了自己的 MSAL 日志回调,则设置为 YES。 可选。
ADALCacheKeychainGroupOverride String 指定用于 MSAL 缓存的 "com.microsoft.adalcache"密钥链组,而不是 。 系统会在运行时自动对此添加前缀。 可选。
AppGroupIdentifiers 字符串数组 应用权利 com.apple.security.application-groups 部分中的应用组数组。 如果应用使用应用程序组,则为必需。
ContainingAppBundleId String 指定扩展的包含应用程序的捆绑 ID。 对于 iOS 扩展是必需的。
AutoEnrollOnLaunch 布尔值 指定在检测到现有托管标识但尚未这样做的情况下,应用是否应尝试在启动时自动注册。 默认为 NO。

注意: 如果未找到托管标识或 MSAL 缓存中没有可用的有效令牌,除非是,否则 MAMPolicyRequired 注册会以静默方式失败。
可选。 默认为 NO。
MAMPolicyRequired 布尔值 指定在应用没有Intune应用保护策略时是否被阻止启动。 默认为 NO。

注意:应用不能提交到设置为“是”的App Store。 将其设置为“是”时, AutoEnrollOnLaunch 也应为“是”。
可选。 默认为 NO。
MAMPolicyWarnAbsent 布尔值 指定在不存在Intune应用保护策略的情况下,应用在启动期间是否警告用户。

注意: 用户仍然可以在消除警告后继续作。
可选。 默认为 NO。
MultiIdentity 布尔值 指定应用是否为多标识感知。 有关详细信息,请参阅 多标识文档 可选。 默认为 NO。
MultiIdentityCancelDisabled 布尔值 禁用多标识应用程序中Intune条件启动 UI 屏幕上的取消按钮。 如果此值未设置为“是”,则应用必须处理 IntuneMAMSwitchIdentityResultCanceled 失败代码。 请参阅 切换标识 可选。 默认为 NO。
SafariViewControllerBlockedOverride 布尔值 禁用Intune的 SafariViewController 挂钩,以通过 SFSafariViewController、SFAuthSession 或 ASWebAuthSession 启用 MSAL 身份验证。

注意: 仅当视图为非托管且设置为“是”时,才会显示配置的活动按钮。
可选。 默认为 NO。

警告: 如果使用不当,可能会导致数据泄漏。
SplashIconFile
SplashIconFile~ipad
String 指定Intune启动 (启动) 图标文件。 可选。
SplashDuration 数字 显示Intune启动屏幕的最短时间(秒)。 默认值为 1.5。 可选。
BackgroundColor String 指定Intune SDK UI 组件的背景色。 接受 #XXXXXX 或不带井号的十六进制值。 可选。 默认为系统背景色。
ForegroundColor String 指定 UI 组件的前景/文本颜色。 接受 #XXXXXX 或 不带磅符号的十六进制。 可选。 默认为系统标签颜色。
AccentColor String 指定 UI 组件 (按钮的主题色,PIN 框突出显示) 。 接受 #XXXXXX 或 不带磅符号的十六进制。 可选。 默认为系统蓝色。
SecondaryBackgroundColor String 指定 MTD 屏幕的辅助背景色。 接受 #XXXXXX 或 不带磅符号的十六进制。 可选。 默认为白色。
SecondaryForegroundColor String 指定 MTD 屏幕的辅助前景色。 接受 #XXXXXX 或 不带磅符号的十六进制。 可选。 默认为灰色。
SupportsDarkMode 布尔值 指定未设置显式颜色时 UI 颜色是否遵循系统深色模式。 可选。 默认为“是”。
MAMTelemetryDisabled 布尔值 指定是否将遥测数据发送到后端。 可选。 默认为 NO。
MAMTelemetryUsePPE 布尔值 将遥测数据发送到 PPE 后端。 对于测试应用非常有用,因此数据不会与客户数据混合使用。 可选。 默认为 NO。
MaxFileProtectionLevel String 指定应用支持的最大值 NSFileProtectionType 。 如果服务发送更高级别,则重写策略。

可能的值:NSFileProtectionCompleteNSFileProtectionCompleteUnlessOpen、、NSFileProtectionCompleteUntilFirstUserAuthenticationNSFileProtectionNone

通知: 使用 NSFileProtectionComplete,应用在设备锁定后大约 10 秒将失去对受保护文件的访问权限,这可能会中断本地数据库等组件。 具有锁屏界面 UI 的应用应使用 NSFileProtectionCompleteUntilFirstUserAuthentication
可选。 默认为 NSFileProtectionComplete
OpenInActionExtension 布尔值 对于“在作中打开”扩展,设置为“是”。 请参阅 通过 UIActivityViewController 共享数据 可选。
TreatAllWebViewsAsUnmanaged 布尔值 将所有 Web 视图视为非托管,以执行剪切/复制/粘贴。 请参阅 显示 Web 内容 可选。 默认为 NO。
WebViewHandledURLSchemes 字符串数组 应用的 WebView 处理的 URL 方案。 如果 WebView 处理链接或 JavaScript 导航,则是必需的。
DocumentBrowserFileCachePath String UIDocumentBrowserViewController如果使用 ,请为解密的托管文件设置相对于应用主目录) 的路径 (。 可选。 默认为 /Documents/
VerboseLoggingEnabled 布尔值 启用详细日志记录。 可选。 默认为 NO。
FinishLaunchingAtStartup 布尔值 使用 [BGTaskScheduler registerForTaskWithIdentifier:]时需要 ;必须是 YES。 可选。 默认为 NO。
ValuesToScrubFromLogging 字符串数组 应从日志中删除的应用程序配置值。 也可以通过 valuesToScrubFromLoggingIntuneMAMSettings进行设置。 可选。

接收应用保护策略

概述

若要接收Intune应用保护策略,应用必须使用 Intune MAM 服务发起注册请求。 可以在Intune管理中心中配置应用,以接收具有或不注册设备的应用保护策略。 移动应用程序管理 (MAM) 允许Intune管理应用,而无需将设备注册到Intune移动设备管理 (MDM) 。 在这两种情况下,都需要注册 Intune MAM 服务才能接收策略。

重要

当应用保护策略启用加密时,适用于 iOS 的 Intune 应用 SDK 使用 256 位加密密钥。 所有应用都需要具有当前 SDK 版本才能允许受保护的数据共享。

已使用 ADAL 或 MSAL 的应用

注意

Azure AD 身份验证 库 (ADAL) 和 Azure AD 图形 API 已弃用。 有关详细信息,请参阅 更新应用程序以使用 Microsoft 身份验证库 (MSAL) 和 Microsoft Graph API

已成功对用户进行身份验证后,已使用 MSAL 的应用应在实例上IntuneMAMEnrollmentManager调用 registerAndEnrollAccountId 方法:

/*
 *  This method adds the account to the list of registered accounts.
 *  An enrollment request starts immediately.
 *  @param accountId The Entra object ID of the account to be registered with the SDK
 */

(void)registerAndEnrollAccountId:(NSString *_Nonnull)accountId;

成功登录时,MSAL 在 MSALResult 对象中发送回结果。 使用 MSALResult 中的 tenantProfile.identifier 作为 API 的 accountId 参数。

通过调用 registerAndEnrollAccountId 方法,SDK 会注册用户帐户,并尝试代表此帐户注册应用。 如果注册因任何原因失败,SDK 会在 24 小时后自动重试注册。 出于调试目的,应用可以通过委托接收有关任何注册请求结果的 通知

调用此 API 后,应用可以继续正常运行。 如果注册成功,SDK 会通知用户需要重启应用。 此时,用户可以立即重启应用。

[[IntuneMAMEnrollmentManager instance] registerAndEnrollAccountId:@"3ec2c00f-b125-4519-acf0-302ac3761822"];

不使用 ADAL 或 MSAL 的应用

未使用 ADAL 或 MSAL 登录用户的应用仍可以通过调用 API 来让 SDK 处理该身份验证,从 Intune MAM 服务接收应用保护策略。 当应用尚未使用Microsoft Entra ID对用户进行身份验证,但仍需要检索应用保护策略以帮助保护数据时,应使用此技术。 例如,将另一个身份验证服务用于应用登录,或者该应用根本不支持登录。 为此,应用程序可以在 实例上IntuneMAMEnrollmentManager调用 loginAndEnrollAccount 方法:

/**
 *  Creates an enrollment request, which starts immediately.
 *  If no token can be retrieved for the identity, the user is prompted
 *  to enter their credentials, after which enrollment is retried.
 *  @param identity The UPN of the account to be logged in and enrolled.
 */
 (void)loginAndEnrollAccount: (NSString *)identity;

通过调用此方法,如果找不到现有令牌,SDK 会提示用户输入凭据。 然后,SDK 会尝试代表提供的用户帐户向 Intune MAM 服务注册应用。 可以使用“nil”作为标识来调用 方法。 在这种情况下,如果 MDM) ,SDK 会向设备上的现有托管用户注册 (;如果未找到现有用户,则提示用户输入用户名。

如果注册失败,应用应考虑将来再次调用此 API,具体取决于失败的详细信息。 应用可以通过委托接收有关任何注册请求结果的 通知

调用此 API 后,应用可以继续正常运行。 如果注册成功,SDK 会通知用户需要重启应用。 管理应用后,需要使用 enrolledAccountId 中的 IntuneMAMEnrollmentManager查询Microsoft Entra对象 ID 值。 将此 API 用于应用用于此注册帐户的所有 MAM SDK API。

示例:

[[IntuneMAMEnrollmentManager instance] loginAndEnrollAccount:@"user@foo.com"];

让Intune在启动时处理身份验证和注册

如果希望Intune SDK 在应用完成启动之前处理 ADAL/MSAL 的所有身份验证和注册,并且应用始终需要应用保护策略,则无需使用 loginAndEnrollAccount API。 可以在应用的 Info.plist 的 IntuneMAMSettings 字典中将以下设置设置为 YES。

Setting 类型类型 定义
AutoEnrollOnLaunch 布尔值 指定在检测到现有托管标识但尚未这样做的情况下,应用是否应尝试在启动时自动注册。 默认为 NO

注意: 如果未找到托管标识或标识的有效令牌在 ADAL/MSAL 缓存中可用,则注册尝试会无提示失败,且不会提示输入凭据,除非应用也 MAMPolicyRequired 设置为 “是”。
MAMPolicyRequired 布尔值 指定如果应用没有Intune应用保护策略,是否阻止应用启动。 默认为 NO

注意:应用不能提交到设置为“是”的MAMPolicyRequiredApp Store。 设置为MAMPolicyRequired“是”时,AutoEnrollOnLaunch还应设置为“是”。

如果为应用选择此选项,则无需在注册后重启应用。

取消注册用户帐户

在用户注销应用之前,应用应从 SDK 中注销用户。 此过程可确保:

  1. 用户帐户不再发生注册重试。

  2. 删除应用保护策略。

  3. 如果应用启动选择性擦除 (可选) ,则删除公司数据。

在用户注销之前,应用应在实例上 IntuneMAMEnrollmentManager 调用以下方法:

/*
 *  This method removes the provided account from the list of
 *  registered accounts. Once removed, if the account enrolled
 *  the application, the account is un-enrolled.
 *  @note In the case where an un-enroll is required, this method blocks
 *  until the Intune APP AAD token is acquired, then returns. This method must be called before
 *  the user is removed from the application (so that required AAD tokens are not purged
 *  before this method is called).
 *  @param accountId The object ID of the account to be removed.
 *  @param doWipe  If YES, a selective wipe if the account is un-enrolled
 */
(void)deRegisterAndUnenrollAccountId:(NSString *)accountId withWipe:(BOOL)doWipe;

在删除用户帐户的Microsoft Entra令牌之前,必须调用此方法。 SDK 需要用户帐户的Microsoft Entra令牌来代表用户向 Intune MAM 服务发出特定请求。

如果应用自行删除用户的公司数据,则可以将 doWipe 标志设置为 false。 否则,应用可以让 SDK 启动选择性擦除。 此作会导致调用应用的选择性擦除委托。

示例:

[[IntuneMAMEnrollmentManager instance] deRegisterAndUnenrollAccountId:@"3ec2c00f-b125-4519-acf0-302ac3761822" withWipe:YES];

状态、结果和调试通知

应用可以接收有关对 MAM 服务的以下请求的状态、结果和调试通知Intune:

  • 注册请求
  • 策略更新请求
  • 取消注册请求

通知通过 中的 IntuneMAMEnrollmentDelegate.h委托方法显示:

/**
 *  Called when an enrollment request operation is completed.
 * @param status status object containing debug information
 */

(void)enrollmentRequestWithStatus:(IntuneMAMEnrollmentStatus *)status;

/**
 *  Called when a MAM policy request operation is completed.
 *  @param status status object containing debug information
 */
(void)policyRequestWithStatus:(IntuneMAMEnrollmentStatus *)status;

/**
 *  Called when a un-enroll request operation is completed.
 *  @Note: when a user is un-enrolled, the user is also de-registered with the SDK
 *  @param status status object containing debug information
 */

(void)unenrollRequestWithStatus:(IntuneMAMEnrollmentStatus *)status;

这些委托方法返回一个 IntuneMAMEnrollmentStatus 对象,该对象包含以下信息:

  • 与请求关联的帐户的 accountId (对象 ID)
  • 与请求关联的帐户的标识 (UPN)
  • 指示请求结果的状态代码
  • 包含状态代码说明的错误字符串
  • 对象 NSError 。 此对象在 中 IntuneMAMEnrollmentStatus.h定义,以及可返回的特定状态代码。

示例代码

下面是委托方法的示例实现:

- (void)enrollmentRequestWithStatus:(IntuneMAMEnrollmentStatus*)status
{
    NSLog(@"enrollment result for identity %@ with status code %ld", status.accountId, (unsigned long)status.statusCode);
    NSLog(@"Debug Message: %@", status.errorString);
}

- (void)policyRequestWithStatus:(IntuneMAMEnrollmentStatus*)status
{
    NSLog(@"policy check-in result for identity %@ with status code %ld", status.accountId, (unsigned long)status.statusCode);
    NSLog(@"Debug Message: %@", status.errorString);
}

- (void)unenrollRequestWithStatus:(IntuneMAMEnrollmentStatus*)status
{
    NSLog(@"un-enroll result for identity %@ with status code %ld", status.accountId, (unsigned long)status.statusCode);
    NSLog(@"Debug Message: %@", status.errorString);
}

应用程序重启

当应用首次收到 MAM 策略时,必须重启才能应用所需的挂钩。 为了通知应用需要重启,SDK 在 中 IntuneMAMPolicyDelegate.h提供了委托方法。

 - (BOOL) restartApplication

此方法的返回值告知 SDK 应用程序是否必须处理所需的重启:

  • 如果返回 true,则应用程序必须处理重启。

  • 如果返回 false,则 SDK 将在此方法返回后重启应用程序。 SDK 立即显示一个对话框,告知用户重启应用程序。

注意

.NET MAUI 应用不需要重启。

退出条件

配置生成插件或将命令行工具集成到生成过程中后,验证它是否成功运行:

  • 确保生成成功编译和生成。
  • 启动已编译的应用,使用不是应用保护策略目标的Microsoft Entra用户登录,并确认应用按预期运行。
  • 注销并使用应用保护策略面向的Microsoft Entra用户重复此测试,并确认应用现在由 Intune 管理并重新启动。

此时,在集成中,你的应用现在可以接收并强制实施应用保护策略。 执行以下测试以验证集成。

第一个策略应用程序测试

首先执行以下测试,以熟悉应用中策略应用程序的完整最终用户体验:

  1. 在 Microsoft Intune 管理中心中创建 iOS 应用保护策略。 对于此测试,请配置策略:
    • 在“访问要求”下,保留默认设置。 值得注意的是,“用于访问的 PIN”应为“必需”。
  2. 确保应用保护策略面向应用程序。 可能需要在策略创建向导中手动添加应用程序的捆绑 ID。
  3. 将应用保护策略分配给包含测试帐户的用户组。
  4. 安装应用程序。
  5. 使用应用保护策略面向的测试帐户登录到应用程序。
  6. 确认系统提示你显示Intune托管屏幕,并确认提示会重启应用。 此屏幕指示 SDK 已成功检索此帐户的策略。
  7. 当系统提示你设置应用 PIN 时,请创建 PIN。
  8. 从应用程序注销托管帐户。
  9. 在应用程序周围导航,并确认应用按预期运行(如果可能),而无需登录。

此步骤列表是用于确认应用正确注册帐户、注册身份验证回调以及取消注册帐户的“最起码”测试。 执行以下测试以更彻底地验证其他应用保护策略设置如何修改应用程序的行为。

后续步骤

完成所有 退出条件后,继续学习 阶段 4:应用参与功能