使用 Objective-C 读取 .mobileprovisioning 配置文件

Posted

技术标签:

【中文标题】使用 Objective-C 读取 .mobileprovisioning 配置文件【英文标题】:Read .mobileprovisioning profile with Objective-C 【发布时间】:2013-10-12 14:55:12 【问题描述】:

所以,我正在尝试打开一个 .mobileprovisioning 配置文件来阅读里面的内容......这就是我正在做的事情:

NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];

我当然会读取数据,但我没有找到将这些数据转化为有用的东西的方法...一个 NSDictionary、一个 NSString 或其他什么...

我已经试过了:

NSString *newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

有什么想法吗?我确定这是一个编码问题,但在阅读和谷歌搜索一段时间后我无法解决它......我认为配置文件保存为十六进制,但我不知道如何从目标中读取它 - C。我找到了这个,但没有有用的答案。

How to convert NData populated with hex values to NSString

谢谢!

【问题讨论】:

【参考方案1】:

以下方法应该可以满足您的需求。正如@rbrockerhoff 所说,移动配置文件是一个编码的 CMS 消息。此方法使用解码器首先使用 CMS 函数解码数据,然后从解码数据创建 plist 字符串/内容。然后可以将此字符串转换为从该方法返回的字典。该字典将包含来自移动配置文件的所有详细信息。

- (NSDictionary *)provisioningProfileAtPath:(NSString *)path 
    CMSDecoderRef decoder = NULL;
    CFDataRef dataRef = NULL;
    NSString *plistString = nil;
    NSDictionary *plist = nil;

    @try 
        CMSDecoderCreate(&decoder);
        NSData *fileData = [NSData dataWithContentsOfFile:path];
        CMSDecoderUpdateMessage(decoder, fileData.bytes, fileData.length);
        CMSDecoderFinalizeMessage(decoder);
        CMSDecoderCopyContent(decoder, &dataRef);
        plistString = [[NSString alloc] initWithData:(__bridge NSData *)dataRef encoding:NSUTF8StringEncoding];
        NSData *plistData = [plistString dataUsingEncoding:NSUTF8StringEncoding];
        plist = [NSPropertyListSerialization propertyListWithData:plistData options:NSPropertyListImmutable format:nil error:nil]
    
    @catch (NSException *exception) 
        NSLog(@"Could not decode file.\n");
    
    @finally 
        if (decoder) CFRelease(decoder);
        if (dataRef) CFRelease(dataRef);
    

    return plist;

【讨论】:

CMSDecoderRef Security 框架的一部分,仅适用于 Mac OS :(【参考方案2】:

.mobileprovisioning 文件是编码的 CMS 消息。

请参阅https://developer.apple.com/library/mac/documentation/security/Reference/CryptoMessageRef/Reference/reference.html 了解详细信息和解码它的 API。

如果您只想将编码的属性列表作为文本,一个快速而简单的技巧是获取 NSData 的字节指针,扫描开头的“ ”。然后从中制作一个 NSString。

【讨论】:

【参考方案3】:

您可以简单地强制在 TextEdit 中打开移动配置文件,您可以在其中看到 内部内容,您可以在其中修剪/编辑编码的 CMS 消息或任何您想要的内容。然后你可以简单地使用 NSData encodewithUTF string 方法进行解码。

希望这会有所帮助。

【讨论】:

以上是关于使用 Objective-C 读取 .mobileprovisioning 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Objective-C 读取 .mobileprovisioning 配置文件

使用 Objective-C 以编程方式读取文本文件

无法使用 Mobile Vision API 从图像中读取文本

如何在objective-c中按范围读取大文件?

如何使用 Objective-C 在 IOS 中读取和存储系统日志消息

Objective-C:如何读取 JSON?