2014-12-07 1 views
0

내 앱이 실행되면 사용자에게 모달 뷰가 표시되고 설정 앱에서 설정을 조정하는 옵션이 포함됩니다.openurl을 사용할 때 설정 앱에 앱 설정 번들이 표시되지 않습니다.

if (&UIApplicationOpenSettingsURLString != NULL) { 
     NSURL *appSettings = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; 
     [[UIApplication sharedApplication] openURL:appSettings]; 
} 

이 성공적으로 설정 응용 프로그램에서 내 응용 프로그램의 설정에 사용자를 리디렉션 :이 옵션을 선택하면 다음과 같이 난의 OpenURL을 사용합니다. 문제는 사용자에게 표시되는 유일한 설정은 "셀룰러 데이터 사용"라디오 버튼입니다. root.plist의 설정은 어디에도 없습니다. 설정 App에서이 뷰를 계속해서 방문 할 때마다 root.plist 설정이 모두 올바르게로드됩니다.

내 이론은 이것이 타이밍 문제이며 내 앱의 root.plist가 어떤 이유로 든 설정 앱에로드되지 않았다는 것입니다. 이것이 사실인지 아는 사람 있습니까? 어떻게 든 강제로로드 할 수 있습니까? 사용자를 존재하지 않는 설정으로 안내하는 것은 어색하고 혼란 스럽습니다. 다음 링크에서

답변

1

는 :

NSUserDafaults reading Root.plist got a nil value

누군가가 사용자가 처음 설정을 열 때까지 settings.bundle에서 값이 실제로 NSUserDefaults에로드되지 않는다 "고 말했다 기본적으로 그들이. 사용자가 설정 번들을 열면 채워집니다. "

나는 몇 가지 솔루션을 여기에 제안했다 믿습니다

Can you make the settings in Settings.bundle default even if you don't open the Settings App

이러한 링크는 질문에 대답 수 있지만 @Lawrence 존스턴

- (void)registerDefaultsFromSettingsBundle { 
    [[NSUserDefaults standardUserDefaults] registerDefaults:[self defaultsFromPlistNamed:@"Root"]]; 
} 

- (NSDictionary *)defaultsFromPlistNamed:(NSString *)plistName { 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    NSAssert(settingsBundle, @"Could not find Settings.bundle while loading defaults."); 

    NSString *plistFullName = [NSString stringWithFormat:@"%@.plist", plistName]; 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:plistFullName]]; 
    NSAssert1(settings, @"Could not load plist '%@' while loading defaults.", plistFullName); 

    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 
    NSAssert1(preferences, @"Could not find preferences entry in plist '%@' while loading defaults.", plistFullName); 

    NSMutableDictionary *defaults = [NSMutableDictionary dictionary]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     id value = [prefSpecification objectForKey:@"DefaultValue"]; 
     if(key && value) { 
      [defaults setObject:value forKey:key]; 
     } 

     NSString *type = [prefSpecification objectForKey:@"Type"]; 
     if ([type isEqualToString:@"PSChildPaneSpecifier"]) { 
      NSString *file = [prefSpecification objectForKey:@"File"]; 
      NSAssert1(file, @"Unable to get child plist name from plist '%@'", plistFullName); 
      [defaults addEntriesFromDictionary:[self defaultsFromPlistNamed:file]]; 
     }   
    } 

    return defaults; 
} 
+1

에서이 하나,을 포함하는 것이 좋습니다 여기에 대한 답변의 필수적인 부분과 참조 용 링크를 제공하십시오. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. –

+0

감사합니다. @BobGilmore 귀하의 충고로 더 나은 정보를 입력하게되었습니다. 나는 이제부터 할 것입니다. – iCMS

관련 문제