Confidențialitate și scheme de adrese URL în iOS 9

Începând cu versiunea iOS 9, aplicațiile terță parte nu mai pot să interogheze scheme de adrese URL arbitrare. Mai multe aplicații de la terțe părți, mai ales Twitter, au utilizat abuziv canOpenURL (_ :) metodă a UIApplication pentru a urmări ce aplicații sunt instalate pe un anumit dispozitiv.

Apple a introdus o serie de restricții pentru a proteja confidențialitatea clienților săi. În acest sfat rapid, vă spun ce trebuie să știți despre aceste modificări și vă arăt cum vă puteți actualiza aplicațiile.

1. Interogarea schemelor de adrese URL

Presupun că știi deja că o aplicație iOS poate cere sistemului de operare să lanseze o altă aplicație folosind o schemă de adrese URL. În cea mai simplă formă, funcționează așa.

permiteți URLAsString = "tweetbot: // _ bartjacobs / timeline" dacă permiteți URL = NSURL.init (șir: URLAsString) UIApplication.sharedApplication () openURL (URL)

Uneori, este util să întrebați mai întâi sistemul de operare dacă o adresă URL poate fi deschisă înainte de ao deschide. Acest lucru este util în special dacă doriți să actualizați interfața cu utilizatorul pe baza aplicațiilor pe care le-a instalat utilizatorul și a căror aplicație poate interacționa. În exemplul de mai sus, openURL (_ :) nu va reuși dacă Tweetbot nu este instalat pe dispozitivul utilizatorului. Pentru a cere sistemului de operare dacă poate fi deschisă o adresă URL, puteți utiliza funcția canOpenURL (_ :) metodă a UIApplication clasă.

(URL) NSURL.init (string: URLAsString) if UIApplication.sharedApplication () canOpenURL (URL) UIApplication.sharedApplication () openURL (URL) altceva  print ("Nu se poate deschide adresa URL")

Din păcate, unele aplicații, mai ales Twitter, au fost în mod abuziv canOpenURL (_ :) pentru a detecta aplicațiile care sunt instalate pe dispozitivul utilizatorului. Potrivit Apple, acest lucru încalcă intimitatea utilizatorului. Ca urmare, Apple nu mai tolerează acest tip de utilizare necorespunzătoare în iOS 9 prin impunerea a două restricții.

  • Aplicațiile construite împotriva SDK-ului iOS 9 sunt forțate să aloce lista de adrese URL pe care doresc să le interogheze. Cu alte cuvinte, un apel către canOpenURL (_ :) eșuează dacă adresa URL nu este adăugată la o listă albă din aplicație Info.plist.
  • Aplicațiile care nu sunt construite pe SDK-ul iOS 9 continuă să funcționeze conform așteptărilor. Există totuși o limitare. O aplicație poate interoga numai 50 de scheme URL distincte. Solicitările ulterioare se întorc fals și aruncă o eroare. Documentația subliniază faptul că această limitare este resetată atunci când utilizatorul reinstalează sau upgrades aplicația.

2. Configurarea proiectului

Permiteți-mi să vă arăt ce înseamnă acest lucru în practică, creând o aplicație simplă care deschide Tweetbot, clientul meu Twitter preferat. Creați un nou proiect în Xcode 7 și alegeți Vizualizare individuală șablon. Denumiți proiectul Scheme și stabilit Limba la Rapid.

Înainte de a arunca o privire la schemele de adrese URL, vreau să configurez interfața cu utilizatorul. Deschis ViewController.swift și adăugați o acțiune, openTweetbot (_ :), la ViewController clasă. Puteți lăsa implementarea goală pentru moment.

// MARK: - Acțiuni @IBAction func openTweetbot (expeditor: AnyObject) 

Deschis Main.storyboard și adăugați un buton la Vizualizați scena controlerului. Setați titlul butonului la Deschideți Tweetbot și conectați butonul cu controlerul de vizualizare openTweetbot (_ :) acțiune pe care am creat-o mai devreme.

Nu vom face nimic prea complicat. Când ating pe Deschideți Tweetbot buton, sistemul de operare deschide Tweetbot, arătându-mi cronologia mea. Puteți citi mai multe despre schemele de adrese URL pentru Tweetbot pe site-ul Tapbots.

3. Înainte de iOS 9

