Quando eseguo una ricerca su google e faccio clic su Etsy.com per exmaple, WKWebView mi reindirizza all'app Etsy installata sul mio iPhone. Come posso disabilitare questo comportamento? Voglio WKWebView per reindirizzarmi al sito web etsy.com mobile. Sto usando swift.Disabilitare WKWebView per aprire i collegamenti al reindirizzamento alle app installate sul mio iPhone
risposta
ho installato l'app Etsy e ho confermato che cercare "etsy" in Safari e toccando il primo risultato (etsy.com) avvierà l'app Etsy.
ho creato un test "Single View Application" in Xcode e semplicemente aggiunte le linee di seguito per viewDidLoad ViewController
s':
override func viewDidLoad() {
super.viewDidLoad()
let webView = WKWebView(frame:view.bounds, configuration: WKWebViewConfiguration())
view.addSubview(webView)
webView.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")!))
}
dopo la ricerca di etsy e cliccando sul primo risultato che mi porta a etsy. com nella mia app di test (non passa all'app Etsy).
hai fatto qualcos'altro nel codice che potrebbe causare WKWebView per consentire reindirizzamenti?
Sfortunatamente, WKWebView
non invia gli URL con schemi personalizzati alla tua app da gestire automaticamente.
Se ci provi senza una gestione speciale, sembrerà che la tua vista web si blocchi dopo che l'utente si è autenticato con il servizio di terze parti e non riceverai mai la tua richiamata. Potresti provare a utilizzare un URI di reindirizzamento con lo schema http o https standard, ma in tal caso, lo WKWebView
proverà semplicemente a caricarlo, anziché a dirigere dalla visualizzazione Web alla tua app nativa da gestire.
Al fine di gestire il reindirizzamento, è necessario implementare decidePolicyForNavigationAction
nel WebPolicyDelegate
del vostro WKWebView
per rilevare l'usanza URL schema e dirigerla per la vostra applicazione da trattare:
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")
let app = UIApplication.sharedApplication()
let url = navigationAction.request.URL
let myScheme: NSString = "https"
if (url!.scheme == myScheme) && app.canOpenURL(url!) {
print("redirect detected..")
// intercepting redirect, do whatever you want
app.openURL(url!) // open the original url
decisionHandler(.Cancel)
return
}
decisionHandler(.Allow)
}
Potete trovare Informazioni dettagliate here
Questo non funziona su iOS 9-10 ... Quando clicco su url schema personalizzato, decidePolicyForNavigationAction non viene mai chiamato. – Borzh
In circostanze normali WKWebView non deve aprire un'app di terze parti invece di accedere al sito Web, ma sono a conoscenza di 2 eccezioni
- Se è stato esplicitamente inserito un codice in un gestore di
WKNavigationDelegate
per aprire l'applicazione 3rd party - Se iOS non funziona perfettamente ragione (riavviare il dispositivo per fissare) - sembra esserci un bug, che di tanto in tanto crea il comportamento che stai descrivendo (Osservato in iOS10.2)
Si potrebbe provare a intercettare il collegamento in "WKNavigationDelegate' e mostrare il sito Web. –
Puoi spiegare di più per favore? – gal
Sicuro. Se si implementa 'WKNavigationDelegate', il metodo' webView (_ webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler decisionHandler: (WKNavigationActionPolicy) -> Void) 'dovrebbe essere chiamato ogni volta che si fa clic su un collegamento. Controlla la proprietà 'navigationAction.request.URL' per assicurarti che non sia Etsy, per esempio; se lo è, cancella la navigazione usando decisionHandler e vai sul sito web usando 'loadRequest()'. Speriamo che questo impedisca il Deep Linking. –