共有デバイス モードをサポートするように iOS または iPadOS アプリケーションを変更する

このチュートリアルでは、共有デバイス モード (SDM) をサポートするように iOS または iPadOS アプリケーションを変更する方法について説明します。 SDM は、組織が複数の従業員間で簡単に共有できるように iOS、iPadOS、または Android デバイスを構成できるようにするMicrosoft Entra ID機能です。これは、現場担当者設定の一般的な方法です。

このチュートリアルでは、次の操作を行います。

  • 単一アカウント モードのサポートを追加しました。
  • SDM を使用するようにアプリを構成します。
  • 共有デバイス モードを検出します。
  • サインインしているユーザーが変更されたかどうかを確認します。

Prerequisites

共有デバイス モードを検出する

共有デバイス モードの検出は、アプリケーションにとって重要です。 多くのアプリケーションでは、共有デバイスでアプリケーションを使用するときに、ユーザー エクスペリエンス (UX) を変更する必要があります。 たとえば、アプリケーションに "サインアップ" 機能があるとします。これは、既にアカウントを持っている可能性があるため、現場担当者には適していません。 共有デバイス モードの場合は、アプリケーションのデータ処理にセキュリティを強化することもできます。

getDeviceInformationWithParameters:completionBlock:MSALPublicClientApplication API を使用して、アプリが共有デバイス モードでデバイスで実行されているかどうかを判断します。

次のコード スニペットは、 getDeviceInformationWithParameters:completionBlock: API の使用例を示しています。

Swift

application.getDeviceInformation(with: nil, completionBlock: { (deviceInformation, error) in

    guard let deviceInfo = deviceInformation else {
        return
    }

    let isSharedDevice = deviceInfo.deviceMode == .shared
    // Change your app UX if needed
})

Objective-C

[application getDeviceInformationWithParameters:nil
                                completionBlock:^(MSALDeviceInformation * _Nullable deviceInformation, NSError * _Nullable error)
{
    if (!deviceInformation)
    {
        return;
    }

    BOOL isSharedDevice = deviceInformation.deviceMode == MSALDeviceModeShared;
    // Change your app UX if needed
}];

サインインしているユーザーを取得し、ユーザーがデバイスで変更されたかどうかを判断する

共有デバイス モードをサポートするもう 1 つの重要な部分は、デバイス上のユーザーの状態を判断し、ユーザーが変更された場合、またはデバイスにユーザーがまったくいない場合にアプリケーション データをクリアすることです。 データが別のユーザーに漏洩しないようにする責任があります。

getCurrentAccountWithParameters:completionBlock: API を使用して、デバイスで現在サインインしているアカウントに対してクエリを実行できます。

Swift

let msalParameters = MSALParameters()
msalParameters.completionBlockQueue = DispatchQueue.main

application.getCurrentAccount(with: msalParameters, completionBlock: { (currentAccount, previousAccount, error) in

    // currentAccount is the currently signed in account
    // previousAccount is the previously signed in account if any
})

Objective-C

MSALParameters *parameters = [MSALParameters new];
parameters.completionBlockQueue = dispatch_get_main_queue();

[application getCurrentAccountWithParameters:parameters
                             completionBlock:^(MSALAccount * _Nullable account, MSALAccount * _Nullable previousAccount, NSError * _Nullable error)
{
    // currentAccount is the currently signed in account
    // previousAccount is the previously signed in account if any
}];

ユーザーをグローバルにサインインさせる

デバイスが共有デバイスとして構成されている場合、アプリケーションは acquireTokenWithParameters:completionBlock: API を呼び出してアカウントにサインインできます。 アカウントは、最初のアプリがアカウントにサインインした後、デバイス上のすべての対象アプリでグローバルに利用できるようになります。

Objective-C

MSALInteractiveTokenParameters *parameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"api://myapi/scope"] webviewParameters:[self msalTestWebViewParameters]];

parameters.loginHint = self.loginHintTextField.text;

[application acquireTokenWithParameters:parameters completionBlock:completionBlock];

ユーザーをグローバルにサインアウトさせる

次のコードは、サインインしているアカウントを削除し、キャッシュされたトークンをアプリだけでなく、共有デバイス モードのデバイスからもクリアします。 ただし、アプリケーションから データ をクリアすることはありません。 アプリケーションからデータをクリアし、アプリケーションがユーザーに表示している可能性があるキャッシュされたデータをクリアする必要があります。

Swift

let account = .... /* account retrieved above */

