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

注意

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

阶段目标

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

先决条件

  • 需要安装 Xcode 14.0 或更高版本的 macOS 计算机。

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

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

  • GitHub 上下载 Intune App SDK for iOS 的文件。

SDK 存储库中的内容

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

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

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

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

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

  • IntuneMAMResources.bundle:包含 SDK 所依赖的资源的资源捆绑包。 仅对于将已弃用的静态库 (libIntuneMAMSwift.xcframework) 集成的应用,并且将在将来的更新中删除资源组。

Intune 应用 SDK 的工作原理

适用于 iOS 的 Intune App SDK 的目标是将管理功能添加到 iOS 应用程序,只需对代码进行最少更改。 代码越少,上市时间越短,但不会影响移动应用程序的一致性和稳定性。

流程流

下图提供了 Intune App SDK for iOS 进程流:

Microsoft Intune 的高级体系结构图。

将 SDK 构建到移动应用中

重要

Intune 定期发布 Intune 应用 SDK 的更新。 定期检查 Intune App SDK for iOS 是否有更新,并纳入软件开发发布周期,以确保你的应用支持最新的应用保护策略设置。

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

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

    Intune App 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 文件、搜索 密钥链访问组并确保具有通配符来对此进行检查。 例如:

    <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 App SDK iOS:密钥链共享

    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-intunemam、、microsoft-edge-http-intunemam、、 lacoonsecuritysmart-nswanderalookoutwork-aseskycurezipsmicrosoft-edge-https-intunemamsmsecmvisionmobilebetteractiveshieldscmxintunemam-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 配置要求发生更改。

Xcode 生成设置

应用应同时将“条带 Swift 符号” (STRIP_SWIFT_SYMBOLS) 和“启用 Bitcode” (ENABLE_BITCODE) 设置为 NO。

集成文件提供程序扩展

文件提供程序扩展具有某些内存要求,这可能会使集成完整 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 进行加密。 如果是,则使用 DecryptFile:toCopyPath: API of IntuneMAMFileProtectionManager 对其进行解密。 在多标识应用中,还要检查目标所有者 IntuneMAMPolicy 中的 canReceiveSharedFile: API,以查看所有者是否可以接收该文件。

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

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

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

在 - createItemBasedOnTemplate:fields:contents:options:request:completionHandler:检查文件是否使用 intuneMAMFileProtectionManager 中的 isFileEncrypted: API 进行加密。 如果是,则使用 DecryptFile:toCopyPath: API of IntuneMAMFileProtectionManager 对其进行解密。 在多标识应用中,还要检查目标所有者 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”。 请注意,这没有 app-id 前缀。 这将作为运行时提供的字符串的前缀。 可选。
AppGroupIdentifiers 字符串数组 应用权利 com.apple.security.application-groups 部分中的应用组数组。 如果应用使用应用程序组,则为必需。
ContainingAppBundleId String 指定扩展的包含应用程序的捆绑 ID。 对于 iOS 扩展是必需的。
AutoEnrollOnLaunch 布尔值 指定在检测到现有托管标识但尚未这样做的情况下,应用是否应尝试在启动时自动注册。 默认为 NO。

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

注意:如果 MAMPolicyRequired 设置为 YES,则无法将应用提交到 App Store。 将 MAMPolicyRequired 设置为“是”时,AutoEnrollOnLaunch 也应设置为“是”。
可选。 默认为否。
MAMPolicyWarnAbsent 布尔值 指定如果应用没有 Intune 应用保护策略,应用是否会在启动期间警告用户。

注意:在消除警告后,仍允许用户在没有策略的情况下使用应用。
可选。 默认为否。
MultiIdentity 布尔值 指定应用是否为多标识感知。 可选。 默认为否。
SafariViewControllerBlockedOverride 布尔值 禁用 Intune 的 SafariViewController 挂钩,以通过 SFSafariViewController、SFAuthSession 或 ASWebAuthSession 启用 MSAL 身份验证。

