2013-09-23 31 views
5

Geçici dağıtım yöntemiyle rutin olarak test kullanıcılarına gönderdiğim bir uygulamam var. Bu test edicilerden bazıları 'topta' ve temel hazırlık profilleri ile üç aylık süreler hakkında yeterli bilgiye sahipler ve eğer (unuttuğum takdirde) test edebilecekleri yeni bir versiyonu yeniden oluşturmak için bana bir dürtme verebiliyorlar.Çalışma zamanında Hazırlama Profilinin EXPIRATION tarihini alın.

Ancak, bazı kullanıcılar her zaman çalışmayı durdurdukları noktaya ulaşıyorlar ve o zaman bu konuda ısırıyor ve moral veriyorlar - muhtemelen iOS düzeyini hatırlatıyor.

Soruma dayanarak programın çalışma süresinde sona erme tarihini bekletebilir ve kendi 'uygulama içi' uyarılarımı veya sistem bildirimlerini yeni sürümü indirmelerini hatırlatmak için yapabilir miyim?

cevap

6

Sen

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

gibi bir şey arıyordum Ama alıyorsanız kolay yok! Bu kod geliştirilebilir, bölümleri diğer stackoverflow yazılarına dayanıyordu. Not: Başka bir seçenek, öğe plist ve/plist ... a plist (dictionary) arasında her şeyi yüklemek olacaktır. Ama biz zaten orada olduğumuzdan, kardeşi sadece elimizle buluyoruz.

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

İlk satırın kendisinde profilePath için dönen nil. Ben xcode 8.2.1 kullanıyorum ve bu objektif-c kodunu hızlıca kullanıyorum. – Skywalker

+0

Kodu simülatörde mi çalıştırıyorsunuz? İmzalanmamıştır, bu nedenle simülatörde çalıştırıldığında embedded.mobileprovision dosyası olmayacaktır. Kodu fiziksel bir aygıtta çalıştırmayı deneyin (kodun imzalanması ve embedded.mobileprovision dosyasının teoride olması gerekir. – wottle