【问题标题】:Difficulty reading UserDefaults with Fastlane Snapshot使用 Fastlane 快照难以读取 UserDefaults
【发布时间】:2017-03-05 17:23:53
【问题描述】:

我正在使用 Fastlane's snapshot 为我即将提交到 App Store 的应用创建屏幕截图。

它在大多数情况下都“像宣传的那样”工作,但它似乎不喜欢我在我的应用程序中访问 UserDefaults 的方式。在一项测试中,它会生成 Exit status: 65 错误。

UI Testing Failure - com.me.MyApp crashed in (extension in MyApp):__ObjC.NSObject.defaultTime () -> Swift.Float

我发现UserDefaults.standard.value(forKey: "defaultTime") 收到了一个语法错误的邀请,因此我创建了一个扩展程序来访问UserDefaults。这是扩展的样子:

class CustomExtensions: NSObject {
    /*
     This is blank. Nothing else in here. No really...nothing else
     */
}

extension NSObject {
    // User Defaults    
    func defaultTime() -> Float {
        return UserDefaults.standard.value(forKey: "defaultTime") as! Float
    }

    // a bunch of other UserDefaults    
}

在应用程序中,每当我需要defaultTime 时,我只需输入defaultTime()。使用此方法访问UserDefaults 值在模拟器和我测试过的设备上运行良好。我只遇到snapshot的问题。

我尝试在测试中添加sleep(1),但这似乎没有任何作用。我欢迎以下建议:访问UserDefaults 的替代方法,使我能够在整个 MyApp 中轻松访问它们。

【问题讨论】:

    标签: ios swift snapshot xcode-ui-testing fastlane


    【解决方案1】:

    可能发生的情况是,在您的模拟器和设备上,您正在为键 defaultTime 的用户默认值写入一个值,然后再读取它。 value(forKey: 返回一个可选值,如果你强制解包它(或像你在这里所做的那样强制向下转换),如果值为 nil,你将崩溃。尝试返回一个可选的:

    func defaultTime() -> Float? {
        return UserDefaults.standard.value(forKey: "defaultTime") as? Float
    }
    

    或使用默认值:

    func defaultTime() -> Float {
        return UserDefaults.standard.value(forKey: "defaultTime") as? Float ?? 0.0
    }
    

    【讨论】:

    • 太棒了!我刚刚在这里阅读nil coalescing operators hackingwithswift.com/read/12/2/…。这解决了这个问题,现在我必须调整我的测试以单击正确的单元格......这应该更容易:) 谢谢!
    • 顺便说一句,我的初始默认设置为AppDelegate.swift。您的解决方案解决了我的问题告诉我 UI 测试跳过了 AppDelegate。我永远不会猜到这一点。希望这个评论有人更进一步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多