2016-11-27 3 views
1

Для диагностических целей иногда желательно иметь возможность считывать идентификатор подписи кода для запускающего приложения.iOS: Как получить идентификатор подписи кода

Эта информация существует в embedded.mobileprovision файла в связке приложения, например:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>AppIDName</key> 
    <string>Happy</string> 
    <key>ApplicationIdentifierPrefix</key> 
    <array> 
    <string>7YCRDE64W6</string> 
    </array> 

Какой код-фрагмент может быть использован, чтобы прочитать эту информацию?

ответ

0

Вот Objective-C код, который может сделать эту работу для нас:

-(NSString*_Nullable)codeSignId 
{ 
    NSString *provisPath = [[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]; 
    NSData *provisData = [NSData dataWithContentsOfFile:provisPath]; 

    NSData *tokApplicationIdentifierPrefix = [@"ApplicationIdentifierPrefix" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *tokStringStart = [@"<string>" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *tokStringEnd = [@"</string>" dataUsingEncoding:NSUTF8StringEncoding]; 
    #define RangeOK(rng) rng.location != NSNotFound 
    NSUInteger len = provisData.length; 

    NSRange range1 = [provisData rangeOfData:tokApplicationIdentifierPrefix options:0 range:NSMakeRange(0, len)]; 
    if (RangeOK(range1)) { //found ApplicationIdentifierPrefix 
     NSRange range2 = [provisData rangeOfData:tokStringStart options:0 range:NSMakeRange(range1.location, len-range1.location)]; 
     if (RangeOK(range2)) { //found <string> 
      NSRange range3 = [provisData rangeOfData:tokStringEnd options:0 range:NSMakeRange(range2.location, len-range2.location)]; 
      if (RangeOK(range3)) { //found </string> 
       NSString *appIdPrefix = [[NSString alloc] initWithData:[provisData subdataWithRange:NSMakeRange(range2.location+8, range3.location - range2.location -8)] encoding:NSUTF8StringEncoding]; 
       return appIdPrefix; 
      } 
     } 
    } 
    return nil; 
} 

EDIT

Я только что узнал, что иногда файл embedded.mobileprovision содержит различные значения для ApplicationIdentifierPrefix и TeamIdentifier. Я был бы рад узнать различия между этими двумя.

Смежные вопросы