iOS - 今日扩展程序小部件随时间清除

时间:2017-06-08 11:07:25

标签: ios swift swift2 today-extension ios-app-group

情况应该是

Proper situation

我们有一个今日小部件,根据相应应用中的数据设置,最多显示6个按钮。此数据使用app-groups共享。如果至少配置了一个按钮,它将显示如上图所示。如果用户未登录,或者未配置任何按钮,则会显示如下图所示的消息。

No buttons configured

问题

在几个小时(大约4到7之间)未打开应用程序后,小部件将恢复为“未配置按钮”视图。

到目前为止的分析

使用如下所示的代码完成从app-group加载数据的方式。 (gist for full code)在我编写它的方式中,可以显示“无按钮配置”视图的唯一方法是buttons数组实际存在但长度为零。

我期望缓存清除或后台服务停止,但据我所知,应该提前发现异常:

  • 如果无法与应用组数据建立连接,则userDefaults应为零,因此应显示“未登录视图”。
  • 如果从未定义按钮,buttons应为零,因此应再次显示“未登录视图”

考虑到应用程序在后台没有任何操作,应用程序本身无法更改按钮。

我尝试连接调试器时再现这个,但问题不会重现。

是否有人对如何解决此问题或如何开始调试这一问题有任何想法?

相关文件:

相关代码:

private struct sharedData {
        static var baseUrl: String?
        static var token: String?
        static var phoneDeviceId: String?
        static var buttons: Array<Button>?
    }

func loadData() {
        let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier!
        var groupIdArray = groupIdentifier.componentsSeparatedByString(".")
        groupIdArray.removeAtIndex(groupIdArray.count - 1)
        let appGroupIdentifier = groupIdArray.joinWithSeparator(".");

        let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier)
        if (userDefaults == nil) {
            print("Error in user defaults")
            setButtonTitle("Not logged in. Open Triggi to continue.")
            return false
        }
        sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String
        sharedData.token = userDefaults?.valueForKey("token") as? String
        sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String
        let buttons = userDefaults?.valueForKey("buttons") as? NSArray

        if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) {
            print("Missing data")
            setButtonTitle("Not logged in. Open Triggi to continue.")
            return false
        }

        if (buttons?.count == 0) {
            print("No buttons configured")
            setButtonTitle("No buttons configured. Open Triggi to continue.")
            return false;
        }

    // More things are done with the data here
}

1 个答案:

答案 0 :(得分:1)

Today Extension ControllerUIViewController,因此遵循与UIViewController相同的生命周期。因此,每当加载viewDidLoad()时,都会调用生命周期方法widget

此外,widgetPerformUpdateWithCompletionHandler被称为:

  1. 当小部件在后台更新时
  2. 在创建小部件快照之前
  3. 所以,不要只在loadData()中调用widgetPerformUpdateWithCompletionHandler,而是从viewDidLoad()调用它。

    此外,您在哪里编写代码以从superview添加/删除UIButtons并显示&#34;没有配置按钮&#34;你的代码?