Aplicațiile mobile și vizualizarea conținutului pe web sunt ubicuoase acum. De ani de zile, dezvoltatorii iOS au fost însărcinați fie să își creeze propria experiență de vizionare pe web în cadrul aplicației, fie să dea adresa URL la Safari. Ambele abordări duc la dezavantaje inerente care au fost anterior inevitabile.
Asta e tot ce sa schimbat cu iOS 9 și introducerea lui SFSafariViewController
clasă. Cu aceasta, acum puteți oferi o experiență de vizionare completă în interiorul aplicației dvs., fără a trebui să petreceți un timp de dezvoltare important prin furnizarea acesteia.
Înainte de a începe, voi stabili abordarea pe care am luat-o cu aplicația demo care merge împreună cu acest tutorial. După cum veți vedea mai târziu, într-adevăr nu există prea multe coduri implicate în utilizarea controlerului de vizualizare a safari. Valoarea reală a controlorului de vizualizare a safari provine din înțelegere cand să o folosim și, mai important, De ce.
Începând cu iOS 9, dezvoltatorii au trei opțiuni de afișare a conținutului web pentru un utilizator:
openURL (_ :)
pentru a afișa pagina în interiorul safari, forțând utilizatorul să-și părăsească aplicația.WKWebView
sau UIWebView
pentru a crea o experiență de navigare de la zero.SFSafariViewController
: Cu SFSafariViewController
, puteți utiliza aproape toate avantajele de vizualizare a conținutului web din Safari fără a forța utilizatorii să-și părăsească aplicația.Înainte de iOS 9, primele două opțiuni erau singurele opțiuni pentru dezvoltatori. Știind când a trebuit să folosiți unul sau altul depindea de contextul conținutului prezentat. În timp ce lucrăm la aplicația demo, vom folosi toate cele trei opțiuni.
Acum, când știm cum poate fi afișat conținutul, să acoperim motivul pentru care ar putea fi afișat într-o aplicație. Pe iOS, există două cazuri importante de utilizare pentru vizualizarea conținutului web.
De asemenea, rețineți că există un al treilea caz de utilizare, autentificarea pe web. Pentru acest tutorial, nu ne vom concentra pe acest scenariu.
Dacă măsura în care experiența web a utilizatorului dvs. din cadrul aplicației dvs. se încadrează în primul caz de utilizare, controlerul de vizualizare a safari nu este probabil ceea ce aveți nevoie. În aceste cazuri, afișați conținut pe care îl dețineți și îl controlați și poate fi necesar să vă personalizați extensiv.
Dacă găsiți că aplicația dvs. se potrivește cu acest scenariu, utilizați-o WKWebView
. Este succesorul lui UIWebView
și include mai multe îmbunătățiri, cum ar fi utilizarea motorului JavaScript Nitro. Această abordare vă permite să construiți întreaga interfață de utilizator de la zero. Aveți și alte resurse, cum ar fi încărcarea fișierelor în siguranță și utilizarea WKWebsiteDataStore
pentru interogarea cookie-urilor.
Majoritatea aplicațiilor, totuși, trebuie doar să furnizeze o experiență generalizată de vizionare pe web. Acesta este scenariul perfect pentru controlerul de vedere al safari. Înainte de iOS 9, dezvoltatorii au petrecut timp creând o interfață de utilizator proprie pentru navigarea pe Internet, ceea ce ar putea duce la probleme pentru utilizatori.
Experiența de navigare este inconsecventă între diferite aplicații, ceea ce poate confunda utilizatorul. Unele interfețe pot lipsi, de asemenea, de lucrurile pe care le așteaptă utilizatorii, cum ar fi o bară de progres care indică cât de mult este încărcată pagina.
Mai mult, nu aveți acces la toate caracteristicile lui Safari. Acestea includ vizualizarea cititorului, brelocul cheie al cartelei iCloud pentru capacitățile de completare automată și multe altele. Dacă doriți să aveți aceste caracteristici înainte de iOS 9, ați fost forțat să-l lăsați pe utilizator să-și lase aplicația în întregime deschizând conținutul din Safari. SFSafariViewController
clasa rezolvă fiecare dintre aceste probleme.
Pentru a începe, construiți și executați aplicația demo. Veți primi o interfață de utilizator foarte mică, care are trei opțiuni. Fiecare opțiune corespunde uneia dintre metodele menționate anterior pentru prezentarea conținutului web.
Prima opțiune pe care o vom demonstra este ruta mai tradițională, care transmite adresa URL către Safari. Deschis ViewController.swift și observați urlString
proprietate în partea de sus a dosarului. Acest lucru va defini ceea ce este prezentat în exemplele de mai jos, deci nu ezitați să-l setați la ceea ce doriți.
privat var urlString: String = "https://google.com"
Un lucru important este faptul că în iOS 9, TLS 1.2 este executat implicit. Dacă serverul pe care încercați să îl atingeți nu suportă acest lucru, este posibil să vedeți următoarea eroare în consola:
Există modalități în acest sens, cum ar fi adăugarea unei chei la aplicațiile dvs. Info.plist fişier. Aceasta a fost o schimbare făcută de Apple pentru a spori securitatea în jurul experienței de navigare pe web. Deplasând, adăugați următorul cod la openInSafari (_ :)
acțiune:
@IBAction func openInSafari (expeditor: AnyObject) lăsați url = NSURL (șir: self.urlString)! UIApplication.sharedApplication () openURL (url)
Construiți și rulați aplicația. Când atingeți butonul de sus, "Deschideți în safari", sistemul de operare va părăsi aplicația și va deschide adresa URL în Safari.
Deși această opțiune este cu siguranță viabilă, am obligat utilizatorul să părăsească aplicația. În calitate de dezvoltatori, în mod ideal, dorim ca experiența să rămână conținută în aplicația noastră. O îmbunătățire pe care iOS 9 a făcut-o cu această abordare este totuși butonul mic din partea stângă sus:
Dacă atingeți acest buton, utilizatorul va reveni la aplicația care a trimis adresa URL către Safari. Pentru a rezolva problema dacă utilizatorul este forțat să părăsească aplicația noastră, să trecem la următoarea abordare.
Acum vom deschide aceeași adresă URL în aplicația noastră. Pentru a face acest lucru, vom folosi un embedded UIWebView
. Logica acestui browser simplu se găsește în CustomWebViewController
clasă.
Deoarece nu avem nevoie de niciunul dintre funcțiile avansate ale WebKit, vom deschide pagina într-o vizualizare web. În clasa ViewController, înlocuiți codul în prepareForSegue (_: expeditor :)
după cum urmează:
override func prepareForSegue (segue: UIStoryboardSegue, expeditor: AnyObject?) dacă let navVC = segue.destinationViewController as? UINavigationController lăsați cwvc = navVC.topViewController ca! CustomWebViewController cwvc.urlString = auto.urlString
Continuați și rulați aplicația. Atingeți butonul din mijloc, "Deschideți cu vizualizare web", iar pagina ar trebui încărcată în interiorul aplicației.
Chiar dacă utilizatorul rămâne în aplicație, dezavantajele acestei abordări sunt evidente. Fără să mai lucrăm la dezvoltarea noastră, nu există nici o indicație de încărcare, o bară de adrese URL și alte lucruri pe care le așteaptă utilizatorii atunci când navighează pe web. Să folosim acum SFSafariViewController
pentru a rezolva aceste probleme.
Înainte de a putea folosi SFSafariViewController
clasa, trebuie să importăm Servicii Safari. În partea superioară a ViewController.swift, adăugați următoarea declarație de import sub declarația de import pentru UIKit:
import SafariServicii
Apoi, actualizați punerea în aplicare a openWithSafariVC (_ :)
așa cum se arată mai jos:
@IBAction func openWithSafariVC (expeditor: AnyObject) permite svc = SFSafariViewController (URL: NSURL (string: self.urlString)!) Auto.presentViewController (svc, animat: true, completare: nil)
Rulați aplicația și atingeți butonul din partea de jos, "Deschideți cu controlerul de vizualizare a safari", pentru a vedea conținutul care se afișează acum în a SFSafariViewController
instanță.
Acum lăsăm utilizatorul să rămână în interiorul aplicației noastre și ei au toate avantajele Safari. Foile de distribuire sunt disponibile din bara de file, împreună cu opțiunea de a adăuga pagina ca preferată sau de a deschide conținutul în Safari.
Există o serie de configurații interesante pentru a profita de. De exemplu, am putea permite utilizatorului să lanseze cu ușurință browserul în modul cititor prin trecere Adevărat
la entersReaderIfAvailable
.
@IBAction func openWithSafariVC (expeditor: AnyObject) permite svc = SFSafariViewController (URL: NSURL (sir: self.urlString) !, intrăriReaderIfAvailable: true) self.presentViewController (svc, animat: true;
În plus, controlerul de vizualizare Safari respectă culoarea nuanței. Acest lucru facilitează păstrarea prezenței mărcii aplicației dvs., păstrând intacte interfața de utilizare familiară a Safari.
Cu toate acestea, o problemă pe care trebuie să o rezolvăm este că utilizatorul nu poate respinge controlerul de vizualizare. Să rezolvăm asta acum.
SFSafariViewControllerDelegate
ProtocolPentru a elimina controlerul de vizualizare, trebuie să ne conformăm SFSafariViewControllerDelegate
protocol. Deschis ViewController.swift și a face ViewController
clasa este conformă cu SFSafariViewControllerDelegate
protocol.
clasa ViewController: UIViewController, SFSafariViewControllerDelegate ...
Apoi, adăugați următoarea metodă delegat la ViewController
clasă:
func safariViewControllerDidFinish (controler: SFSafariViewController) controller.dismissViewControllerAnimated (true, completare: nil)
Această metodă de delegație este apelată atunci când utilizatorul pune în funcțiune Terminat în controlerul de vizualizare Safari. Ar trebui să fie utilizat pentru a elimina controlerul de vizualizare și pentru a reveni la aplicația dvs..
Singurul lucru pe care trebuie să-l facem este să-i atribuiți controlorului vizual ca delegat al controlorului de vizualizare Safari. Actualizați punerea în aplicare a openWithSafariVC (_ :)
după cum se arată mai jos:
@IBAction func openWithSafariVC (expeditor: AnyObject) permite svc = SFSafariViewController (URL: NSURL (sir: self.urlString)!) Svc.delegate = auto-auto.presentViewController (svc, animat: true;
Dacă rulați aplicația și deschideți controlerul de vizualizare Safari, veți vedea că acum puteți să renunțați la controlerul de vizualizare Safari prin atingerea Terminat butonul din dreapta sus.
Controlerul de vizualizare Safari este incredibil de ușor de utilizat. De fapt, este unul dintre cele mai mici API-uri pe care le-am văzut doar cu două inițializatoare și două metode delegate. Chiar și așa, acesta aduce toate caracteristicile pe care le așteaptă utilizatorii de la Safari pentru aplicația dvs..
Ce este, probabil, la fel de interesant este faptul că dezvoltatorii nu vor mai trebui să-și petreacă timpul creând browsere web personalizate. Aducerea unei aplicații de navigare pe Internet de primă clasă în aplicația dvs. are câteva linii de cod cu SFSafariViewController
clasă.