适用于 iOS 的 API
XenMobile 适用于 iOS 的 API 基于 Objective-C。本文按功能总结了 Citrix Endpoint Management™ API,并提供了 API 定义。
应用程序管理
- isAppManaged
与 Secure Hub 交互
- isMDXAccessManagerInstalled
- logonMdxWithFlag
-
isAppLaunchedByWorxHome
-
MDX 策略
-
getValueOfPolicy
-
共享保管库
- getVaultDataFromVault
- saveVaultData
- updateAndSynchronizeVaultItem
- updateAndSynchronizeVaultItems
- deleteVault
- deleteVaultWithError
用户数据
-
managedUserInformation
-
MdxManager 类
方法
-
getValueOfPolicy
-
+(NSString*) getValueOfPolicy:(NSString*)policyName error:(NSError **) error;对于托管应用程序,返回由 Citrix Endpoint Management 管理员设置的策略值。对于非托管高级应用程序,返回在 Applications/Citrix/MDXToolkit/data/MDXSDK/default_policies.xml 中设置的策略值。对于非托管通用应用程序,返回 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 或 https URL,Secure Web 分别需要 URL 方案 ctxmobilebrowser 或 ctxmobilebrowsers。有关 MDX 应用程序 URL 方案策略和允许的 URL 策略的详细信息,请参阅适用于 iOS 应用程序的 MDX 策略。
在以下 UIApplication 委托事件调用期间或之后,随时随地查询时,将返回准确的结果:
-
当应用程序从 springboard 或 openURL 调用加载时:
application:willFinishLaunchingWithOptions: -
application:didFinishLaunchingWithOptions:
applicationDidFinishLaunching: -
当用户从设备 springboard 激活或重新激活应用程序时
-
applicationDidBecomeActive:
重要提示:
-
-
您不得在 applicationWillEnterForeground: 期间进行查询。
-
当应用程序通过 openURL 调用激活或重新激活时:
application:openURL:sourceApplication:annotation: application:handleOpenURL: -
managedUserInformation
extern __attribute__((visibility ("default"))) NSString *const kXenMobileUsername; +(NSDictionary*) managedUserInformation;返回一个字符串,其中包含运行 MDX 托管应用程序的已注册用户的 UserName,无论用户登录状态如何。如果用户未注册、应用程序未托管或应用程序未打包,则返回空字符串。
-
XenMobileSharedKeychainVault 类
-
方法
-
initWithVaultName
- (instancetype) initWithVaultName:(NSString*)vaultName accessGroup:(NSString*)accessGroup; -
初始化 Citrix Endpoint Management 共享保管库。
使用共享保管库 API 在具有相同钥匙串访问组的应用程序之间共享托管内容。例如,您可以通过已注册的应用程序共享用户证书,以便应用程序可以从安全保管库而不是 Secure Hub 获取证书。
参数:
vaultName – Citrix Endpoint Management 共享保管库的名称。
accessGroup – 钥匙串访问组的名称。这可以是默认的 MDX 访问组,名为 TEAMID_A.appOriginalBundleID,也可以是您将用于在应用程序之间共享数据的钥匙串访问组。
-
保管库数据类型属性
@property(nonatomic,readonly) BOOL exists; @property(nonatomic,readonly) BOOL isAccessible; @property(nonatomic,strong) NSMutableDictionary\* vaultData <!--NeedCopy-->初始化保管库后,将返回以下保管库数据类型属性:
exists – 指示是否找到了具有指定 vaultName 的保管库。
isAccessible – 指示保管库是否在指定的 accessGroup 中且可访问。
vaultData – 是共享保管库的内容。首次初始化保管库时,vaultData 是一个 nil 字典。
-
getVaultDataFromVault
+ (NSDictionary*) getVaultDataFromVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;从 Citrix Endpoint Management 共享保管库读取数据。这是读取保管库数据的三种方法之一,如下所示:
-
直接使用 getVaultDataFromVault:accessGroup:error。
-
创建 XenMobileSharedKeychainVault 实例,然后读取 vaultData 属性。
-
创建 XenMobileSharedKeychainVault 实例,然后使用
-(BOOL) loadDataWithError:(NSError *__autoreleasing *)error;重新加载保管库数据并读取 vaultData 属性。
有关示例代码,请参阅本文中的“共享保管库示例”。
参数:
vaultName – Citrix Endpoint Management 共享保管库的名称。
accessGroup – 钥匙串访问组的名称。这可以是默认的 MDX 访问组,名为 TEAMID_A.appOriginalBundleID,也可以是您将用于在应用程序之间共享数据的钥匙串访问组。
-
-
saveVaultData
+ (BOOL) saveVaultData:(NSDictionary*)vaultData toVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;将数据保存到 Citrix Endpoint Management 共享保管库。这是保存保管库数据的三种方法之一,如下所示:
-
直接使用 saveVaultData:toVault:accessGroup:error:。
-
使用 updateAndSynchronizeVaultItem: 或 updateAndSynchronizeVaultItems(在本表中的下一部分介绍)。
-
通过创建 XenMobileSharedKeychainVault 实例、加载保管库数据、修改保管库数据,然后同步数据,使用 - (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error;。
有关示例代码,请参阅本文中的“共享保管库示例”。
参数:
vaultData – 要保存到 Citrix Endpoint Management 共享保管库的数据。存储在共享保管库中的数据是键/值对的字典,例如 @{@”username”:@”;andreo”}。
vaultName – Citrix Endpoint Management 共享保管库的名称。
accessGroup – 钥匙串访问组的名称。这可以是默认的 MDX 访问组,名为 TEAMID_A.appOriginalBundleID,也可以是您将用于在应用程序之间共享数据的钥匙串访问组。
-
-
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}。有关示例代码,请参阅本文中的“共享保管库示例”。
有关保存保管库数据的其他两种方法,请参阅上文中的 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
<!--NeedCopy-->