2013-04-13 4 views
9

Я пошел использовать UIWebView для отображения динамического контента, вместо того, чтобы делать это изначально с использованием пользовательских интерфейсов. Можно ли запускать собственные функции приложения из простого попадания ссылок внутри UIWebView? Пример: нажатие ссылки, которая затем переключает текущий вид?Может ли интерфейс UIWebView взаимодействовать с приложением?

ответ

23

Да, это возможно. В вашем HTML, вы пишете JS, чтобы загрузить URL с поддельной схемы, такие как

window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here"; 

Затем в коде IOS, назначить делегата вашего WebView, а в делегата, ручка

webView:shouldLoadWithRequest:navigationType 

с чем-то вроде

if([request.URL.scheme isEqualToString: @"request_for_action"]) 
{ 
    // parse your custom URL to extract parameter, use URL parts or query string as you like 
    return NO; // return NO, so webView won't actually try to load this fake request 
} 

-

просто в сторону, вы можете сделать по-другому, пусть IOS сотрудничества де вызвать некоторые коды JS в вашем HTML по использованием

NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"]; 
9

Да! Когда пользователь нажимает ссылку, вы слышите об этом в делегате веб-представления и можете делать все, что захотите. Мощный материал можно сделать таким образом.

Делегат веб-представления отправлен webView:shouldStartLoadWithRequest:navigationType:. Вы анализируете, что произошло, и отвечаете, как хотите. Чтобы предотвратить просмотр веб-представления по ссылке (которая в конечном итоге может быть полностью фальшивой), просто верните NO.

В этом примере из приложения TidBITS News у меня есть ссылка на веб-странице, в которой используется полностью созданная схема play:. Я обнаруживаю, что в делегатом и играть:

- (BOOL)webView:(UIWebView *)webView 
     shouldStartLoadWithRequest:(NSURLRequest *)r 
     navigationType:(UIWebViewNavigationType)nt { 
    if ([r.URL.scheme isEqualToString: @"play"]) { 
     [self doPlay:nil]; 
     return NO; 
    } 
    if (nt == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:r.URL]; 
     return NO; 
    } 
    return YES; 
} 
+0

Это выглядит именно то, что мне нужно сделать. Но я не могу понять, где я могу поместить этот метод? Спасибо за описательный ответ, кстати! –

+0

Вы помещаете его туда, где есть делегат UIWebView! – matt

+0

Alwesome, это работает! :) Еще один вопрос: почему, когда я нажимаю ссылку с предопределенной схемой url, приложение перенаправляется в Safari и пытается открыть его? –

2

Реализовать UIWebViewDelegate метод webView:shouldStartLoadWithRequest:navigationType:.

Обращайтесь с навигацией по типу и запросу при необходимости.

+0

Я установил делегат и реализовал методы делегирования uiwebview. Но ни один из моих методов-делегатов не вызывается, когда я нажимаю на некоторое содержимое uiwebview. Обратного вызова нет. То, что должно быть сделано? – iPhoneDeveloper

+0

@iPhoneDeveloper Вы должны оставить свой собственный вопрос со всеми необходимыми деталями. – rmaddy

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