繁体   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