注意:Intune 的托管 Safari 视图控制器不支持 SFSafariViewControllerConfiguration 活动按钮属性 。 如果视图是非托管的,并且 SafariViewControllerBlockedOverride 设置为 yes,则配置 的活动按钮 才会显示在 SafariViewController 中。
可选。 默认为否。 警告:如果使用不当,可能会导致数据泄露。 仅当绝对必要时才启用 。 有关详细信息,请参阅 使用 MSAL 进行应用发起的身份验证时的特殊注意事项
SplashIconFile
SplashIconFile~ipad
String 指定 Intune 初始 (启动) 图标文件。 可选。
SplashDuration 数字 应用程序启动时显示 Intune 启动屏幕的最短时间(以秒为单位)。 默认值为 1.5。 可选。
BackgroundColor String 指定 Intune SDK 的 UI 组件的背景色。 接受 #XXXXXX 形式的十六进制 RGB 字符串,其中 X 的范围为 0-9 或 A-F。 可能会省略井号。 可选。 默认为系统背景色,它可能因 iOS 版本和 iOS 深色模式设置而异。
ForegroundColor String 指定 Intune SDK UI 组件的前景色,例如文本颜色。 接受 #XXXXXX 形式的十六进制 RGB 字符串,其中 X 的范围为 0-9 或 A-F。 可能会省略井号。 可选。 默认为系统标签颜色,它可能因 iOS 版本和 iOS 深色模式设置而异。
AccentColor String 指定 Intune SDK UI 组件的主题色,例如按钮文本颜色和 PIN 框突出显示颜色。 接受 #XXXXXX 形式的十六进制 RGB 字符串,其中 X 的范围为 0-9 或 A-F。 可能会省略井号。 可选。 默认为系统蓝色。
SecondaryBackgroundColor String 指定 MTD 屏幕的辅助背景色。 接受 #XXXXXX 形式的十六进制 RGB 字符串,其中 X 的范围为 0-9 或 A-F。 可能会省略井号。 可选。 默认为白色。
SecondaryForegroundColor String 指定 MTD 屏幕的辅助前景色,如脚注颜色。 接受 #XXXXXX 形式的十六进制 RGB 字符串,其中 X 的范围为 0-9 或 A-F。 可能会省略井号。 可选。 默认为灰色。
SupportsDarkMode 布尔值 指定如果未为 BackgroundColor/ForegroundColor/AccentColor 设置显式值,则 Intune SDK 的 UI 配色方案是否应观察系统深色模式设置 可选。 默认为“是”。
MAMTelemetryDisabled 布尔值 指定 SDK 是否不会将任何遥测数据发送到其后端。 可选。 默认为否。
MAMTelemetryUsePPE 布尔值 指定 MAM SDK 是否将数据发送到 PPE 遥测后端。 使用 Intune 策略测试应用时使用此策略,以便测试遥测数据不会与客户数据混为一谈。 可选。 默认为否。
MaxFileProtectionLevel String 允许应用指定它可以支持的最大 NSFileProtectionType 值。 如果级别高于应用程序可以支持的级别,则此值将替代服务发送的策略。 可能的值:NSFileProtectionCompleteNSFileProtectionCompleteUnlessOpen、、NSFileProtectionCompleteUntilFirstUserAuthenticationNSFileProtectionNone。 注意:使用最高文件保护级别 (NSFileProtectionComplete) 时,只能在设备解锁时访问受保护的文件。 设备锁定 10 秒后,应用将失去对受保护文件的访问权限。 在某些情况下,这可能会导致无法访问内部组件 ((例如 MySQL 数据库) ),从而导致意外行为。 建议显示锁屏界面 UI 元素的应用程序将此值设置为 NSFileProtectionCompleteUntilFirstUserAuthentication 可选。 默认为 NSFileProtectionComplete
OpenInActionExtension 布尔值 对于“在操作中打开”扩展,设置为“是”。 有关详细信息,请参阅 通过 UIActivityViewController 共享数据 部分。
WebViewHandledURLSchemes Array of Strings 指定应用的 WebView 处理的 URL 方案。 如果你的应用使用通过链接和/或 JavaScript 处理 URL 的 WebView,则是必需的。
DocumentBrowserFileCachePath String 如果你的应用使用 UIDocumentBrowserViewController 浏览各种文件提供程序中的文件,则可以在应用程序沙盒中相对于主目录设置此路径,以便 Intune SDK 可以将解密的托管文件放入该文件夹中。 可选。 默认为 /Documents/ 目录。
VerboseLoggingEnabled 布尔值 如果设置为“是”,Intune 将以详细模式登录。 可选。 默认值为 NO
FinishLaunchingAtStartup 布尔值 如果应用正在使用 [BGTaskScheduler registerForTaskWithIdentifier:] ,则此设置应设置为“是”。 可选。 默认值为 NO
ValuesToScrubFromLogging Array of Strings 指定应从日志中清除的应用程序配置值。 或者,可以为 IntuneMAMSettings 类上的 valuesToScrubFromLogging 属性提供相同行为的字符串数组。 可选。

接收应用保护策略

概述

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

重要

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

已使用 ADAL 或 MSAL 的应用

注意

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

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

/*
 *  This method will add the account to the list of registered accounts.
 *  An enrollment request will immediately be started.
 *  @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 is started immediately.
 *  If no token can be retrieved for the identity, the user will be prompted
 *  to enter their credentials, after which enrollment will be retried.
 *  @param identity The UPN of the account to be logged in and enrolled.
 */
 (void)loginAndEnrollAccount: (NSString *)identity;

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

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

调用此 API 后,应用可以继续正常运行。 如果注册成功,SDK 将通知用户需要重启应用。 管理应用后,需要使用 enrolledAccountId 中的 IntuneMAMEnrollmentManager查询 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 设置为 YES,否则注册尝试将以静默方式失败,而不会提示输入凭据。
MAMPolicyRequired 布尔值 指定在应用没有 Intune 应用保护策略时是否阻止应用启动。 默认为 NO。

注意:如果 MAMPolicyRequired 设置为 YES,则无法将应用提交到 App Store。 将 MAMPolicyRequired 设置为“是”时,AutoEnrollOnLaunch 也应设置为“是”。

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

取消注册用户帐户

在用户注销应用之前,应用应从 SDK 中注销用户。 这将确保:

  1. 用户帐户将不再进行注册重试。

  2. 将删除应用保护策略。

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

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

/*
 *  This method will remove the provided account from the list of
 *  registered accounts.  Once removed, if the account has enrolled
 *  the application, the account will be un-enrolled.
 *  @note In the case where an un-enroll is required, this method will block
 *  until the Intune APP AAD token is acquired, then return.  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];

状态、结果和调试通知

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

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

通知通过 中的 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 立即显示一个对话框,告知用户重启应用程序。

退出条件

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

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

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

第一个策略应用程序测试

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

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

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

后续步骤

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