Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[WEEX-622][iOS] record jsservice name to context && modify white scre…
Browse files Browse the repository at this point in the history
…en check logic (#1541)

* record service name to context , so if exception, we know which service has problem
* rport white screen erro ,if createinstane error && never add view
* report contextName
  • Loading branch information
lucky-chen authored and cxfeng1 committed Sep 20, 2018
1 parent 6cfc924 commit 2b46ca7
Showing 1 changed file with 45 additions and 31 deletions.
76 changes: 45 additions & 31 deletions ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -498,11 +498,17 @@ - (void)createInstance:(NSString *)instanceIdString
}

[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
NSDictionary* funcInfo = @{
@"func":@"createInstance",
@"arg":@"start"
};
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"]= funcInfo;
if ([NSURL URLWithString:sdkInstance.pageName] || sdkInstance.scriptURL) {
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString withSourceURL:[NSURL URLWithString:sdkInstance.pageName]?:sdkInstance.scriptURL];
} else {
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString];
}
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = nil;
WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
}];
}
Expand All @@ -515,8 +521,15 @@ - (void)createInstance:(NSString *)instanceIdString
} else {
args = @[instanceIdString, jsBundleString, options ?: @{}];
}
[self _mountInstanceInfoToGlobalContext:sdkInstance];
NSDictionary* funcInfo = @{
@"func":@"createInstance",
@"arg":@"start",
@"instanceId":sdkInstance.instanceId?:@"unknownId"
};
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = funcInfo;
[self callJSMethod:@"createInstance" args:args];
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = nil;

WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
}
}
Expand All @@ -531,21 +544,6 @@ - (BOOL) _shouldMountExtInfoToInstanceContxt
return shouldMountInstanceContextExtInfo;
}

- (void) _mountInstanceInfoToGlobalContext:(WXSDKInstance*) instance
{
if (![self _shouldMountExtInfoToInstanceContxt]) {
return;
}
JSContext* globalContext = self.jsBridge.javaScriptContext;
if (!globalContext && [globalContext.name isEqualToString:@"Weex Context"]) {
return;
}
NSMutableDictionary *extInfo = [NSMutableDictionary dictionaryWithDictionary:@{
@"wxInstanceId":instance.instanceId?:@"unSetInstanceId"
}];
globalContext[@"wxInstanceExtInfo"] = extInfo;
}

- (void)createInstance:(NSString *)instanceIdString
contents:(NSData *)contents
options:(NSDictionary *)options
Expand Down Expand Up @@ -841,12 +839,18 @@ - (void)executeJsService:(NSString *)script withName:(NSString *)name
{
if(self.frameworkLoadFinished) {
WXAssert(script, @"param script required!");
NSDictionary* funcInfo = @{
@"func":@"executeJsService",
@"arg":name?:@"unsetScriptName"
};
self.jsBridge.javaScriptContext[@"wxExtFuncInfo"] = funcInfo;
[self.jsBridge executeJavascript:script];
self.jsBridge.javaScriptContext[@"wxExtFuncInfo"] = nil;

if ([self.jsBridge exception]) {
NSString *exception = [[self.jsBridge exception] toString];
NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] %@",exception];
[WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_INVOKE" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_INVOKE] function:@"" exception:errMsg extParams:nil];
NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] name:%@,arg:%@,exception :$@",name,exception];
[WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_INVOKE" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_INVOKE] function:@"executeJsService" exception:errMsg extParams:nil];
WX_MONITOR_FAIL(WXMTJSService, WX_ERR_JSFRAMEWORK_EXECUTE, errMsg);
} else {
// success
Expand Down Expand Up @@ -1030,33 +1034,43 @@ + (void)mountContextEnvironment:(JSContext*)context
bundleUrl = @"weex-main-jsfm";
}
userInfo = [NSDictionary dictionary];
tryFindInstanceInfoInGlobalContext = YES;
JSValue* instanceExtInfoValue = [context objectForKeyedSubscript:@"wxInstanceExtInfo"];
if (nil != instanceExtInfoValue) {
NSDictionary* instanceInfo = [instanceExtInfoValue toDictionary];
NSString* exceptionInstanceId = [instanceInfo objectForKey:@"wxInstanceId"];
if (nil != exceptionInstanceId) {
instance = [WXSDKManager instanceForID:exceptionInstanceId];
}
}
errorCode = [NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_EMPTY_SCREEN_JS];
}
} else {
instance = [WXSDKEngine topInstance];
}

NSDictionary* wxExtFuncInfo = [context[@"wxExtFuncInfo"] toDictionary];
NSString* recordFunc = [wxExtFuncInfo objectForKey:@"func"];
NSString* recordArg = [wxExtFuncInfo objectForKey:@"arg"];
NSString* recordInsstanceId = [wxExtFuncInfo objectForKey:@"instanceId"];
if (nil == instance) {
instance = [WXSDKManager instanceForID:recordInsstanceId];
tryFindInstanceInfoInGlobalContext = nil!= instance;
}

if(nil != instance && [recordFunc isEqualToString:@"createInstance"] && !instance.apmInstance.hasAddView){
errorCode = [NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_EMPTY_SCREEN_JS];
}

if (instance && !tryFindInstanceInfoInGlobalContext) {
if (instance) {
bundleUrl = instance.pageName?:([instance.scriptURL absoluteString]?:@"WX_KEY_EXCEPTION_WXBRIDGE");
message = [NSString stringWithFormat:@"[WX_KEY_EXCEPTION_WXBRIDGE] [%@:%@:%@] %@\n%@\n%@\n%@\n%@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], [exception toString], [exception[@"stack"] toObject], instance.scriptURL.absoluteString, instance.callCreateInstanceContext?:@"", instance.createInstanceContextResult?:@"", instance.executeRaxApiResult?:@""];
userInfo = @{@"jsMainBundleStringContentLength":instance.userInfo[@"jsMainBundleStringContentLength"]?:@"",
@"jsMainBundleStringContentMd5":instance.userInfo[@"jsMainBundleStringContentMd5"]?:@""};
}

if (commitException) {
WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:bundleUrl errorCode:errorCode functionName:@"" exception:message userInfo:[userInfo mutableCopy]];
NSMutableDictionary* reportInfo = [[NSMutableDictionary alloc] initWithDictionary:[userInfo mutableCopy]];
[reportInfo setObject:context.name?:@"unknownContextName" forKey:@"wxContextName"];

WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:bundleUrl errorCode:errorCode functionName:[NSString stringWithFormat:@"func: %@ arg:%@",recordFunc,recordArg]?:@"exceptionHandler" exception:message userInfo:reportInfo];

[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo.instanceId errCode:jsExceptionInfo.errorCode function:@"exceptionHandler" exception:jsExceptionInfo.exception extParams:jsExceptionInfo.userInfo];
if (nil == instance) {
[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo];
}else{
[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo.instanceId errCode:jsExceptionInfo.errorCode function:jsExceptionInfo.functionName exception:jsExceptionInfo.exception extParams:jsExceptionInfo.userInfo];
}

WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_JS_EXECUTE, message);
if (instance.onJSRuntimeException && !tryFindInstanceInfoInGlobalContext) {
instance.onJSRuntimeException(jsExceptionInfo);
Expand Down

0 comments on commit 2b46ca7

Please sign in to comment.