You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by mo...@apache.org on 2019/04/30 05:49:56 UTC
[incubator-weex] branch master updated: [iOS] report exception when
native render error
This is an automated email from the ASF dual-hosted git repository.
moshen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git
The following commit(s) were added to refs/heads/master by this push:
new 9c8ea85 [iOS] report exception when native render error
new 507dc0b Merge pull request #2385 from jianhan-he/master
9c8ea85 is described below
commit 9c8ea85fd11f1f7bc2ac7215fdc9016a2977e916
Author: linghe.lh <li...@alibaba-inc.com>
AuthorDate: Tue Apr 30 11:51:06 2019 +0800
[iOS] report exception when native render error
---
ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m | 21 ++++++++++++----
ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm | 8 +++---
ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h | 1 +
ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h | 5 ++--
ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m | 29 ++++++++++++++++------
ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 6 +++--
.../core/network/ios/default_request_handler.mm | 2 +-
7 files changed, 51 insertions(+), 21 deletions(-)
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index be90637..a4b6cf5 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -153,7 +153,10 @@ _Pragma("clang diagnostic pop") \
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ instance.onFailed(error);
}
return 0;
}];
@@ -426,7 +429,9 @@ _Pragma("clang diagnostic pop") \
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ sdkInstance.onFailed(error);
}
WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
@@ -599,7 +604,9 @@ _Pragma("clang diagnostic pop") \
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ sdkInstance.onFailed(error);
}
WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
@@ -732,7 +739,9 @@ _Pragma("clang diagnostic pop") \
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ sdkInstance.onFailed(error);
}
} else {
[self callJSMethod:@"destroyInstance" args:@[instance]];
@@ -757,7 +766,9 @@ _Pragma("clang diagnostic pop") \
WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
if (sdkInstance.dataRender) {
if (!_dataRenderHandler) {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ sdkInstance.onFailed(error);
return;
}
WXPerformBlockOnComponentThread(^{
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index 8bb2624..50aa502 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -132,13 +132,13 @@ namespace WeexCore
if (!instance) {
break;
}
- WXSDKErrCode errorCode = WX_KEY_EXCEPTION_DEGRADE;
+ WXSDKErrCode errorCode = WX_ERR_JS_EXECUTE;
BOOL is_render_failed = NO;
- if (func && strcmp(func, "createInstance") == 0) {
- errorCode = WX_KEY_EXCEPTION_EMPTY_SCREEN_JS;
+ if (func && (strcmp(func, "CreatePageWithContent") == 0 || strcmp(func, "UpdateComponentData") == 0)) {
+ errorCode = WX_ERR_EAGLE_RENDER;
WXComponentManager *manager = instance.componentManager;
if (manager.isValid) {
- NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":[NSString stringWithUTF8String:exception]}];
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":[NSString stringWithUTF8String:exception], @"exception function:":@(func)}];
[manager renderFailed:error];
}
is_render_failed = YES;
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
index 99b1f60..689b046 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
@@ -55,6 +55,7 @@ typedef NS_ENUM(int, WXSDKErrCode)
WX_ERR_RENDER_REMOVEEVENT = -2107,
WX_ERR_RENDER_SCROLLTOELEMENT = -2110,
WX_ERR_RENDER_TWICE = -2111,
+ WX_ERR_EAGLE_RENDER = -2112,
WX_ERR_RENDER_END = -2199,
WX_ERR_DOWNLOAD_START = -2201,
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 29d9fd1..1cbdad7 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -118,9 +118,10 @@ extern "C" {
/**
+ * download JS Script
- + * @param scriptUrl : script url
+ + * @param instance : instance id
+ + * @param scriptUrl : script url
+ **/
-- (void)DownloadJS:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
+- (void)DownloadJS:(NSString *)instance url:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
/**
* Register JS service Script
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index 2954a69..78cd4cd 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -300,21 +300,32 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
return value;
}
-- (void)DownloadJS:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
+- (void)DownloadJS:(NSString*)instance url:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
{
if (!scriptUrl || ![scriptUrl.absoluteString length]) {
- complection(nil);
+ if (complection) {
+ complection(nil);
+ }
return;
}
WXResourceRequest* request = [WXResourceRequest requestWithURL:scriptUrl];
WXResourceLoader* jsLoader = [[WXResourceLoader alloc] initWithRequest:request];
jsLoader.onFinished = ^(WXResourceResponse *response, NSData *data) {
NSString* jsString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- complection(jsString);
+ if (complection) {
+ complection(jsString);
+ }
};
jsLoader.onFailed = ^(NSError *loadError) {
- WXLogError(@"No js URL found");
- complection(nil);
+ if (complection) {
+ complection(nil);
+ }
+
+ WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
+ NSString *errorMessage = [NSString stringWithFormat:@"Request to %@ occurs an error:%@, info:%@", request.URL, loadError.localizedDescription, loadError.userInfo];
+ WXSDKErrCode errorCode = WX_KEY_EXCEPTION_JS_DOWNLOAD;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{NSLocalizedDescriptionKey:(errorMessage?:@"No message")}];
+ sdkInstance.onFailed(error);
};
[jsLoader start];
@@ -424,7 +435,9 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ instance.onFailed(error);
}
return;
}
@@ -497,7 +510,9 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ instance.onFailed(error);
}
}
else {
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index d5be31b..2ed9999 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -272,7 +272,7 @@ typedef enum : NSUInteger {
}
- (void)_downloadAndExecScript:(NSURL *)url {
- [[WXSDKManager bridgeMgr] DownloadJS:url completion:^(NSString *script) {
+ [[WXSDKManager bridgeMgr] DownloadJS:_instanceId url:url completion:^(NSString *script) {
if (!script) {
return;
}
@@ -287,7 +287,9 @@ typedef enum : NSUInteger {
});
}
else {
- WXLogError(@"No data render handler found!");
+ WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+ NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+ self.onFailed(error);
}
return;
}
diff --git a/weex_core/Source/core/network/ios/default_request_handler.mm b/weex_core/Source/core/network/ios/default_request_handler.mm
index a6a35db..02e42b3 100644
--- a/weex_core/Source/core/network/ios/default_request_handler.mm
+++ b/weex_core/Source/core/network/ios/default_request_handler.mm
@@ -31,7 +31,7 @@ namespace network {
void DefaultRequestHandler::Send(const char* instance_id, const char* url, Callback callback) {
NSURL* nsURL = [NSURL URLWithString:NSSTRING(url)];
- [[WXSDKManager bridgeMgr] DownloadJS:nsURL completion:^(NSString *script) {
+ [[WXSDKManager bridgeMgr] DownloadJS:@(instance_id) url:nsURL completion:^(NSString *script) {
WXPerformBlockOnBridgeThread(^{
callback([script UTF8String] ? : "");
});