diff --git a/Rexxar/Core/RXRViewController.h b/Rexxar/Core/RXRViewController.h index a30ad42..45345dc 100644 --- a/Rexxar/Core/RXRViewController.h +++ b/Rexxar/Core/RXRViewController.h @@ -69,6 +69,14 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)onPageInvisible; +/** + * 调用 WebView 的一个 JavaScript 函数,并传入一个 json 串作为参数。 + * + * @param function 调用的函数。 + * @param jsonParameter 传递的参数,json 串。 + */ +- (nullable NSString *)callJavaScript:(NSString *)function jsonParameter:(nullable NSString *)jsonParameter; + @end @@ -87,16 +95,16 @@ NS_ASSUME_NONNULL_BEGIN + (void)updateRouteFilesWithCompletion:(nullable void (^)(BOOL success))completion; /** - * 判断存在对应于 uri 的 route 信息 + * 判断路由表是否存在对应于 uri 的 route 信息。 * - * @param uri 待判断的 uri + * @param uri 待判断的 uri。 */ + (BOOL)isRouteExistForURI:(NSURL *)uri; /** - * 判断存在对应于 uri 的 route 信息 + * 判断本地(缓存,或预置资源中)是否已经下载了存在对应于 uri 的 route 信息的资源。 * - * @param uri 待判断的 uri + * @param uri 待判断的 uri。 */ + (BOOL)isLocalRouteFileExistForURI:(NSURL *)uri; diff --git a/Rexxar/Core/RXRViewController.m b/Rexxar/Core/RXRViewController.m index b279250..f3b59f9 100644 --- a/Rexxar/Core/RXRViewController.m +++ b/Rexxar/Core/RXRViewController.m @@ -104,18 +104,39 @@ - (void)reloadWebView } } +#pragma mark - Native Call WebView JavaScript interfaces. + - (void)onPageVisible { // Call the WebView's visiblity change hook for javascript. - NSString *result = [_webView stringByEvaluatingJavaScriptFromString:@"window.Rexxar.Lifecycle.onPageVisible()"]; - RXRDebugLog(@"window.Rexxar.Lifecycle.onPageVisible: %@", result); + [self callJavaScript:@"window.Rexxar.Lifecycle.onPageVisible" jsonParameter:nil]; } - (void)onPageInvisible { // Call the WebView's visiblity change hook for javascript. - NSString *result = [_webView stringByEvaluatingJavaScriptFromString:@"window.Rexxar.Lifecycle.onPageInvisible()"]; - RXRDebugLog(@"window.Rexxar.Lifecycle.onPageInvisible: %@", result); + [self callJavaScript:@"window.Rexxar.Lifecycle.onPageInvisible" jsonParameter:nil]; +} + +- (NSString *)callJavaScript:(NSString *)function jsonParameter:(NSString *)jsonParameter +{ + NSString *jsCall; + if (jsonParameter) { + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"]; + jsonParameter = [jsonParameter stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"]; + jsCall = [NSString stringWithFormat:@"%@('%@')", function, jsonParameter]; + } else { + jsCall = [NSString stringWithFormat:@"%@()", function]; + } + NSString *result = [_webView stringByEvaluatingJavaScriptFromString:jsCall]; + RXRDebugLog(@"jsCall: function:%@, parameter %@, result: %@", function, jsonParameter, result); + return result; } #pragma mark - UIWebViewDelegate's method