UIWebview вызывает метод Objc через JS и перехватывает возвращаемое значение - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь сохранить значение из UIWebView в NSUserDefaults и загрузить их, когда мое веб-приложение будет загружено в UIWebView позже.

Я использую шаблон, изложенный в документации Apple.Перехват документа. Изменение местоположения.Я пытаюсь установить глобальную переменную JS в Objc и позже читаю переменную в 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;
}

Через делегата я улавливаю изменение document.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 работает асинхронно.так что переменная недоступна при попытке доступа к ней из строки ниже.

Когда я вручную пытаюсь получить доступ к переменной вручную из консоли, она показывает правильное значение.

...