2014-02-21 4 views
4

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

- (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> 

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

+0

Ваш вопрос не ясен. Чего вы хотите достичь? –

+0

Нечего архивировать. Я хочу предупредить любой параметр, возвращающийся из метода obj c в WebView. Я попробовал все ответы из стека и других. Но не успех. –

+0

Я поставил этот код, например. Все ответы нравятся. –

ответ

2

Самый обычный подход, который я использовал, чтобы взаимодействовать с JavaScript в Obj-C является изменение хэш. На требуемого события в ваших JS написать 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 этапа:

  1. Invoke хэш изменения для запроса параметров от Obj-C код в js;
  2. Хеш рукоятки изменен (запрос параметров) и возвращается обратно в js в obj-c;
  3. Handle получил параметр в JS снова
+0

error: Нет видимого интерфейса для 'NSString' объявляет селектор 'isContainString' –

+0

oops, извините, это было мое расширение. ответ обновлен. –

+1

Спасибо за ответ, но я хочу наоборот. Я сделал это. android. версия моего вопроса: http: //stackoverflow.com/questions/10389572/call-java-function-from-javascript-over-android-webview –

0

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

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

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

+2

Спасибо за ответ, но я хочу наоборот. Я хочу сказать, что любой метод в obj c, whitch возвращает любую строку или параметр int. предупреждайте этот параметр в javascript (webview). Вызовите этот метод из javascript whitch, включенного в webview. –

+0

версия для Android моего вопроса: http: //stackoverflow.com/questions/10389572/call-java-function-from-javascript-over- android-webview –

3

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

Примечание: это решение для UIWebView только (не UIScrollView)

//viewcontroller.h

@interface ViewController : UIViewController<UIWebViewDelegate> 

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

// ViewController.м

- (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 (в WebView)

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

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

Смежные вопросы