在进行API调用时,应用程序始终崩溃

时间:2017-01-19 07:41:41

标签: ios iphone xcode react-native nsurl

每次发出HTTP请求(对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));
  });
}

知道可能导致此次崩溃的原因是什么?

修改

这是API的JSON响应示例:

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

编辑2

以下是Xcode的符号化崩溃报告的屏幕截图(应用名称已被屏蔽):

Symbolicated crash report from Xcode

编辑3

经过进一步测试和调试后,我确定在运行8.x的iPhone 5上也会出现有时的问题。无论如何,我看到this answer提出了一个不同的问题,当我将这些行添加到应用程序的入口点时,它实际上修复了问题当我点击" Debug JS远程"在React Native开发人员菜单中。

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

XMLHttpRequest = _XHR

基本上如上所述,当模拟器(iPhone 4s,iOS 9.3)连接到React Native Chrome调试器时,问题就会停止并填充列表(没有越界错误)。但是,如果我从调试器断开模拟器,或者如果我在release模式下运行应用程序,则错误仍然存​​在。

2 个答案:

答案 0 :(得分:1)

RTCPicker类型的对象(UIPickerView的子类)正在尝试从不存在的数组中访问项目。像你这样的东西在数组中有5个项目,并尝试访问第6项。

这由顶部框架指示,表明调用堆栈正在抛出异常而第3帧试图在特定索引处的NSArray中访问项目。

由于例外是致命的,这会使应用程序崩溃。

答案 1 :(得分:0)

-1022错误表示您正在尝试从http服务器获取。您需要转到https或调整应用的权利以允许明文加载。

我的猜测是请求因此而失败,并且您未能正确检测到空响应并尝试将其解析为JSON,然后崩溃,但没有解码的回溯,则无法说当然。