Лучшая практика: как вызвать код Objective-C из JavaScript - PullRequest
1 голос
/ 09 марта 2012

Я искал способ вызвать код Objective C из некоторого JavaScript в моем UIWebView . Об этом было создано много тем, и некоторые из них рекомендуют процедуру, проделанную в сообщении в блоге Секреты UIWebView - Часть 3 - Как правильно вызвать ObjectiveC из Javascript , где UIWebViewDelegate методы взламываются для вызова собственного кода Objective-C. Это все еще лучший способ сделать это? Кажется, у PhoneGap есть способ сделать это, но я не могу узнать, как это сделать. Но если их процедура равна этой, я не могу понять, почему я должен включать их библиотеку только для этого.

Какая процедура в настоящее время является лучшей практикой для этого?

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Без какой-либо внешней структуры мы можем сделать это. Чтобы достичь этого, как телефон, мы должны использовать webView. Например, если вам нужно вызвать целевую функцию c при нажатии кнопки в веб-просмотре. Когда щелчок по вашей кнопке на html-странице вызывает javascript, просто добавьте iFrame, который будет содержать имя функциицелевая функция C.

например:

var iframe = document.createElement("IFRAME");
    iframe.setAttribute("src", "js-frame:" + functionName + ":" + callbackId);
    document.documentElement.appendChild(iframe);
    iframe.parentNode.removeChild(iframe);
    iframe = null

;

Этот iFrame может быть принят в вашем webView Делегат, реализованный в вашем ParentView в webView, вроде-

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

    NSString *requestString = [[request URL] absoluteString];




    if ([requestString hasPrefix:@"js-frame:"]) {

        NSArray *components = [requestString componentsSeparatedByString:@":"];

        NSString *function = (NSString*)[components objectAtIndex:1];
        int callbackId = [((NSString*)[components objectAtIndex:2]) intValue];

                                  stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        ;

        [self handleCall:function callbackId:callbackId];

        return NO;
    }

    return YES;
}

handleCall должен будет обработать вызов вашего намеченного метода с именем "function"

0 голосов
/ 21 марта 2012

Я использую плагин NativeBridge , рекомендуемый в посте блога .

0 голосов
/ 09 марта 2012

Нет (публичного) API для этого, кроме использования собственной схемы URL внутри вашего кода JS для вызова JavaScript.

Допустим, вы загружаете URL myproto://invokeMethodA в свой код JS, например

window.location.href = "myproto://invokeMethodA";

вы можете перехватить эту загрузку в методе делегата UIWebView s

– webView:shouldStartLoadWithRequest:navigationType:

и делай свое дело. Убедитесь, что вы вернули NO, чтобы фактически не выполнять запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...