Schemi di privacy e URL in iOS 9

A partire da iOS 9, le applicazioni di terze parti non sono più in grado di eseguire query su schemi URL arbitrari. Diverse applicazioni di terze parti, in particolare Twitter, hanno utilizzato in modo improprio canOpenURL (_ :) metodo del UIApplication classe per tenere traccia delle applicazioni installate su un particolare dispositivo.

Apple ha posto una serie di restrizioni per proteggere la privacy dei propri clienti. In questo suggerimento rapido, ti dico che cosa devi sapere su questi cambiamenti e ti mostro come puoi aggiornare le tue applicazioni.

1. Esecuzione di query sugli schemi URL

Presumo che tu sappia già che un'applicazione iOS può chiedere al sistema operativo di avviare un'altra applicazione utilizzando uno schema URL. Nella sua forma più semplice, funziona in questo modo.

let URLAsString = "tweetbot: // _ bartjacobs / timeline" se let URL = NSURL.init (stringa: URLAsString) UIApplication.sharedApplication (). openURL (URL)

A volte, è utile prima chiedere al sistema operativo se è possibile aprire un URL prima di aprirlo. Ciò è particolarmente utile se si desidera aggiornare l'interfaccia utente in base alle applicazioni che l'utente ha installato e alla propria applicazione in grado di interagire. Nell'esempio sopra, openURL (_ :) non riuscirà se Tweetbot non è installato sul dispositivo dell'utente. Per chiedere al sistema operativo se è possibile aprire un URL, è possibile utilizzare canOpenURL (_ :) metodo del UIApplication classe.

let URLAsString = "tweetbot: // _ bartjacobs / timeline" se let URL = NSURL.init (stringa: URLAsString) if UIApplication.sharedApplication (). canOpenURL (URL) UIApplication.sharedApplication (). openURL (URL) else  print ("Can not Open URL")

Sfortunatamente, alcune applicazioni, in particolare Twitter, hanno fatto un uso scorretto canOpenURL (_ :) per rilevare quali applicazioni sono installate sul dispositivo dell'utente. Secondo Apple, questo viola la privacy dell'utente. Di conseguenza, Apple non tollera più questo tipo di abuso in iOS 9 imponendo due restrizioni.

  • Le applicazioni create contro l'SDK di iOS 9 sono costrette a inserire in whitelist gli schemi URL di cui vorrebbero eseguire una query. In altre parole, una chiamata a canOpenURL (_ :) fallisce se l'URL non viene aggiunto a una whitelist nell'applicazione Info.plist.
  • Le applicazioni non sviluppate contro l'SDK di iOS 9 continuano a funzionare come previsto. C'è una limitazione, però. Un'applicazione può interrogare solo 50 schemi URL distinti. Rientro richieste successive falso e lanciare un errore. La documentazione sottolinea che questa limitazione viene ripristinata quando l'utente reinstalla o aggiorna l'applicazione.

2. Impostazione del progetto

Lascia che ti mostri cosa significa in pratica creando una semplice applicazione che apra Tweetbot, il mio client Twitter preferito. Crea un nuovo progetto in Xcode 7 e scegli il Applicazione vista singola modello. Assegna un nome al progetto schemi e impostare linguaggioveloce.

Prima di dare un'occhiata agli schemi URL, voglio impostare l'interfaccia utente. Aperto ViewController.swift e aggiungi un'azione, openTweetbot (_ :), al ViewController classe. Puoi lasciare la sua implementazione vuota per ora.

// MARK: - Azioni @IBAction func openTweetbot (mittente: AnyObject) 

Aperto Main.storyboard e aggiungere un pulsante al Visualizza scena controller. Impostare il titolo del pulsante su Apri Tweetbot e collegare il pulsante con il controller della vista openTweetbot (_ :) azione che abbiamo creato in precedenza.

Non renderemo nulla di troppo complicato. Quando tocco il Apri Tweetbot pulsante, il sistema operativo si apre Tweetbot, mostrandomi la mia cronologia. Puoi leggere ulteriori informazioni sugli schemi URL per Tweetbot sul sito web Tapbots.

