2013-09-23 7 views
5

나는 ad-hoc 배포 방법을 통해 일상적으로 테스터에게 전달하는 앱을 가지고있다. 이 테스터 중 일부는 '공을 쳐서'프로비저닝 프로필과 분기 별 만료에 대해 충분히 알고 있으며 테스트를 위해 새 버전을 다시 작성하기위한 미묘한 변화를 줄 수 있습니다.런타임에 프로비저닝 프로파일의 만료 날짜를 확인 하시겠습니까?

그러나 사용자 중 일부는 항상 실행이 중지 된 지점에 도착한 다음 그 사실을 모르고 신음합니다. 아마 iOS 수준 알림을 무시하더라도.

내 질문은 내가 런타임에 프로그램 적으로 만료 날짜를 잡아 내 최신 '인앱'알림 또는 시스템 알림을 통해 최신 버전을 다운로드하도록 상기시킬 수 있습니까?

답변

6

당신은

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

처럼 뭔가를 찾고 그러나 점점 쉽지가 않다! 이 코드는 개선 될 수 있으며, 일부는 다른 스택 오버 플로우 게시를 기반으로합니다. 참고 : 또 다른 옵션은 plist (사전)에 항목 plist 과/plist 사이의 모든 것을로드하는 것입니다. 그러나 우리는 이미 거기에 있기 때문에 형제를 손으로 만 찾습니다.

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

첫 번째 줄 자체에 대한 profilePath의 반환 nil. 나는 xcode 8.2.1을 사용하고 있으며이 objective-c 코드를 swift와 함께 사용하고있다. – Skywalker

+0

시뮬레이터에서 코드를 실행하고 있습니까? 서명되지 않았으므로 시뮬레이터에서 실행할 때 embedded.mobileprovision 파일이 없습니다. 실제 장치에서 코드를 실행 해보십시오 (코드가 서명되어 있어야하고 embedded.mobileprovision 파일이 있어야합니다). – wottle