Вызвать метод objective-c из javascript

Я делаю любой webView И я хочу вызвать из javascript любой метод цели c, который возвращает любой параметр. Я пробовал много способов, но не допускал. Объективный метод c здесь:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *URL = [request URL];
    if ([[URL scheme] isEqualToString:@"donordialog"])
    {
        // now we need to figure out the function part
        NSString *functionString = [URL resourceSpecifier];

        if ([functionString hasPrefix:@"bloodTypeChanged"])
        {
            // the blood type has changed, now do something about it.
            NSString *parameter = [functionString stringByReplacingOccurrencesOfString:@"bloodTypeChanged" withString:@""];

            // remove the '(' and then the ')'
            parameter = [parameter stringByReplacingOccurrencesOfString:@"(" withString:@""];
            parameter = [parameter stringByReplacingOccurrencesOfString:@")" withString:@""];

            // log the paramter, as I don't know what to do with it right now
            UIAlertView *alert=[[ UIAlertView alloc] initWithTitle:@"iosdan javascripti"
                                                                           message:@"ddddddddd"
                                                                    delegate:nil
                                                                cancelButtonTitle:@"OK"
                                                               otherButtonTitles:nil];

            [alert show];
            //NSLog(@"%@", parameter);
        }

        return NO;
    }

    return YES;
}

JavaScript:

function myFunction() {
    url="http://example.com";
    window.location="donordialog:blooTypeChanged("+url+")";
}

HTML:

<button onclick="myFunction()">click me</button>

comment: Мне нужно это: это, например, метод obj c. aaa {}. Мой метод aaa должен возвращать любой параметр. и у меня есть wevView. Я загрузил любой URL-адрес в этот webView: например, www.example.com/forios. Мне нужно вызвать этот метод (aaa) из javascript, который находится в html на www.example.com/forios, и предупредить результат функции aaa. Понимаю?. Если вы понимаете, не смотрите на мой код. помогите, пожалуйста, в любом случае. андроидная версия моего вопроса: Вызвать функцию Java из JavaScript через Android WebView Я хочу предупредить некоторый параметр, возвращающийся из метода. Помоги пожалуйста. Спасибо.

Ответ 1

Самый обычный подход, который я использовал для взаимодействия с javascript в obj-c, - это изменение хэша. На обязательном событии в js write window.location.hash = '#cmd_alertMessage'; после этого вызывается - (BOOL)webView: shouldStartLoadWithRequest: navigationType::

   - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSArray * compenents = [request.URL.absoluteString componentsSeparatedByString:@"#"];
    if (compenents.count > 1) {
        NSString * cmd = compenents[1];
        if ([cmd rangeOfString:@"cmd_alertMessage"].location != NSNotFound) {
            // Call your obj-c method and get appropriated param
            NSString * jsFunction = [NSString stringWithFormat:@"setParameterFromAAAMethod('%@')", [self aaa]];
            // Return this param back to js
            NSString * alertMessage = [webView stringByEvaluatingJavaScriptFromString:jsFunction];
        }
    }


    return YES;
}

- (NSString *)aaa
{
    return @"This is special parameter that you need";
}

Итак, он будет работать в 3 этапа:

  • Вызывать хеш для запроса параметра из obj-c кода в   JS;
  • Изменен хэш хэндля (запрос параметра) и возвращается обратно   js в obj-c;
  • Обработать полученный параметр снова в js

Ответ 2

Вот быстрое и простое решение без JavaScriptCore для обратной совместимости (может рассмотреть возможность обновления до Javascriptcore). Здесь легкая реализация.

Примечание: это решение предназначено только для UIwebview (не UIscrollview)

//viewcontroller.h

@interface ViewController : UIViewController<UIWebViewDelegate>

@property (strong, nonatomic) IBOutlet UIWebView *viewWeb;
@end

//viewcontroller.m

- (void)viewDidLoad
{
    [super viewDidLoad];


    NSString *fullURL = @"http:player.fusion.fm";
    NSURL *url = [NSURL URLWithString:fullURL];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [_viewWeb loadRequest:requestObj];
   _viewWeb.delegate = self;
 }

 -(BOOL)webView:(UIWebView *)_viewWeb shouldStartLoadWithRequest:(NSURLRequest *)request   navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = request.URL;
    if ([[url scheme] isEqualToString:@"ios"])
    {
        [self mute]; // <-- YOUR OBJ-C FUNCTION HERE
        NSLog(@"test");
        return YES;
    }else
     {
        return YES;
    }

 }

//Javascript (в веб-просмотре)

try
{
  window.location="ios://null"
}
catch(err)
{
}

Источник: http://adoptioncurve.net/archives/2012/09/calling-objective-c-methods-from-javascript-in-a-uiwebview/

Ответ 4

Ну, я не уверен, правильно ли я получил ваш вопрос или нет, но если вы хотите вызвать какой-либо метод javascript, то вы можете сделать так: -

[yourWebView stringByEvaluatingJavaScriptFromString:@"yourMethodName()"];

Вы также можете передавать параметры в указанном выше методе.