使用openurl时,应用设置包未显示在设置应用中

当我的应用程序启动时,会向用户显示模式视图,并包含一个用于调整“设置”应用中的设置的选项。 如果选择此选项,我将使用openURL,如下所示:

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

这会成功将用户重定向到“我的应用”设置应用中的应用设置。 问题是用户看到的唯一设置是“使用蜂窝数据”单选按钮。 我无法找到root.plist中的设置。 在Settings应用程序的所有后续访问此视图中,root.plist设置都正确加载。

我的理论是,这是一个时间问题,我的应用程序的root.plist由于某种原因尚未加载到“设置”应用程序中。 有谁知道是否是这种情况? 我能以某种方式强行加载吗? 将用户引导到不存在的设置是尴尬和困惑的。

在以下链接:

读取Root.plist的NSUserDafaults值为零

有人说“来自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; }