作为我们移动设备管理功能的一部分,我们为客户提供私人appstore。管理员可以将ipa文件上传到我们的服务器,我们将允许受管设备直接安装这些企业应用程序。
当管理员上传ipa时,我们希望进行一些验证,如果ipa不符合要求,则立即拒绝。具体做法是:
我有以下问题:
embedded.mobileprovision
,但appstore版本没有该文件。是否足以检查该文件是否存在以确定上传的ipa是否为企业ipa,或者是否有更准确的方法来识别非企业ipa?ExpirationDate
中有一个字段embedded.mobileprovision
,我可以检查一下该值来确定到期日期吗?提前致谢。
答案 0 :(得分:1)
以下代码完成了所需的任务。
Boolean foundMobileProvision = false;
Pattern mobileProvisionPattern = Pattern.compile("embedded\\.mobileprovision$");
while ((entry = zipStream.getNextEntry()) != null) {
Matcher mobileProvisionMatcher = mobileProvisionPattern.matcher(entryName);
if (!entry.isDirectory()) {
if (mobileProvisionMatcher.find()) {
foundMobileProvision = true;
CMSSignedDataParser parser = new CMSSignedDataParser(new BcDigestCalculatorProvider(), zipStream);
InputStream plistContentStream = parser.getSignedContent().getContentStream();
Map<String, Object> mobileProvisionAttributes = PlistParser.parsePlistToMap(plistContentStream);
plistContentStream.close();
validateEnterpriseProvision(mobileProvisionAttributes);
}
}
}
zipStream.close();
if (!foundMobileProvision) {
throw new InvalidEnterpriseProvisionException("Uploaded app must have a valid enterprise provisioning profile");
}
private void validateEnterpriseProvision(Map<String, Object> mobileProvisionAttributes) {
Boolean provisionAllDevices = (Boolean) mobileProvisionAttributes.get(IOS_MOBILE_PROVISION_ALL_DEVICES);
if (provisionAllDevices == null || !provisionAllDevices) {
throw new InvalidEnterpriseProvisionException("Uploaded app must have a valid enterprise provisioning profile");
}
Date expirationDate = (Date) mobileProvisionAttributes.get(IOS_MOBILE_PROVISION_EXPIRATION_DATE);
if (new Date().after(expirationDate)) {
throw new EnterpriseProvisionExpiredException("Profile expired");
}
}
答案 1 :(得分:0)
它是一个二进制plist(plist是一个特殊的xml格式,但仍然是xml)。我可以用atom和vim查看它。你会注意到有不可读的前缀和后缀,忽略它们。 进入中间部分。您可以看到许多节点,例如TeamIdentifier,AppIDName,ProvisionedDevices。它有很多员工。
根据您的要求,我找到了您可能需要的一些代码 在https://github.com/0xc010d/mobileprovision-read/blob/master/main.m
它检查mobileprovision的一些关键节点。少于4?
if ([option isEqualToString:@"type"]) {
if ([plist valueForKeyPath:@"ProvisionedDevices"]){
if ([[plist valueForKeyPath:@"Entitlements.get-task-allow"] boolValue]) {
printf("debug\n");
}
else {
printf("ad-hoc\n");
}
}
else if ([[plist valueForKeyPath:@"ProvisionsAllDevices"] boolValue]) {
printf("enterprise\n");
}
else {
printf("appstore\n");
}
}
您可以编写命令行解析器工具,也可以google一个。 步骤不会很难
ProvisionedDevices
,ProvisionsAllDevices
ProvisionsAllDevices
是true
。接受。 完成