Вызвать метод 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/
Ответ 3
Вы можете установить скрытое местоположение iframe для чего-то конкретного для вашего приложения, а затем перехватить этот запрос в Obj-C.
Вот обзор и некоторые примеры: http://blog.techno-barje.fr//post/2010/10/06/UIWebView-secrets-part3-How-to-properly-call-ObjectiveC-from-Javascript/
Ответ 4
Ну, я не уверен, правильно ли я получил ваш вопрос или нет, но если вы хотите вызвать какой-либо метод javascript, то вы можете сделать так: -
[yourWebView stringByEvaluatingJavaScriptFromString:@"yourMethodName()"];
Вы также можете передавать параметры в указанном выше методе.