iOS - виджет расширения Today очищен со временем

Ситуация в порядке

Правильная ситуация

У нас есть виджет «Сегодня», который показывает максимум 6 кнопок в зависимости от набора данных в соответствующем приложении. Эти данные передаются с помощью групп приложений. Если настроена хотя бы одна кнопка, она будет отображаться, как показано на изображении выше. Если пользователь не вошел в систему или кнопки не настроены, отобразится сообщение, как показано на изображении ниже.

«Кнопки

Проблема

После нескольких часов (где-то между 4 и 7), когда приложение не было открыто, виджет возвращается к представлению «Кнопки не настроены».

Анализ на данный момент

Способ загрузки данных из группы приложений выполняется с использованием кода, как показано ниже. (суть для полного кода) В том виде, в каком я его написал, единственный способ «Нет кнопок» сконфигурированное представление может быть показано, если массив 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
}

person Remy Kabel    schedule 08.06.2017    source источник
comment
Это в Swift 2 ???   -  person Coder-256    schedule 12.06.2017
comment
Да, к сожалению, из-за зависимости от сторонних плагинов мы по-прежнему привязаны к Swift 2.3.   -  person Remy Kabel    schedule 12.06.2017
comment
Какие плагины? Кроме того, не могли бы вы предоставить функции для drawButton и colorFromName?   -  person Coder-256    schedule 12.06.2017
comment
Кроме того, я думаю, что проблема заключается в вашем приложении, где вы устанавливаете ключ кнопок в свои пользовательские настройки по умолчанию.   -  person Coder-256    schedule 12.06.2017
comment
Это приложение на основе кордовы. Единственный плагин на основе Swift - это плагин для геозон, и это одновременно единственная часть приложение, которое выполняет любую фоновую работу. Для того, чтобы установить ключ кнопок, приложение должно быть действительно открыто, иначе этот фрагмент кода никогда не сможет быть запущен. Кроме того, два других фрагмента кода (хотя я не думаю, что они предоставят какую-либо полезную информацию): gist   -  person Remy Kabel    schedule 12.06.2017
comment
Во-первых, вы не должны использовать устаревшие версии Swift. Вместо этого найдите альтернативные плагины или создайте их и сконвертируйте самостоятельно. Кроме того, не могли бы вы предоставить код из своего приложения (javascript или swift, в зависимости от того, что вы используете), в котором вы устанавливаете кнопки вашего NSUserDefaults пакета?   -  person Coder-256    schedule 12.06.2017
comment
Я знаю, но в настоящее время нет альтернативного плагина, и у нас уже есть этот плагин, адаптированный для наших целей. В настоящее время в нашей компании нет никого, кто достаточно разбирается в Swift, чтобы правильно конвертировать плагин. (если вы знаете кого-то, дайте мне знать, мы готовы заплатить ^^ ') Как бы то ни было, я отредактировал вопрос, чтобы он содержал более подходящие файлы.   -  person Remy Kabel    schedule 12.06.2017
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Coder-256    schedule 12.06.2017


Ответы (1)


Today Extension Controller является UIViewController и, следовательно, следует тому же жизненному циклу, что и UIViewController. Итак, метод жизненного цикла viewDidLoad() вызывается каждый раз, когда widget загружается.

Также widgetPerformUpdateWithCompletionHandler называется:

  1. когда виджет обновляется в фоновом режиме
  2. до того, как будет сделан снимок виджета

Поэтому вместо того, чтобы просто вызывать loadData() в widgetPerformUpdateWithCompletionHandler, также вызывайте его из viewDidLoad().

Кроме того, где вы написали код для добавления / удаления UIButtons из супервизора и для отображения сообщения «Нет настроенных кнопок» в вашем коде?

person PGDev    schedule 18.06.2017
comment
Я добавил это, а также несколько журналов для более полной отладки. Я настрою его работать со временем с рядом пользователей. Если это исправит, я вернусь к вам! - person Remy Kabel; 04.07.2017