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

And*_*res 6 cocoa hex objective-c nsdata provisioning-profile

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

NSString *path = [pathURL path];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
Run Code Online (Sandbox Code Playgroud)

当然我得到了数据读取,但我找不到将这些数据变成有用的东西...... NSDictionary,NSString或者其他......

我已经尝试过了:

NSString *newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

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

如何将填充了十六进制值的NData转换为NSString

谢谢!

Jos*_*hua 8

以下方法应该做你想要的.正如@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;
}
Run Code Online (Sandbox Code Playgroud)