Mam bardzo prosty interfejs UIWebView z zawartością pakietu aplikacji. Chciałbym, aby wszystkie linki w widoku internetowym otwierały się w przeglądarce Safari zamiast w widoku internetowym. czy to możliwe?
ios
uiwebview
mobile-safari
David Beck
źródło
źródło
Odpowiedzi:
Dodaj to do delegata UIWebView:
(edytowane w celu sprawdzenia typu nawigacji. można również przekazywać
file://
żądania, które byłyby względnymi linkami)Wersja szybka:
Wersja Swift 3:
Wersja Swift 4:
Aktualizacja
Jak
openURL
już nieaktualne w iOS 10:źródło
switch
preferuje się typy wyliczenioweJeśli ktoś się zastanawia, rozwiązanie Drawnonward wyglądałoby tak w Swift :
źródło
UIWebViewDelegate
Jeden szybki komentarz do odpowiedzi user306253: zachowaj ostrożność, gdy spróbujesz samodzielnie załadować coś do UIWebView (tj. Nawet z kodu), ta metoda zapobiegnie temu.
Co możesz zrobić, aby temu zapobiec (dzięki Wade) to:
Możesz także chcieć obsługiwać typy
UIWebViewNavigationTypeFormSubmitted
iUIWebViewNavigationTypeFormResubmitted
.źródło
Inne odpowiedzi mają jeden problem: polegają na tym, co robisz, a nie na samym łączu, aby zdecydować, czy załadować go w przeglądarce Safari, czy w widoku internetowym.
Czasami jest to dokładnie to, czego chcesz, co jest w porządku; ale w innych przypadkach, szczególnie jeśli masz linki kotwiące na swojej stronie, naprawdę chcesz otwierać tylko zewnętrzne linki w Safari, a nie wewnętrzne. W takim przypadku powinieneś sprawdzić
URL.host
właściwość swojego żądania.Używam tego fragmentu kodu, aby sprawdzić, czy mam nazwę hosta w analizowanym adresie URL, czy też jest osadzony HTML:
Możesz oczywiście dostosować wyrażenie regularne do swoich potrzeb.
źródło
if (request.URL?.scheme != "file")
W Swift możesz użyć następującego kodu:
Upewnij się, że sprawdziłeś wartość adresu URL i typ nawigacji.
źródło
Oto odpowiednik Xamarin iOS dla ciągnionej odpowiedzi.
źródło
Akceptowana odpowiedź nie działa.
Jeśli Twoja strona ładuje adresy URL za pomocą Javascript,
navigationType
będzie to możliweUIWebViewNavigationTypeOther
. Który niestety obejmuje również ładowanie stron w tle, takie jak analizy.Aby wykryć nawigację po stronie, musisz porównać
[request URL]
do[request mainDocumentURL]
.To rozwiązanie będzie działać we wszystkich przypadkach:
źródło
Odrzucenie aplikacji Uwaga:
Nareszcie
UIWbView
jest martwy i Apple już go nie zaakceptuje.Apple zaczął wysyłać wiadomości e-mail do wszystkich właścicieli aplikacji, którzy nadal używają
UIWebView
:Przestarzałe użycie interfejsu API - Apple przestanie akceptować zgłoszenia aplikacji korzystających z
UIWebView
interfejsów API.Apple bardzo poważnie podchodzi do kwestii prywatności użytkowników i oczywiste jest, że nie zezwalają na niezabezpieczony podgląd strony .
Więc usuń UIWebView z aplikacji tak szybko, jak to możliwe. nie używaj spróbuj użyć
UIWebView
w nowo utworzonej aplikacji i wolę używać,WKWebView
jeśli to możliwePrzykład:
źródło
W moim przypadku chcę się upewnić, że absolutnie wszystko w widoku sieci otwiera Safari oprócz początkowego ładowania, więc używam ...
źródło