iOSのMDX API

iOS用のXenMobile APIはObjective-Cに基づいています。ここでは、Citrix Endpoint Management APIを機能別に概説し、APIの定義を説明します。

アプリの管理

  • isAppManaged

Secure Hubの操作

  • isMDXAccessManagerInstalled
  • logonMdxWithFlag
  • +(BOOL) isAppLaunchedByWorxHome;

MDXポリシー

  • getValueOfPolicy

共有コンテナー

  • getVaultDataFromVault
  • saveVaultData
  • updateAndSynchronizeVaultItem
  • updateAndSynchronizeVaultItems
  • deleteVault
  • deleteVaultWithError

ユーザーデータ

  • managedUserInformation

クラスMdxManager

メソッド

  • getValueOfPolicy

    +(NSString*) getValueOfPolicy:(NSString*)policyName error:(NSError **) error;

    管理対象アプリの場合、Citrix Endpoint Management管理者が設定したポリシー値を返します。非管理対象のPremiumアプリの場合、Applications/Citrix/MDXToolkit/data/MDXSDK/default_policies.xmlに設定されたポリシー値を返します。非管理対象のGeneralアプリの場合、nilを返します。

    パラメーター:

    policyName – default_policies.xmlで検索するポリシーの名前。

    例:

    +(NSString*) getValueOfPolicy:(NSString*)DisableCamera error:(NSError **) error;

  • isMDXAccessManagerInstalled

    +(BOOL) isMDXAccessManagerInstalled: (NSError **) error;

    Secure Hubがインストールされているか確認します。インストールされている場合、アプリが管理対象ではない場合もアプリのMDX制御は有効です。Secure Hubがインストールされている場合、trueを返します。

  • isAppManaged

    +(BOOL) isAppManaged;

    アプリが現在MDXによって管理されているかを確認します。つまり、MDXポリシーバンドルはXMLファイルとしてアプリに組み込まれています。Citrix Endpoint Managementバックエンドインフラストラクチャ(キーコンテナー)に対して、アプリデータベースのデータ暗号化にMDXが使用するデータ暗号化部分キー(シークレット)がクエリされます(iOS 9)。アプリが管理対象の場合、trueを返します。

  • logonMdxWithFlag

    +(BOOL) logonMdxWithFlag:(BOOL)force error:(NSError**) error;

    Secure HubでMDXログオン要求を開始します。

  • isAppLaunchedByWorxHome

    +(BOOL) isAppLaunchedByWorxHome;

    アプリ間のURL要求が、Secure Hubからか、デバイス上の他のアプリからなのかを確認します。これは、アプリがMDX制御の通信を認識する必要がある場合に必要です。iOSでは、アプリが特定のURLスキーマを登録できます。URLスキーマはURLの最初の部分です(コロンの前まで。コロンは含みません)。URLがhttp://で始まる場合、スキーマはhttpです。

    MDX対応のアプリおよびSecure Hubは、カスタムURLスキーマを使用して通信します。たとえば、他のアプリからのmailto: URLを処理するには、Secure MailはURLスキーマctxmailが必要です。他のアプリからのhttp URLまたはhttps URLを処理するには、Secure WebはそれぞれURLスキーマctxmobilebrowserまたはctxmobilebrowsersが必要です。MDXアプリURLスキーマポリシーおよび許可するURLポリシーについて詳しくは、MDX Toolkitのドキュメントの「iOSアプリのMDXポリシー」を参照してください。

    次のUIApplication代理イベント呼び出しの最中または後で、クエリが実行される時間や場所に関係なく、正確な結果を返します。

    • アプリがホーム画面またはopenURL呼び出しからロードする場合:

      application:willFinishLaunchingWithOptions:
      
      application:didFinishLaunchingWithOptions:
      
      applicationDidFinishLaunching:
      
    • ユーザーがデバイスホーム画面からアプリをアクティブ化または非アクティブ化する場合:

      applicationDidBecomeActive:
      

    重要:

    applicationWillEnterForeground:の実行中にクエリを実行しないでください。

    • openURL呼び出しによってアプリをアクティブ化または非アクティブ化する場合:

      application:openURL:sourceApplication:annotation:
      
      application:handleOpenURL:
      
  • managedUserInformation

    extern __attribute__((visibility ("default"))) NSString *const kXenMobileUsername; +(NSDictionary*) managedUserInformation;

    ユーザーのサインイン状態に関係なく、MDX管理対象アプリを実行する登録されたユーザーのUserNameを含む文字列を返します。ユーザーが登録されていない場合、アプリが管理対象でない場合、またはアプリがラップされていない場合は、空の文字列を返します。

