UIWebview通过JS调用Objc方法并捕获返回值

时间:2018-10-22 15:34:55

标签: javascript ios uiwebview webkit uiwebviewdelegate

我试图将UIWebView中的值存储在NSUserDefaults中,并在稍后将我的Web应用程序加载到UIWebView中时加载它们。

我使用Apple文档中概述的模式。拦截document.location更改。我尝试在Objc中设置一个全局JS变量,然后在JS中读取该变量。

我在网络视图中的JS代码如下:

AppController.prototype.getUserDefinedLanguage = function() {

    var language = undefined;

    if (this.isUiWebView()) {
        // we are working inside of a TMC WAV
        var url = 'tmcwac://loaduserlanguage';
        document.location.href = url;
        console.log("loading language");
        language = app_language;

    } else {
        // try to use HTML5 localstorage
        language = localStorage.getItem("userlanguage");
    }

    return language;
}

通过代表我抓住了文档。href更改:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType (UIWebViewNavigationType)navigationType {


if ([actionType isEqualToString:@"setuserlanguage"]) {
    NSString *language = [request.URL.fragment stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:language forKey:@"userlanguage"];
}

if ([actionType isEqualToString:@"loaduserlanguage"]) {
    NSString *language = [[NSUserDefaults standardUserDefaults] stringForKey:@"userlanguage"];
    if (language == nil) {
        language = @"en";
    }
    [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"app_language = '%@'",language]];
}

return NO;

}

我的问题是,全局变量app_language不可用。 document.href更改似乎异步工作。这样,当尝试从下面的行访问该变量时就无法访问该变量。

当我手动尝试从控制台手动访问变量时,它显示正确的值。

0 个答案:

没有答案