Ситуация в порядке
У нас есть виджет «Сегодня», который показывает максимум 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
}
drawButton
иcolorFromName
? - person Coder-256   schedule 12.06.2017NSUserDefaults
пакета? - person Coder-256   schedule 12.06.2017