关于解决iOS JS_ExecuteScript崩溃

解决了一个崩溃问题,可能有人会遇到,分享给大家。

昨天在ios上测试一个使用oc发送http请求数据,然后回调js层的功能。

使用的是 NSURLSessionDataTask 来发送异步的http请求,在http回调block里回调js层,来回测试了很多次, 偶发JS_ExecuteScript 崩溃。

对整个流程检查一直没找到问题,直到查看oc堆栈发现,回调是在另外一个线程里执行,而cocos是运行在ios的主线程,所以问题出来了,子线程里调用cocos-jsb的方法会导致jsb层异常,进而导致崩溃。(按理应该必崩,不知道为什么是偶发)

解决办法很简单,把jsb回调放到oc runtime的主线程执行

  //主线程中更新cocos
	dispatch_async(dispatch_get_main_queue(),^{		  	
		 ScriptingCore::getInstance()->evalString( [str UTF8String]);
	});

大概代码是这样

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                            completionHandler:
                                  ^(NSData *data, NSURLResponse *response, NSError *error) {
                                      // ...
                                      if (error) {
                                          /* ... Handle error ... */
                                      } else {
                                                  /* ... Send a response back to the device ... */
                                                 //主线程中更新cocos
					        dispatch_async(dispatch_get_main_queue(),^{		  	
						        ScriptingCore::getInstance()->evalString( [str UTF8String]);
					 });
                                      }
                                  }];
    
    [task resume];

这样之后就没什么问题了

最后,说明:会导致 JS_ExecuteScript 崩溃的原因很多,具体问题具体分析,最好是在evalString时做一个try catch包装保护。

1赞