Сбой приложения при просмотре Apple, но не при локальной разработке

#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:

Спасибо всем, переписывание приложения для удаления всех принудительных развертываний исправило сбои