Class XenMobileSharedKeychainVault

メソッド

  • initWithVaultName

    - (instancetype) initWithVaultName:(NSString*)vaultName accessGroup:(NSString*)accessGroup;

    Citrix Endpoint Management共有コンテナーを初期化します。

    共有コンテナーAPIを使用して、同じキーチェーンアクセスグループを持つアプリ間で管理対象コンテンツを共有します。たとえば、登録されたアプリを介してユーザー証明書を共有できるため、アプリはSecure Hubからではなくセキュアなコンテナーから証明書を取得できます。

    パラメーター:

    vaultName – Citrix Endpoint Management共有コンテナーの名前。

    accessGroup – キーチェーンアクセスグループの名前。これは、TEAMID_A.appOriginalBundleIDという名前のデフォルトのMDXアクセスグループ、またはアプリ間でデータを共有するために使用するキーチェーンアクセスグループの場合があります。

  • コンテナーデータ型プロパティ

       @property(nonatomic,readonly) BOOL exists;
    
       @property(nonatomic,readonly) BOOL isAccessible;
    
       @property(nonatomic,strong) NSMutableDictionary* vaultData
    

    コンテナーを初期化した後で、以下のコンテナーデータ型プロパティが返されます。

    exists – 指定されたvaultNameのコンテナーが検出されたかどうかを示します。

    isAccessible – 指定されたaccessGroupにコンテナーがあるかどうか、およびコンテナーにアクセスできるかどうかを示します。

    vaultData – 共有コンテナーのコンテンツです。コンテナーを初めて初期化する場合、vaultDataはnilディクショナリです。

  • getVaultDataFromVault

    + (NSDictionary*) getVaultDataFromVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    Citrix Endpoint Management共有コンテナーからデータを読み取ります。これは、以下に示す、コンテナーデータを読み取る3つの方法のうちの1つです。

    • getVaultDataFromVault:accessGroup:errorを直接使用する。

    • XenMobileSharedKeychainVaultインスタンスを作成して、vaultDataプロパティを読み取る。

    • XenMobileSharedKeychainVaultインスタンスを作成してから、-(BOOL) loadDataWithError:(NSError *__autoreleasing *)error;を使用してvaultDataプロパティを読み取って、コンテナーデータをリロードする。

    サンプルコードについては、この記事の「共有コンテナーのサンプル」を参照してください。

    パラメーター:

    vaultName – Citrix Endpoint Management共有コンテナーの名前。

    accessGroup – キーチェーンアクセスグループの名前。これは、TEAMID_A.appOriginalBundleIDという名前のデフォルトのMDXアクセスグループ、またはアプリ間でデータを共有するために使用するキーチェーンアクセスグループの場合があります。

  • saveVaultData

    + (BOOL) saveVaultData:(NSDictionary*)vaultData toVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    Citrix Endpoint Management共有コンテナーにデータを保存します。これは、以下に示す、コンテナーデータを保存する3つの方法のうちの1つです。

    • saveVaultData:toVault:accessGroup:error:を直接使用する。

    • updateAndSynchronizeVaultItem:またはupdateAndSynchronizeVaultItemsを使用する(この表の次の部分で説明)。

    • XenMobileSharedKeychainVaultインスタンスを作成し、コンテナーデータをロードして変更し、データを同期させて、- (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error;を使用する。

    サンプルコードについては、この記事の「共有コンテナーのサンプル」を参照してください。

    パラメーター:

    vaultData – Citrix Endpoint Management共有コンテナーに保存するデータ。共有コンテナーに保存するデータは、@{@”username”:@”andreo”}などのキー/値ペアのディクショナリです。

    vaultName – Citrix Endpoint Management共有コンテナーの名前。

    accessGroup – キーチェーンアクセスグループの名前。これは、TEAMID_A.appOriginalBundleIDという名前のデフォルトのMDXアクセスグループ、またはアプリ間でデータを共有するために使用するキーチェーンアクセスグループの場合があります。

  • updateAndSynchronizeVaultItem

    updateAndSynchronizeVaultItems

    - (BOOL)updateAndSynchronizeVaultItem:(NSString*)vaultItem withValue:(id)itemValue error:(NSError *__autoreleasing *)error;

    - (BOOL)updateAndSynchronizeVaultItems:(NSDictionary*)vaultItems error:(NSError *__autoreleasing *)error;

    Citrix Endpoint Management共有コンテナーのデータを更新します。この方法を使用するためには、XenMobileSharedKeychainVaultインスタンスを作成し、コンテナーデータアイテムを追加または更新してこのインスタンスを同期します。たとえば、既存のコンテナーエントリに{a:123, b:234, c:305}を使用している場合、このAPIをデータに使用して{c:345, d:456}を更新すると、このAPIによってコンテナーデータが{a:123, b:234, c:345, d:456}に更新されます。サンプルコードについては、この記事の「共有コンテナーのサンプル」を参照してください。

    コンテナーデータを保存する他の2つの方法については、上記のsaveVaultDataを参照してください。

    パラメーター:

    vaultItem@{@";username::@"andreo"}の形式の単一のキー/値ペア。

    vaultItems – キー/値ペアのリスト。

  • deleteVault

    + (BOOL) deleteVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    指定の共有コンテナーを削除します。

    パラメーター:

    vaultName – Citrix Endpoint Management共有コンテナーの名前。

    accessGroup – 削除対象のコンテナーによって使用されているキーチェーンアクセスグループの名前。

  • deleteVaultWithError

    -(BOOL) deleteVaultWithError:(NSError *__autoreleasing *)error;

    XenMobileSharedKeychainVaultインスタンスにより返された共有コンテナーを削除します。deleteVaultWithErrorで削除した後で、オブジェクトを解放する必要があります。

共有コンテナーのサンプル

#import "XenMobileSharedKeychainVault.h"

@interface ClassA ()
...
@property(nonatomic,strong) XenMobileSharedKeychainVault* XenMobileSharedKeychainVault;
...
@end

@implementation ClassA
...
@synthesize XenMobileSharedKeychainVault = _XenMobileSharedKeychainVault;


...
#ifdef USE_CLASS_INSTANCE_METHODS
-(XenMobileSharedKeychainVault*)XenMobileSharedKeychainVault
{
if(_XenMobileSharedKeychainVault==nil) {
_XenMobileSharedKeychainVault = [[XenMobileSharedKeychainVault alloc]
      initWithVaultName:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup];
}
return _XenMobileSharedKeychainVault;
}
#endif

-(void)read
{
NSError* error=nil;
#ifdef USE_CLASS_INSTANCE_METHODS
NSDictionary* vaultDictionary = nil;
if([self.XenMobileSharedKeychainVault loadDataWithError:&error]) {
vaultDictionary = [self.XenMobileSharedKeychainVault vaultData];
}
#else
NSDictionary* vaultDictionary = [XenMobileSharedKeychainVault
      getVaultDataFromVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

-(void)save
{
NSError* error=nil;
/// check error handling here...

NSDictionary* dictToSave = @{<VAULT_DATA_DICTIONARY_OBJECTS>};
#ifdef USE_CLASS_INSTANCE_METHODS
#ifdef USE_CLASS_INSTANCE_METHODS_TO_UPDATE
BOOL result = [self.XenMobileSharedKeychainVault
      updateAndSynchronizeVaultItems:dictToSave error:&error];
#else
self.XenMobileSharedKeychainVault.vaultData = [NSMutableDictionary
      dictionaryWithDictionary:dictToSave];
BOOL result = [self.XenMobileSharedKeychainVault synchronizeWithError:&error];
#endif
#else
BOOL result = [XenMobileSharedKeychainVault
      saveVaultData:dictToSave toVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

-(void)delete
{
NSError* error=nil;
#ifdef USE_CLASS_INSTANCE_METHODS
BOOL result = [self.XenMobileSharedKeychainVault deleteVaultWithError:&error];
#else
BOOL result = [XenMobileSharedKeychainVault deleteVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

...

@end