3. Prima di iOS 9

Prima che Apple imponesse le suddette restrizioni sulla richiesta di schemi URL, potresti fare quanto segue:

@IBAction func openTweetbot (mittente: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guardia let URL = NSURL.init (stringa: URLAsString) else return guardia application.canOpenURL (URL) else return // Apri URL application.openURL (URL)

Chiediamo al sistema operativo se può aprire l'URL che passiamo canOpenURL (_ :). Se questo metodo ritorna falso su iOS 8 e versioni precedenti, sappiamo che l'applicazione a cui siamo interessati non è installata sul dispositivo dell'utente, supponendo che lo schema dell'URL si riferisca a un'altra applicazione. Questo può essere molto utile, ma Apple vuole mettere alcune restrizioni sull'API per evitare abusi.

4. iOS 9

Se si crea l'applicazione in Xcode 7 e si tocca il Apri Tweetbot pulsante, canOpenURL (_ :) ritorna falso e il sistema operativo genera un errore simile a questo:

Schemi [9227: 3539016] -canOpenURL: non riuscito per l'URL: "tweetbot: // _ bartjacobs / timeline" - errore: "Questa app non può interrogare lo schema tweetbot"

Il sistema operativo ci informa esplicitamente che l'applicazione non è consentita conoscere se può aprire l'URL che passiamo canOpenURL (_ :). Ciò non significa che l'applicazione non è autorizzata ad aprire l'URL che abbiamo passato openURL (_ :), anche se.

Se aggiorni l'implementazione di openTweetbot (_ :) come mostrato di seguito e hai installato Tweetbot, l'applicazione è in grado di aprire Tweetbot quando il pulsante viene toccato. Ciò sottolinea che Apple vuole limitare l'uso (errato) di canOpenURL (_ :), non openURL (_ :).

@IBAction func openTweetbot (mittente: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guardia let URL = NSURL.init (stringa: URLAsString) else return // Apri URL application.openURL (URL)

5. Schemi di URL di whitelisting

Fortunatamente, esiste una soluzione facile a questo problema. A partire da iOS 9, Apple chiede agli sviluppatori di inserire nella whitelist gli schemi di URL che un'applicazione vorrebbe interrogare. Questo è semplice come aggiungere una voce alle applicazioni Info.plist.

Aperto Info.plist, aggiungi una chiave chiamata LSApplicationQueriesSchemes, e impostare il tipo di valore su schieramento. Aggiungi un elemento di tipo Stringa alla matrice e impostarne il valore Tweetbot.

Se torniamo openTweetbot (_ :) alla sua implementazione originale, siamo in grado di invocare canOpenURL (_ :) senza il sistema operativo che genera errori. Puoi aggiungere tanti schemi URL alle tue applicazioni Info.plist.

@IBAction func openTweetbot (mittente: AnyObject) let application = UIApplication.sharedApplication () let URLAsString = "tweetbot: // _ bartjacobs / timeline" guardia let URL = NSURL.init (stringa: URLAsString) else return guardia application.canOpenURL (URL) else return // Apri URL application.openURL (URL)

Conclusione

La maggior parte delle applicazioni non avrà problemi con la nuova politica di Apple. È chiaro che l'obiettivo di Apple è proteggere la privacy dei propri clienti limitando le informazioni che le applicazioni possono estrarre dal sistema operativo. Le applicazioni sono sandboxed su iOS e Apple vuole controllare la quantità di informazioni che un'applicazione può estrarre dall'ambiente in cui vive la sandbox.

Gli schemi di whitelisting degli URL non sono un grosso problema per la maggior parte delle applicazioni, ma possono diventare noiosi se si intende creare un launcher di applicazioni, come Launch Center Pro. È ancora possibile creare un launcher se si autorizza la whitelist di ogni schema di URL che l'applicazione desidera interrogare. Questo può essere piuttosto noioso, però.