成功连接几分钟后,Worklight Native iOS App 以 NSRangeException 终止

Posted

技术标签:

【中文标题】成功连接几分钟后,Worklight Native iOS App 以 NSRangeException 终止【英文标题】:Worklight Native iOS App terminating with NSRangeException a few minutes after successful connect 【发布时间】:2013-10-25 17:00:15 【问题描述】:

我正在使用 Worklight 6.0.0.1 + 9-26 iFix。 在成功调用 Worklight Connect 几分钟后,我们的应用程序崩溃并出现此错误,这看起来可能涉及来自 Worklight 的 JSON 解析问题:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFConstantString substringWithRange:]: Range 2147483647, 1 out of bounds; string length 0'
*** First throw call stack:
(
    0   CoreFoundation                      0x021615e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01ee48b6 objc_exception_throw + 44
    2   CoreFoundation                      0x021613bb +[NSException raise:format:] + 139
    3   CoreFoundation                      0x0213a5e8 -[__NSCFString substringWithRange:] + 136
    4   MyApp                           0x00036546 +[WLUtils parseJSONString:] + 230
    5   MyApp                           0x00032447 -[WLRequest requestFinished:] + 167
    6   libobjc.A.dylib                     0x01ef681f -[NSObject performSelector:withObject:] + 70
    7   MyApp                               0x00058a1b -[ASIHTTPRequest reportFinished] + 171
    8   libobjc.A.dylib                     0x01ef681f -[NSObject performSelector:withObject:] + 70
    9   Foundation                          0x01b39c18 __NSThreadPerformPerform + 285
    10  CoreFoundation                      0x020ea8af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    11  CoreFoundation                      0x020ea23b __CFRunLoopDoSources0 + 235
    12  CoreFoundation                      0x0210730e __CFRunLoopRun + 910
    13  CoreFoundation                      0x02106b33 CFRunLoopRunSpecific + 467
    14  CoreFoundation                      0x0210694b CFRunLoopRunInMode + 123
    15  GraphicsServices                    0x0337f9d7 GSEventRunModal + 192
    16  GraphicsServices                    0x0337f7fe GSEventRun + 104
    17  UIKit                               0x00c5794b UIApplicationMain + 1225
    18  MyApp                               0x0000b9ad main + 141
    19  libdyld.dylib                       0x02abd725 start + 0
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我们正在像这样进行连接并获得成功响应:

MyConnectListener *connectListener = [[MyConnectListener alloc] init];
[[WLClient sharedInstance] wlConnectWithDelegate:connectListener];


MyConnectListener implements WLDelegate

MyConnectListener.m:
-(void)onSuccess:(WLResponse *)response

    NSLog(@"Connection Success: %@", response);


-(void)onFailure:(WLFailResponse *)response

    NSLog(@"Connection failure: %@", response);

知道如何解决这个问题吗?

【问题讨论】:

我试图重现您的错误,但它对我有用。当我收到不是 JSON 的响应时,它也有效。你有办法显示你的设备从服务器接收到的确切响应吗? (通过控制台日志或使用wireshark?) 在我们的例子中,我们从 connect 获得了成功的响应。几分钟后,应用程序因上述错误而崩溃。这可能是运行中的心跳或将连接添加到组合中的其他一些副作用的结果。 啊,我明白了。除了连接和心跳之外,您是否向服务器发出任何手动请求?你能得到任何导致错误的调用的响应吗?你能打电话吗 [[WLClient sharedInstance] setHeartBeatInterval:5];这样心跳会在5秒后触发,以便我们确认是心跳还是别的什么? 所以这是一个与 ios7 相关的问题,重现它的步骤: 1. 创建一个 xcode 项目,然后像问题 2 中所做的那样对工作灯服务器进行连接调用。设置 [[WLClient sharedInstance] setHeartBeatInterval :1];如果你为 iOS7 测试项目,你会立即看到崩溃,如果你为 iOS6 测试它,你不会看到崩溃 我已经向开发者报告了这个问题。会尽快调查。 【参考方案1】:

这已被记录为缺陷,将在未来的版本中修复。当前的解决方法是使用以下语法禁用心跳功能:

[[WLClient sharedInstance] setHeartBeatInterval:-1];

【讨论】:

对应用程序开发有何影响?有没有办法检查会话在服务器上是否仍然处于活动状态?如果会话已运行,您是否必须在调用适配器之前再次 WLClent 连接?心跳还有其他功能吗?

以上是关于成功连接几分钟后,Worklight Native iOS App 以 NSRangeException 终止的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight - “与服务器的连接不成功”

成功 IMC 身份验证后 Worklight 身份验证错误 401

Worklight 6.2 - 隐藏 iphone/native 下的 LibInclude 目录

几分钟后 HTTPS 连接停止工作

在 docker 容器中几分钟后 Spring Boot 连接重置

IBM Worklight:基于适配器的身份验证成功后未获得响应