Poszedłem do korzystania z UIWebView, aby wyświetlić zawartość dynamiczną, zamiast robić to natywnie za pomocą elementów UI. Czy możliwe jest wyzwolenie natywnych funkcji aplikacji po prostu naciśnięciu linków w interfejsie UIWebView? Przykład: naciśnięcie linku, który przełącza bieżący widok?Czy interfejs UIWebView może komunikować się z aplikacją?
Odpowiedz
Tak, jest to możliwe. W kodzie HTML, piszesz JS załadować URL z fałszywego systemu takiego jak
window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here";
Następnie w kodzie iOS przypisać delegata do Webview, aw swoim delegatem, uchwyt
webView:shouldLoadWithRequest:navigationType
z czymś
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
}
-
tylko na bok, można to zrobić w inny sposób, co pozwoli na iOS de wywołaj niektóre kody JS w twoim html przez używając
NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"];
Tak! Gdy użytkownik naciśnie link, usłyszysz o tym w delegacie widoku WWW i możesz wtedy robić, co chcesz. Potężne rzeczy można zrobić w ten sposób.
Delegat widoku WWW jest wysyłany webView:shouldStartLoadWithRequest:navigationType:
. Analizujesz co się stało i reagujesz tak, jak chcesz. Aby nie dopuścić do tego, aby widok sieciowy próbował podążać za linkiem (który może być całkowicie fałszywy), po prostu zwróć NIE.
W tym przykładzie z aplikacji Wiadomości TidBITS, mam link na stronie internetowej, która używa całkowicie wymyślonego schematu play:
. Wykryć, że w delegata i zaawansowania:
- (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;
}
Wdrożenie metody webView:shouldStartLoadWithRequest:navigationType:
UIWebViewDelegate
.
Uchwyt navigationType i żądanie w razie potrzeby.
Ustawiłem delegata i zaimplementowałem metody delegatów uiwebview. Ale żadna z moich metod delegowania nie jest wywoływana, gdy klikam na jakąś zawartość interfejsu uiwebview. Nie ma połączenia zwrotnego. Co powinno być zrobione? – iPhoneDeveloper
@iPhoneDeveloper Powinieneś zamieścić własne pytanie ze wszystkimi istotnymi szczegółami. – rmaddy
- 1. Czy Silverlight może komunikować się z instrumentem MIDI?
- 2. Czy istnieje interfejs API języka Java, który może komunikować się binarnie z usługą Microsoft WCF?
- 3. Czy usługa Android może komunikować się z dwoma interfejsami?
- 4. Python nie może komunikować się z podprocessem serwera Minecraft
- 5. Jak komunikować się z aplikacją na Androida z zewnętrznym MySQL db
- 6. Przesuwanie klawiatury powoduje, że interfejs UIWebView przesuwa się w lewo
- 7. Klient serwera tcp NSOS iS NSStream nie może komunikować się
- 8. Jak mogę komunikować się z elementami za przezroczystą aplikacją systemu Android?
- 9. JavaScript/JQuery komunikować się z SerialPort/COM1
- 10. Czy macierzysty klient iOS może łączyć się z serwerem meteor.js?
- 11. Jak komunikować się z modemem USB 3G?
- 12. Jak komunikować się z urządzeniem USB?
- 13. Zamknij interfejs UIWebView za pomocą javascript: window.close();
- 14. UIWebView nie może wybrać tekstu
- 15. iOS - Czy można komunikować się między aplikacjami za pośrednictwem hosta lokalnego?
- 16. Czy pamięć UIWebView wycieka?
- 17. Pomocnicza aplikacja mac (element logowania), nie można się komunikować z
- 18. Jak wdrożyć i komunikować się za pośrednictwem stron internetowych w aplikacji na iOS?
- 19. Jak komunikować się między dwoma dziećmi Fragmenty wewnątrz zagnieżdżonego fragmentu
- 20. Jak komunikować się z serwerem pocztowym za pośrednictwem aplikacji internetowej?
- 21. Jak komunikować się z serwerem Node.js z klienta Androida
- 22. Skąd tekstowy skrypt tła rozszerzenia Chrome może komunikować się z pracownikiem serwisu WWW?
- 23. Jak komunikować się między usługami systemu Windows
- 24. Kopia robocza "<nazwa projektu>" nie mogła zatwierdzić plików - nie można się komunikować z aplikacją pomocniczą
- 25. Monotouch uiwebview nie może znaleźć lokalnego html
- 26. Jak komunikować się między zadaniami Rake?
- 27. swift: Nie można się komunikować z Konstruktorem interfejsu
- 28. Jak skonfigurować i komunikować się z portem szeregowym?
- 29. Potrzebuję komunikować się z wieloma zdalnymi systemami aktorskimi
- 30. Aplikacja Flask + Tornado - jak komunikować się z serwerem (odmowa połączenia)
Wygląda dokładnie to, co muszę osiągnąć. Ale nie wiem, gdzie mogę umieścić tę metodę? Dzięki, za odpowiedź opisową, przy okazji! –
Umieszczasz to gdziekolwiek jest delegat UIWebView! – matt
Alwesome, to działa! :) Jeszcze jedno pytanie: dlaczego po kliknięciu linku z wcześniej zdefiniowanym schematem URL aplikacja przekierowuje do Safari i próbuje ją otworzyć? –