2013-07-09 1 views
1

사용자가 Settings.bundle을 사용하는 응용 프로그램을 개발하여 사용자가 응용 프로그램 내에서 일부 내용을 변경할 수있게했습니다. exemple 들어iOS Persistent Data/Settings.bundle

:

나는 키 "firstName을"는의 DefaultValue는 "존"입니다있는 매개 변수를했습니다. 사용자가 설정 창에서 "Bryan"으로 "John"을 변경하고 "Hello Bryan!" 내 신청서에. 이피!

사용자가 이전에 응용 프로그램을 제거하지 않고 응용 프로그램을 업데이트하면 응용 프로그램을 다시 시작할 때 "Hello Bryan!"텍스트가 표시됩니다. 여전히 거기에. MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist

사용자가 데이터를 변경하면이 파일에 저장되어 사용자가 업데이트가 아닌 기기에서 앱을 제거 할 때까지이 파일이 저장됩니다.

내 문제는 내 앱을 업데이트 한 후 사용자가 "Hello Bryan!"을보고 싶지 않다는 것입니다. 하지만 DefaultValue 대신 (John) 결정할 경우에만.

내가이 솔루션에 대해 생각하는 것을해야 할 일 : 저장된 버전과 다른, 내가 알아낼하려고한다
NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary]; 

NSString* currentVersion = [infoDict objectForKey:@"CurrentSettingsVersion"]; 

NSString*storedVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentSettingsVersion"]; 

BOOL sameVersion = nil; 

if([currentVersion isEqualToString:storedVersion]){ 
    //No change keep preference 
    sameVersion = YES; 
}else{ 
    //Versions are different => erase prefs and set new currentSettingsVersion number 
    sameVersion = NO; 
    //Reset 
    [[NSUserDefaults standardUserDefaults] setValue:currentVersion forKey:@"currentSettingsVersion"]; 
} 

때 현재 버전

가 어떻게이 파일을 재설정 할 수 있지만, 애플 사양을 확인 있다면? MyApp.app/Library/Preferences/my.bundle.com.MyApp.plist

이상한 점은 알고 있지만 클라이언트는 업데이트하기 전에 응용 프로그램을 제거하고 싶지 않습니다. 정말 첫 번째 앱 버전에는 Settings.bundle이 있고 두 번째 버전에는 그렇지 않은 경우가 있습니다. 그러나 우리 응용 프로그램은 Settings.bundle이 없어도 변경된 설정을 메모리에 유지합니다. 난 당신이 이해를 바랍니다

) 이것은 정말 이상한 요구 :

Pebie

+0

"진짜로 사건은 내 첫 번째 응용 프로그램 버전에서 Settings.bundle가 있고 두 번째 버전에 없다. 그러나 Settings.bundle이없는에도 불구하고 우리의 응용 프로그램이 메모리에 변경된 설정을 유지한다는 것입니다 더 이상. " 명확하지 않지만 두 번째 버전의 제한 사항은 무엇인지 설명하십시오. –

답변

0

덕분에, 버전에 대한

내 솔루션 권리입니다. 하지만 [NSUserDefaults resetStandardUserDefaults] 응용 프로그램 충돌로 전화하면. 대신 그 나는 전화 :

NSString *domainName = [[NSBundle mainBundle] bundleIdentifier]; 
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:domainName]; 

은 그럼 같은 값으로 CurrentVersion을하고 storedVersion를 재설정합니다.

괜찮습니다!

감사

0

완전히 저장된 모든 설정을 제거하는 방법 [NSUserDefaults resetStandardUserDefaults]가있다.

버전 관리와 관련된 솔루션이 완벽합니다. NSUserDefaults 내에 앱 버전을 유지하고, 앱을 시작할 때마다 확인하고, 버전이 다르면 이전을 수행하고 현재 앱 버전을 다시 저장할 수 있습니다. NSUserDefault에 버전이 없으면 새로 설치가 시작되므로 아무 것도하지 않습니다.

일단 앱을 두 번 이상 업데이트하고 모든 업데이트에서 일부 데이터 이전이 필요한 경우 더 강력한 메커니즘이 필요하기 때문에 버전 간 마이그레이션에 유사한 메커니즘을 구현해야합니다. 같은 버전인지 여부. 그래서 N 개의 구성 요소에 버전 문자열을 분할하고 비교하는 두 가지 함수를 작성했습니다. version_compare 또한 NSArray 정렬 작업에서 사용할 수 있으므로 기본적으로 각 버전의 데이터 마이그레이션을 수행하는 특수 객체가 있었으며 현재 버전을 찾고 모든 출시 된 버전의 응용 프로그램을 정렬하고 점진적으로 마이그레이션을 수행했습니다.

#define MAX_VERSION_DIGITS 3 

static void parse_version_string(NSString* version, int(*numbers)[MAX_VERSION_DIGITS]) 
{ 
    int seq[MAX_VERSION_DIGITS] = { 0, 0, 0 }; 
    NSArray* split = [version componentsSeparatedByString:@"."]; 

    for(int i = 0, c = MIN(MAX_VERSION_DIGITS, split.count); i < c; i++) 
    { 
     seq[i] = [[split objectAtIndex:i] intValue]; 
    } 

    memcpy(numbers, &seq, sizeof(seq)); 
} 

static NSComparisonResult version_compare(NSString* a, NSString* b) 
{ 
    int seq1[MAX_VERSION_DIGITS]; 
    int seq2[MAX_VERSION_DIGITS]; 

    parse_version_string(a, &seq1); 
    parse_version_string(b, &seq2); 

    for(int i = 0; i < MAX_VERSION_DIGITS; i++) 
    { 
     if(seq1[i] > seq2[i]) 
     { 
      return NSOrderedDescending; 
     } 
     else if(seq1[i] < seq2[i]) 
     { 
      return NSOrderedAscending; 
     } 
    } 

    return NSOrderedSame; 
}