2013-09-23 14 views
5

Mam aplikację, którą rutynowo przekazuję testerom za pomocą metody dystrybucji ad-hoc. Niektórzy z tych testerów są "na piłce" i wiedzą wystarczająco dużo o profilach udostępniania i kwartalnych wygasaniach i mogą (jeśli zapomnę) dać mi pospiesznie odbudować nową wersję do przetestowania.Uzyskaj datę EXPIRATION profilu obsługi administracyjnej w czasie wykonywania?

Jednak niektórzy użytkownicy zdają się docierać do punktu, w którym przestają działać, a następnie dziwią się i jęczą - mimo że prawdopodobnie odrzucają przypomnienie o poziomie systemu iOS.

Moje pytanie brzmi, czy mogę programowo uzyskać datę wygaśnięcia w czasie wykonywania i wykonać własne alerty "w aplikacji" lub powiadomienia systemowe, aby przypominały o konieczności pobrania nowszej wersji?

Odpowiedz

6

Szukasz czegoś jak

"<key>ExpirationDate</key><date>2014-12-06T00:26:10Z</date>" in [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"] 

Ale dotarcie tam nie jest łatwe! Ten kod mógł zostać poprawiony, jego części oparte były na innych stackoverflow postach. Uwaga: Inną opcją byłoby załadowanie wszystkiego między elementami plist i/plist do ... plist (słownik). Ale ponieważ już tam jesteśmy, po prostu znajdujemy rodzeństwo ręcznie.

- (NSString*) getExpiry{ 

    NSString *profilePath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]; 
    // Check provisioning profile existence 
    if (profilePath) 
    { 
     // Get hex representation 
     NSData *profileData = [NSData dataWithContentsOfFile:profilePath]; 
     NSString *profileString = [NSString stringWithFormat:@"%@", profileData]; 

     // Remove brackets at beginning and end 
     profileString = [profileString stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:@""]; 
     profileString = [profileString stringByReplacingCharactersInRange:NSMakeRange(profileString.length - 1, 1) withString:@""]; 

     // Remove spaces 
     profileString = [profileString stringByReplacingOccurrencesOfString:@" " withString:@""]; 


     // Convert hex values to readable characters 
     NSMutableString *profileText = [NSMutableString new]; 
     for (int i = 0; i < profileString.length; i += 2) 
     { 
      NSString *hexChar = [profileString substringWithRange:NSMakeRange(i, 2)]; 
      int value = 0; 
      sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value); 
      [profileText appendFormat:@"%c", (char)value]; 
     } 

     // Remove whitespaces and new lines characters 
     NSArray *profileWords = [profileText componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     //There must be a better word to search through this as a structure! Need 'date' sibling to <key>ExpirationDate</key>, or use regex 
     BOOL sibling = false; 
     for (NSString* word in profileWords){ 
      if ([word isEqualToString:@"<key>ExpirationDate</key>"]){ 
       NSLog(@"Got to the key, now need the date!"); 
       sibling = true; 
      } 
      if (sibling && ([word rangeOfString:@"<date>"].location != NSNotFound)) { 
       NSLog(@"Found it, you win!"); 
       NSLog(@"Expires: %@",word); 
       return word; 
      } 
     } 

    } 

    return @""; 
} 
+0

Powraca zero dla profilu profilowego w pierwszym wierszu. Używam xcode 8.2.1 i używam tego kodu-c z szybkim. – Skywalker

+0

Czy uruchamiasz kod w symulatorze? Nie jest podpisany, więc po uruchomieniu na symulatorze nie będzie pliku embedded.mobileprovision. Spróbuj uruchomić kod na fizycznym urządzeniu (kod musi być podpisany, a plik embedded.mobileprovision powinien, teoretycznie, tam być. – wottle

Powiązane problemy