2013-09-23 18 views
5

Ho un'app che passo regolarmente ai tester attraverso il metodo di distribuzione ad-hoc. Alcuni di questi tester sono "on the ball" e conoscono abbastanza i profili di provisioning e le scadenze trimestrali e possono (se non ricordo) dare una spinta per ricostruire una nuova versione da testare.Ottieni la data di SCADENZA di un profilo di provisioning in fase di esecuzione?

Tuttavia, alcuni utenti sembrano sempre arrivare al punto in cui smette di funzionare e poi si lamentano e lamentano - nonostante abbiano probabilmente abbandonato il promemoria del livello iOS.

La mia domanda è possibile accedere in modo programmatico alla data di scadenza in fase di esecuzione e fare i miei avvisi di "in-app" o le notifiche di sistema per ricordare loro di tirare giù la versione più recente?

risposta

6

Siete alla ricerca di qualcosa di simile

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

Ma arrivarci non è facile! Questo codice potrebbe essere migliorato, parti di esso erano basate su altri post StackOverflow. Nota: Un'altra opzione sarebbe quella di caricare tutto tra gli articoli plist e/plist in ... un plist (dizionario). Ma dal momento che siamo già lì, troviamo il fratello a mano.

- (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

Il suo ritorno nil per profilePath sulla prima riga stessa. Sto usando xcode 8.2.1 e usando questo codice obiettivo-c con swift. – Skywalker

+0

Stai eseguendo il codice nel simulatore? Non è firmato, quindi non ci sarà il file embedded.mobileprovision quando viene eseguito sul simulatore. Prova a eseguire il codice su un dispositivo fisico (il codice deve essere firmato e il file embedded.mobileprovision dovrebbe, in teoria, essere lì. – wottle