#ios #swift #crash
#iOS #swift #сбой
Вопрос:
Приложение вылетает, когда команда Apple просматривает его, но не может воспроизвести сбой при разработке.
Я пробовал запускать его во всех возможных симуляторах, также пробовал ферму устройств Amazon AWS и на 2 разных реальных устройствах (iPad и iPhone).
Похоже, что DateFormater не может проанализировать дату и возвращает nil, до этого мы проанализировали некоторые другие поля, но без дат.
Мы считаем, что формат должен соответствовать указанному (мы можем проанализировать его на наших устройствах), и мы используем ту же учетную запись, что и команда Apple review.
Мы также пытались переключить календари на негрегорианские, что также не привело к сбою приложения.
Приложение выходит из строя в self.modified = ...
строке
Из Event.swift …
import SwiftyJSON
...
required init(json: JSON) {
self.id = json["tm_event_id"].int!;
self.name = json["name"].string!;
self.eventStatus = EventStatus.init(rawValue: json["event_status"].string!)!;
self.modified = AppDelegate.formaterDatetime.date(from: json["modified"].string!)!;
self.dateFrom = AppDelegate.formaterDate.date(from: json["date_from"].string!)!;
...
}
Из AppDelegate.swift …
static var formaterDatetime:DateFormatter {
let f = DateFormatter();
f.dateFormat = "yyyy-MM-dd HH:mm:ss";
f.timeZone = dataTimeZone
f.locale = Calendar.current.locale;
return f;
}
Ответ серверной части (на основе журналов нашего сервера)
[
{
"tm_event_id": 1082,
"company_id": 16,
"organization_id": 58,
"org_user_id": 126,
"org_location_id": 93,
"name": "My Test",
"date_from": "2019-03-25",
"date_to": "2019-03-30",
"week_ending": "2019-03-31",
"placement_count": 6,
"notes": "",
"event_status": "private",
"created": "2019-03-04 13:25:25",
"modified": "2019-03-04 13:25:25",
"subrequirements": [ ... ],
"timesheets": [ ... ]
}
Журнал сбоев
Crashed: com.apple.root.user-initiated-qos
0 YouRecruit Work Tracker 0x1028b9470 specialized Event.init(json:) (Event.swift:224)
1 YouRecruit Work Tracker 0x10286424c specialized static StorableItem.initStatic(json:) (Event.swift)
2 YouRecruit Work Tracker 0x102844b20 closure #3 in _TempManAPI.().init() (<compiler-generated>)
3 YouRecruit Work Tracker 0x102844c4c specialized thunk for @escaping @callee_guaranteed (@guaranteed Entity<JSON>) -> (@owned [Event]?, @error @owned Error) (<compiler-generated>)
4 Siesta 0x102e22a0c (Missing)
5 Siesta 0x102e2250c (Missing)
6 Siesta 0x102df4700 (Missing)
7 Siesta 0x102df9c70 (Missing)
8 Siesta 0x102df96fc (Missing)
9 Siesta 0x102df163c (Missing)
10 Siesta 0x102de9fbc (Missing)
11 libdispatch.dylib 0x222a44a38 _dispatch_call_block_and_release 24
12 libdispatch.dylib 0x222a457d4 _dispatch_client_callout 16
13 libdispatch.dylib 0x2229f6160 _dispatch_root_queue_drain 680
14 libdispatch.dylib 0x2229f68d0 _dispatch_worker_thread2 128
15 libsystem_pthread.dylib 0x222c251b4 _pthread_wqthread 464
16 libsystem_pthread.dylib 0x222c27cd4 start_wqthread 4
Есть идеи, как воспроизвести сбой при локальной разработке или что может вызвать этот сбой?
Комментарии:
1. Не связано с вашей проблемой, но не используйте
;
в конце строк в Swift, это не Objective-C. Более того, вы должны использоватьCodable
для декодирования JSON, а принудительное разворачивание значений из JSON — действительно плохая идея. Если это полная трассировка стека и ваша полнаяinit(json:)
, сбой, скорее всего, происходит из-за принудительного развертывания.2. Вы пробовали сборку TestFlight?
3. не используйте принудительное разворачивание. это непрофессиональный способ управления кодом. если вы отправляете сборку в app Store, убедитесь, что в коде есть 0 принудительного развертывания.
4. Почему это произойдет только тогда, когда с Apple (по крайней мере, дважды) и предыдущие значения были прочитаны правильно?
5. Возможно, приложение выходит из строя, потому что они тестируют его в различных сетевых условиях, и сервер вернул другой формат json (или пустые данные), чем ожидалось. Или, возможно, некоторые из целых чисел были закодированы как строка, как предлагали другие, не используйте принудительное разворачивание, а в некоторых случаях полезно использовать необязательный init(), чтобы вы могли обрабатывать неверные данные json. И, поскольку я вижу даты, я бы посоветовал вам использовать datetimes с часовыми поясами, потому что ваши пользователи могут находиться в разных местах мира, и их 5 апреля может быть другим 4 апреля.
Ответ №1:
Спасибо всем, переписывание приложения для удаления всех принудительных развертываний исправило сбои