Från iOS 9 kan tredjepartsprogram inte längre söka efter godtyckliga webbadresser. Flera tredje parts applikationer, i synnerhet Twitter, missbrukade canOpenURL (_ :)
metod för UIApplication
klass för att spåra vilka program som är installerade på en viss enhet.
Apple har infört ett antal begränsningar för att skydda kundernas integritet. I det här snabba tipset berättar jag vad du behöver veta om dessa ändringar och jag visar dig hur du kan uppdatera dina applikationer.
Jag antar att du redan vet att en iOS-applikation kan ställa operativsystemet att starta en annan applikation med ett webbadressschema. I sin enklaste form fungerar det något som detta.
låt URLAsString = "tweetbot: // _ bartjacobs / timeline" om släpp URL = NSURL.init (sträng: URLAsString) UIApplication.sharedApplication (). openURL (URL)
Ibland är det användbart att först fråga operativsystemet om en webbadress kan öppnas innan den öppnas. Detta är särskilt användbart om du vill uppdatera användargränssnittet baserat på vilka applikationer användaren har installerat och din applikation kan interagera med. I ovanstående exempel, openURL (_ :)
kommer inte att lyckas om Tweetbot inte är installerat på användarens enhet. För att fråga operativsystemet om en webbadress kan öppnas kan du använda den canOpenURL (_ :)
metod för UIApplication
klass.
låt URLAsString = "tweetbot: // _ bartjacobs / timeline" om släpp URL = NSURL.init (sträng: URLAsString) om UIApplication.sharedApplication () .canOpenURL (URL) UIApplication.sharedApplication () .openURL (URL) else skriv ut ("Kan inte öppna URL")
Tyvärr har vissa applikationer, i synnerhet Twitter, missbrukats canOpenURL (_ :)
för att upptäcka vilka applikationer som är installerade på användarens enhet. Enligt Apple bryter detta användarens integritet. Som ett resultat tolererar Apple inte längre denna typ av missbruk i IOS 9 genom att införa två begränsningar.
canOpenURL (_ :)
misslyckas om webbadressen inte läggs till i en vitlista i programmets Info.plist.falsk
och kasta ett fel. Dokumentationen betonar att denna begränsning återställs när användaren återinstallerar eller uppgraderar programmet.Låt mig visa dig vad det betyder i praktiken genom att skapa en enkel applikation som öppnar Tweetbot, min favorit Twitter-klient. Skapa ett nytt projekt i Xcode 7 och välj Enkel visningsprogram mall. Namn på projektet scheman och ställa in Språk till Snabb.
Innan vi tittar på URL-scheman vill jag konfigurera användargränssnittet. Öppna ViewController.swift och lägg till en åtgärd, openTweetbot (_ :)
, till ViewController
klass. Du kan lämna sin implementering tom för nu.
// MARK: - Åtgärder @IBAction func openTweetbot (avsändare: AnyObject)
Öppna Main.storyboard och lägg till en knapp till Visa kontrollerplats. Ställ in titeln på knappen till Öppna Tweetbot och anslut knappen med bildkontrollen openTweetbot (_ :)
Åtgärd som vi skapade tidigare.
Vi kommer inte göra någonting för komplicerat. När jag pekar på Öppna Tweetbot knappen, operativsystemet öppnar Tweetbot, visar mig min tidslinje. Du kan läsa mer om URL-scheman för Tweetbot på Tapbots webbplats.
Innan Apple införde de ovan nämnda begränsningarna när du frågade URL-system kan du göra följande:
@IBAction func openTweetbot (avsändare: AnyObject) let application = UIApplication.sharedApplication () låter URLAsString = "tweetbot: // _ bartjacobs / timeline" guard låt URL = NSURL.init (sträng: URLAsString) annars return guard application.canOpenURL (URL) annars return // Öppna URL application.openURL (URL)
Vi frågar operativsystemet om det kan öppna webbadressen vi skickar till canOpenURL (_ :)
. Om denna metod returnerar falsk
på iOS 8 och lägre, vet vi att programmet vi är intresserade av inte är installerat på användarens enhet, förutsatt att webbadressschemat avser en annan applikation. Detta kan vara mycket användbart, men Apple vill lägga vissa begränsningar på API för att undvika missbruk.
Om du bygger programmet i Xcode 7 och knackar på Öppna Tweetbot knapp, canOpenURL (_ :)
avkastning falsk
och operativsystemet kastar ett fel som ser något ut så här:
Scheman [9227: 3539016] -canOpenURL: misslyckades för URL: "tweetbot: // _ bartjacobs / timeline" - error: "Den här appen får inte fråga för system tweetbot"
Operativsystemet informerar oss uttryckligen om att ansökan inte tillåts känna till om det kan öppna webbadressen vi skickar till canOpenURL (_ :)
. Det betyder inte att programmet inte får öppna webbadressen vi skickade till openURL (_ :)
, fastän.
Om du uppdaterar genomförandet av openTweetbot (_ :)
som visas nedan och du har installerat Tweetbot, kan programmet öppna Tweetbot när knappen trycks in. Detta betonar att Apple vill begränsa (missbruk) användningen av canOpenURL (_ :)
, inte openURL (_ :)
.
@IBAction func openTweetbot (avsändare: AnyObject) let application = UIApplication.sharedApplication () släpp URLAsString = "tweetbot: // _ bartjacobs / timeline" guard låt URL = NSURL.init (sträng: URLAsString) annars return // Open URL application.openURL (URL)
Lyckligtvis finns det en lätt lösning på detta problem. När det gäller iOS 9 frågar Apple att utvecklarna vill lista de webbadresser som en applikation vill fråga. Det här är lika enkelt som att lägga till en post till programmets Info.plist.
Öppna Info.plist, lägg till en nyckel som heter LSApplicationQueriesSchemes, och ange typen av värdet till Array. Lägg till ett objekt av typen Sträng till matrisen och ange dess värde till Tweetbot.
Om vi återvänder openTweetbot (_ :)
till dess ursprungliga implementering, kan vi åberopa canOpenURL (_ :)
utan att operativsystemet kastar fel på oss. Du kan lägga till så många URL-scheman till din ansökans Info.plist.
@IBAction func openTweetbot (avsändare: AnyObject) let application = UIApplication.sharedApplication () låter URLAsString = "tweetbot: // _ bartjacobs / timeline" guard låt URL = NSURL.init (sträng: URLAsString) annars return guard application.canOpenURL (URL) annars return // Öppna URL application.openURL (URL)
De flesta applikationer har inga problem med Apples nya policy. Det är uppenbart att Apple har som målsättning att skydda privatlivet hos sina kunder genom att begränsa de informationsapplikationer som kan extraheras från operativsystemet. Applikationer är sandboxed på iOS och Apple vill kontrollera hur mycket information en applikation kan extrahera från miljön sandkassen bor i.
Whitelisting URL-system är inte en stor smärta för de flesta applikationer, men det kan bli tråkigt om du planerar att skapa en applikationsstartare, till exempel Launch Center Pro. Det är fortfarande möjligt att skapa en launcher så länge du vitlista varje webbadressschema som programmet skulle vilja fråga. Detta kan dock vara ganska tråkigt.