2017-01-19 9 views
0

Один из пользователей моего приложения испытывает сбой каждый раз, когда HTTP-запрос выполняется (API). Это авария след:Приложение всегда сбой при вызове API

Incident Identifier: 512C99DF-D432-4BAC-96DF-B32561A51C9B 
CrashReporter Key: cdee4dd4d00f061439ba8ee6e2fdf4d5a9c4e889 
Hardware Model:  iPhone5,3 
Process:    myapp [312] 
Path:    /private/var/mobile/Containers/Bundle/Application/42EA0E64-28BB-48D0-9CDF-6F58F1823BDF/myapp.app/myapp 
Identifier:   com.myapp.myapp 
Version:    3 (0.1.2) 
Code Type:   ARM (Native) 
Parent Process:  launchd [1] 

Date/Time:   2017-01-18 21:30:47.47 -0500 
Launch Time:   2017-01-18 21:30:41.41 -0500 
OS Version:   iOS 9.1 (13B143) 
Report Version:  105 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Exception Note: EXC_CORPSE_NOTIFY 
Triggered by Thread: 0 

Filtered syslog: 
None found 

Last Exception Backtrace: 
(0x24dc5856 0x3673adfa 0x24d58bda 0xfe438 0x29188ae8 0x29188c34 0x295ccf7c 0x290b18d8 0x28fda85c 0x28fda68a 0x290b10cc 0x2880a85a 0x2880a6aa 0x2e897586 0x25e85340 0x24d76b54 0x24d88f76 0x24d8868a 0x24d86a9c 0x24cd90d4 0x24cd8ec8 0x2e04eaf4 0x28f622d8 0xa0288 0x36e8886e) 

Global Trace Buffer (reverse chronological seconds): 
2.392224  CFNetwork     0x00000000245e4a91 TCP Conn 0x15d78310 SSL Handshake DONE 
2.598566  CFNetwork     0x00000000245e49cb TCP Conn 0x15d78310 starting SSL negotiation 
2.599330  CFNetwork     0x000000002466479d TCP Conn 0x15d78310 complete. fd: 6, err: 0 
2.600883  CFNetwork     0x000000002466589f TCP Conn 0x15d78310 event 1. err: 0 
3.702969  CFNetwork     0x000000002466591d TCP Conn 0x15d78310 started 
3.710171  CFNetwork     0x00000000246a640f Creating default cookie storage with default identifier 
3.710171  CFNetwork     0x00000000246a63eb Faulting in CFHTTPCookieStorage singleton 
3.710171  CFNetwork     0x00000000246e878b Faulting in NSHTTPCookieStorage singleton 
3.714408  CFNetwork     0x000000002463e141 NSURLSessionTask finished with error - code: -1022 
4.907331  libsystem_trace.dylib  0x00000000370086f9 dyld_image_header_containing_address(0x15e505e9) failed 

Однако приложение работает для всех других пользователей, и я знаю, что API конечной точкой является полностью доступным. Это также React Native приложение, не знаю, если это отношение к этому, но вот код, который делает запрос:

export default function api(apiName, paramsObj) { 
    return new Promise((resolve, reject) => { 
    let ip = 'xxx.xxx.xx.xxx'; 
    fetch(`http://${ip}/api/${apiName}`, { 
     method: 'POST', 
     headers: { 
     Accept: 'application/json', 
     'Content-Type': 'application/json', 
     }, 
     body: paramsObj ? JSON.stringify(paramsObj) : null 
    }) 
    .then(response => resolve(response.json())) 
    .catch(error => reject(error)); 
    }); 
} 

Любая идея, что может быть причиной этой аварии?

EDIT

Это пример ответа JSON API-интерфейс в:

[{"id":"584b7fe3e1e982176d5a5b3c","name":"My University","unlocked":true,"totalUsers":1200,"minimumUsers":1000}] 

EDIT 2

Вот скриншот symbolicated отчета об аварии с Xcode (приложение имя закрыто):

Symbolicated crash report from Xcode

EDIT 3

После дальнейшего тестирования и отладки я решил, что этот вопрос также иногда происходит на iPhone 5s работает 8.x. Независимо от того, я видел this answer на другой вопрос, и когда я добавил эти строки в точку входа приложения, он фактически устранил проблему только, когда я нажимаю «Отладка JS удаленно» в меню разработчика React Native.

const _XHR = GLOBAL.originalXMLHttpRequest ? 
    GLOBAL.originalXMLHttpRequest :   
    GLOBAL.XMLHttpRequest      

XMLHttpRequest = _XHR 

Так по существу с этим выше линией, когда имитатор (iPhone 4s, IOS 9.3) подключен к React Native Chrome отладчику проблема останавливается, и список не заселенный (не запретные ошибок). Однако, если я отключу симулятор от отладчика ИЛИ, если я запустил приложение в release, ошибка сохраняется.

+1

Вы также должны показать соответствующие коды. – Raptor

+0

@Raptor Спасибо! Я добавил код «React Native», который делает запрос. –

+1

Код выглядит нормально. Но каков ответ API? Является ли ответ неправильным JSON? – Raptor

ответ

0

Ошибка -1022 указывает на то, что вы пытаетесь получить с HTTP-сервера. Вам нужно перейти на https или настроить права вашего приложения, чтобы разрешить загрузку текста.

Я полагаю, что из-за этого запрос не работает, и вы не можете правильно определить пустой ответ и попытаться разобрать его как JSON, а затем сбой, но без декодированного backtrace невозможно сказать конечно.

+0

Спасибо! Любая идея, почему это произойдет только на старых 32-битных iPhone (5 и ниже), если это проблема типа 'http' vs' https'? –

+1

Не знаю. Может быть, разница в поведении в том, как какой-то метод обрабатывает пустую строку. В любом случае, сначала декодируйте обратную линию, а затем проблема, вероятно, будет очевидна. – dgatwood

+0

Я добавил скриншот символизированной версии журнала сбоев, любая идея, в чем проблема? Благодаря!! –

1

Объект типа RTCPicker (подкласс UIPickerView) пытается получить доступ к элементу из массива, который не существует. То, что у вас есть 5 элементов в массиве и попытаться получить доступ к 6-му элементу.

Это указано верхним фреймом, показывающим, что стек вызовов генерирует исключение, а третий кадр пытается получить доступ к элементу из NSArray по определенному индексу.

Поскольку исключения являются смертельными, это приведет к краху приложения.

+0

Спасибо! В основном «RTCPicker» заполняется вызовом API, который в 100% времени возвращает данные для сборщика (возвращаемый массив JSON никогда не пуст). На всех 64-битных устройствах этого сбоя не происходит, и API успешно возвращает результат. Однако он всегда сбой и не заполняет массив на всех 32-битных устройствах (iPhone 4S и ранее), любая идея, почему это произойдет? –

+0

@UnknownUser, вероятно, не может сказать без отладки на поврежденном устройстве. Можете ли вы воспроизвести проблему в симуляторе? –

+0

@Pekka 웃 Да, я могу воспроизвести проблему на iPhone 4S в симуляторе. –