Înainte de introducerea de către Apple a restricțiilor menționate mai sus privind interogarea schemelor de adrese URL, puteți face următoarele:

@IBAction func openTweetbot (expeditor: AnyObject) lăsați aplicația = UIApplication.sharedApplication () permiteți URLAsString = "tweetbot: // _ bartjacobs / timeline" pază URL = NSURL.init (șir: URLAsString) altceva returnare application.canOpenURL (URL) altceva return // Open URL application.openURL (URL)

Cerem sistemului de operare să deschidă adresa URL la care trecem canOpenURL (_ :). Dacă se întoarce această metodă fals pe iOS 8 și mai mici, știm că aplicația de care suntem interesați nu este instalată pe dispozitivul utilizatorului, presupunând că schema de adrese URL se referă la o altă aplicație. Acest lucru poate fi foarte util, dar Apple dorește să impună anumite restricții asupra API pentru a evita abuzurile.

4. iOS 9

Dacă construiți aplicația în Xcode 7 și apăsați pe Deschideți Tweetbot buton, canOpenURL (_ :) se intoarce fals iar sistemul de operare aruncă o eroare care arată cam așa:

Scheme [9227: 3539016] -canOpenURL: nu a reușit pentru URL: "tweetbot: // _ bartjacobs / timeline" - eroare: "Această aplicație nu are voie să interogheze pentru tweetbot de sistem"

Sistemul de operare ne informează în mod explicit că nu este permisă utilizarea aplicației ști dacă poate deschide adresa URL la care trecem canOpenURL (_ :). Nu înseamnă că aplicația nu are permisiunea de a deschide adresa URL la care am trecut openURL (_ :), deşi.

Dacă actualizați implementarea openTweetbot (_ :) după cum se arată mai jos și ați instalat Tweetbot, aplicația poate să deschidă Tweetbot când este apăsat butonul. Acest lucru subliniază faptul că Apple dorește să limiteze utilizarea (mis) a canOpenURL (_ :), nu openURL (_ :).

@IBAction func openTweetbot (expeditor: AnyObject) permite aplicatiei = UIApplication.sharedApplication () lăsați URLAsString = "tweetbot: // _ bartjacobs / timeline" pază URL = NSURL.init (string: URLAsString) application.openURL (URL)

5. Scheme de adrese URL cu albume

Din fericire, există o soluție ușoară la această problemă. Începând cu versiunea iOS 9, Apple solicită dezvoltatorilor să indice schemele URL pe care o aplicație ar dori să le interogheze. Acest lucru este la fel de simplu ca adăugarea unei intrări în aplicație Info.plist.

Deschis Info.plist, adăugați o cheie numită LSApplicationQueriesSchemes, și setați tipul valorii la mulțime. Adăugați un element de tip Şir la matrice și să-i setați valoarea Tweetbot.

Dacă ne întoarcem openTweetbot (_ :) la implementarea inițială, putem invoca canOpenURL (_ :) fără ca sistemul de operare să ne arunce erori. Puteți adăuga cât mai multe scheme de adrese URL la aplicația dvs. Info.plist.

@IBAction func openTweetbot (expeditor: AnyObject) lăsați aplicația = UIApplication.sharedApplication () permiteți URLAsString = "tweetbot: // _ bartjacobs / timeline" pază URL = NSURL.init (șir: URLAsString) altceva returnare application.canOpenURL (URL) altceva return // Open URL application.openURL (URL)

Concluzie

Cele mai multe aplicații nu vor avea o problemă cu noua politică a Apple. Este clar că Apple dorește să protejeze confidențialitatea clienților săi prin limitarea aplicațiilor de informații care pot fi extrase din sistemul de operare. Aplicațiile sunt cutie de tip sandbox pe iOS, iar Apple dorește să controleze câtă informație poate extrage o aplicație din mediul în care trăiește sandbox-ul.

Schemele de adrese URL pentru albire nu reprezintă o mare durere pentru majoritatea aplicațiilor, dar poate deveni plictisitoare dacă intenționați să creați un lansator de aplicații, cum ar fi Launch Center Pro. Este încă posibil să creați un lansator, atâta timp cât introduceți în listă toate schemele de adrese URL pe care aplicația ar dori să le interogheze. Acest lucru poate fi destul de obositor, totuși.

Cod