let signoutParameters = MSALSignoutParameters(webviewParameters: self.webViewParamaters!)
signoutParameters.signoutFromBrowser = true // To trigger a browser signout in Safari.

application.signout(with: account, signoutParameters: signoutParameters, completionBlock: {(success, error) in
    if let error = error {

        // Signout failed

        return

    }

    // Sign out completed successfully

})

Objective-C

MSALAccount *account = ... /* account retrieved above */;

MSALSignoutParameters *signoutParameters = [[MSALSignoutParameters alloc] initWithWebviewParameters:webViewParameters];

signoutParameters.signoutFromBrowser = YES; // To trigger a browser signout in Safari.

[application signoutWithAccount:account signoutParameters:signoutParameters completionBlock:^(BOOL success, NSError * _Nullable error)

{

    if (!success)

    {

        // Signout failed

        return;

    }

    // Sign out completed successfully

}];

Apple デバイス用の Microsoft Enterprise SSO プラグインは、アプリケーションの状態のみをクリアします。 Safari ブラウザーでは状態がクリアされません。 コード スニペットに示されている省略可能な signoutFromBrowser プロパティを使用して、Safari でブラウザーのサインアウトをトリガーできます。 これにより、ブラウザーがデバイス上で短時間起動します。

ブロードキャストを受信して、他のアプリケーションから開始されたグローバル サインアウトを検出する

アカウント変更ブロードキャストを受信するには、ブロードキャスト レシーバーを登録する必要があります。 アカウント変更ブロードキャストを受信したら、すぐに サインインしているユーザーを取得し、デバイスでユーザーが変更されたかどうかを判断します。 変更が検出された場合は、前にサインインしていたアカウントのデータのクリーンアップを開始します。 すべての操作を適切に停止し、データのクリーンアップを行うことをお勧めします。

次のコード スニペットは、ブロードキャスト レシーバーを登録する方法を示しています。

NSString *const MSAL_SHARED_MODE_CURRENT_ACCOUNT_CHANGED_NOTIFICATION_KEY = @"SHARED_MODE_CURRENT_ACCOUNT_CHANGED";

- (void) registerDarwinNotificationListener 

{ 

   CFNotificationCenterRef center =

   CFNotificationCenterGetDarwinNotifyCenter(); 

   CFNotificationCenterAddObserver(center, nil,

   sharedModeAccountChangedCallback,

   (CFStringRef)MSAL_SHARED_MODE_CURRENT_ACCOUNT_CHANGED_NOTIFICATION_KEY, 

   nil, CFNotificationSuspensionBehaviorDeliverImmediately); 

} 

// CFNotificationCallbacks used specifically for Darwin notifications leave userInfo unused 

void sharedModeAccountChangedCallback(CFNotificationCenterRef center, void * observer, CFStringRef name, void const * object, __unused CFDictionaryRef userInfo) 

{ 

    // Invoke account cleanup logic here 

} 

CFNotificationAddObserverまたは Swift で対応するメソッド シグネチャを表示するために使用できるオプションの詳細については、次を参照してください。

iOS の場合、アプリにはバックグラウンドでアクティブな状態を維持し、Darwin の通知をリッスンするためのバックグラウンド アクセス許可が必要です。 バックグラウンド機能は、別のバックグラウンド操作をサポートするために追加する必要があります。このアプリには、Darwin の通知をリッスンするだけのバックグラウンド機能がある場合、Apple App Store から拒否される可能性があります。 アプリが既にバックグラウンド操作を完了するように構成されている場合は、その操作の一部としてリスナーを追加できます。 iOS のバックグラウンド機能の詳細については、「バックグラウンド実行モードの構成」を参照してください。

共有デバイス モードをサポートする Microsoft アプリケーション

次のMicrosoft アプリケーションでは、共有デバイス モードMicrosoft Entraサポートされています。

Important

パブリック プレビューはサービス レベル アグリーメントなしで提供され、運用環境のワークロードには推奨されません。 一部の機能はサポートされていないか、機能が制限されている可能性があります。 詳細については、「 オンライン サービスのユニバーサル ライセンス条項」を参照してください。

共有デバイス モードをサポートするサード パーティの MMM

次のサード パーティ製モバイル デバイス管理 (MDM) プロバイダーは、共有デバイス モードMicrosoft Entraサポートしています。

次のステップ

共有デバイス モードの動作を確認するには、GitHubの次のコード サンプルに、共有デバイス モードで iOS デバイスで現場担当者アプリを実行する例を示します。

MSAL iOS Swift Microsoft Graph API サンプル