簡體   English   中英

使用openurl時,應用程序設置捆綁包未顯示在設置應用程序中

[英]App settings bundle not showing up in settings app when using openurl

啟動我的應用程序時,模式視圖會顯示給用戶,並包含一個用於在“設置”應用程序中調整設置的選項。 如果選擇此選項,我將使用openURL,如下所示:

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

這樣可以成功將用戶重定向到“設置”應用中我應用的設置。 問題在於,向用戶顯示的唯一設置是“使用蜂窩數據”單選按鈕。 我在root.plist中的設置無處可尋。 在“設置”應用程序中對該視圖的所有后續訪問中,所有root.plist設置均正確加載。

我的理論是這是一個計時問題,由於某種原因,我的應用程序的root.plist尚未加載到“設置”應用程序中。 有誰知道是這樣嗎? 我可以強迫它以某種方式加載嗎? 將用戶定向到不存在的設置很尷尬且令人困惑。

在以下鏈接中:

NSUserDafaults讀取Root.plist的值為零

有人說“在用戶第一次打開設置之前,settings.bundle中的值實際上不會加載到NSUserDefaults。默認情況下,它們是關閉的。用戶打開設置包后,它們將為您填充。”

我相信這里提出了一些解決方案:

即使不打開“設置”應用程序,也可以將Settings.bundle中的設置設為默認設置嗎

例如@Lawrence Johnston的這張

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM