【问题标题】:iOS Settings Bundle Empty on First Visit首次访问时 iOS 设置包为空
【发布时间】:2015-01-15 01:31:05
【问题描述】:

我有一个用 Swift (iOS 8) 编写的应用程序,在第一次打开它时,它会带您进入 iOS 主设置面板中的设置。它使用以下代码:

UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!)

这很好用,只是您到达时设置面板是空的。如果您点击设置返回按钮,然后直接返回应用程序的设置,所有选项都会出现。

我认为这与在用户实际访问设置面板之前 nsuserdefaults 似乎不存在的相同问题有关。

无论如何,有人知道如何解决这个问题吗?

注意事项:

1) 这仅在应用最初安装后首次启动时发生。一旦设置面板至少被访问过一次,它就可以正常工作了。

2) 我的应用已经检查了初始默认值是否存在;如果丢失,它会为当前会话初始化所有设置,并将它们写入设置包——我已经通过将默认值之一从 true 翻转为 false 并注意到它在第一次查看时为 false 来验证这部分是否有效设置。

【问题讨论】:

    标签: ios swift settings.bundle


    【解决方案1】:

    经过进一步研究和几个小时的摆弄,我不再有这个问题。我认为这是两件事之一,#2 最有可能是 IMO:

    1. 将初始化从我的模型类移到了我的 AppDelegate。 (尽管验证了我的模型类已成功初始化首选项;无论如何我都喜欢从 AppDelegate 进行。)

    2. 确保在安装新应用之前强制退出 SETTINGS 应用(使用向上滑动手势)。

    即使在执行 #1 之后,我还是随机看到了这种行为,我认为这与设置应用程序本身有关。我看到的另一个行为是 SETTINGS 下的已安装应用程序列表实际上重复了自己——如果我强制退出它,它就会消失。所以我的猜测是我应该在安装之间强制退出设置。

    【讨论】:

    • 2) 是我的答案(有同样的问题)。那么,是否有更优雅(用户友好)的方式来实现这一点。在物理设备上部署/测试时遇到此问题;模拟器没有问题。
    • Steffo,我终于设置了应用程序以在首次启动时初始化所有设置。我需要在第一次启动时添加一个启动画面,所以必须为此初始化一个设置——很简单,只需继续以相同的方式进行所有设置。
    【解决方案2】:

    不确定如何根据您的描述设置默认值。您可以尝试这样设置。

    var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    let setValue = "yoururl"    
    defaults.setObject(setValue, forKey: "url")
    defaults.synchronize()
    

    要在设置之前查看值中的内容,只需在 var 行之后添加此行。然后在 defaults.synchronize() 后面加上,看看设置了什么。

    println(defaults.objectForKey:@"url")
    

    您也可以尝试在构建过程中使用脚本设置它们。

    【讨论】:

    • 谢谢,我已经这样做了。请参阅我在原始问题中的注释 #2。
    【解决方案3】:

    您应该在应用程序启动时使用默认值注册您的用户默认值,以便在它们不存在时创建这些值。示例:

    var itemDefaults = Dictionary<String,NSNumber>()
    itemDefaults["myKey"] = NSNumber(int: 1)
    
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.registerDefaults(itemDefaults)
    

    【讨论】:

    • 谢谢,我已经这样做了。请参阅我在原始问题中的注释 #2。
    • 我收回了——我没有使用 registerDefaults 方法。不过,我在启动时设置了默认值:var prefs = NSUserDefaults.standardUserDefaults() prefs.setInteger(30, forKey: "duration") prefs.synchronize() 据我了解,这会写入设置包——至少,可以通过访问设置来验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多