Vanaf iOS 9 kunnen applicaties van derde partijen niet langer willekeurige arbitrage-URL-schema's opvragen. Verschillende applicaties van derde partijen, met name Twitter, misbruikten het canOpenURL (_ :)
methode van de UiApplication
klasse om bij te houden welke applicaties op een bepaald apparaat zijn geïnstalleerd.
Apple heeft een aantal beperkingen ingevoerd om de privacy van zijn klanten te beschermen. In deze snelle tip vertel ik u wat u moet weten over deze wijzigingen en laat ik u zien hoe u uw toepassingen kunt bijwerken.
Ik neem aan dat u al weet dat een iOS-toepassing het besturingssysteem kan vragen om een andere toepassing te starten met behulp van een URL-schema. In de eenvoudigste vorm werkt het zoiets als dit.
laat URLAsString = "tweetbot: // _ bartjacobs / timeline" indien laten URL = NSURL.init (string: URLAsString) UIApplication.sharedApplication (). openURL (URL)
Soms is het handig om eerst aan het besturingssysteem te vragen of een URL kan worden geopend voordat deze wordt geopend. Dit is vooral handig als u de gebruikersinterface wilt bijwerken op basis van de toepassingen die de gebruiker heeft geïnstalleerd en waarmee uw toepassing kan communiceren. In het bovenstaande voorbeeld, Open url(_:)
zal niet lukken als Tweetbot niet op het apparaat van de gebruiker is geïnstalleerd. Om het besturingssysteem te vragen of een URL kan worden geopend, kunt u gebruikmaken van de canOpenURL (_ :)
methode van de UiApplication
klasse.
laat URLAsString = "tweetbot: // _ bartjacobs / timeline" indien laten URL = NSURL.init (string: URLAsString) if UIApplication.sharedApplication (). canOpenURL (URL) UIApplication.sharedApplication (). openURL (URL) else print ("Kan URL niet openen")
Helaas hebben sommige applicaties, met name Twitter, misbruikt canOpenURL (_ :)
om te detecteren welke applicaties op het apparaat van de gebruiker zijn geïnstalleerd. Volgens Apple is dit in strijd met de privacy van de gebruiker. Als gevolg hiervan tolereert Apple dit type misbruik in iOS 9 niet langer door twee beperkingen op te leggen.
canOpenURL (_ :)
mislukt als de URL niet is toegevoegd aan een witte lijst in de toepassingen Info.plist.vals
en gooi een fout. De documentatie benadrukt dat deze beperking wordt gereset wanneer de gebruiker de toepassing opnieuw installeert of upgradet.Ik zal u laten zien wat dit in de praktijk betekent door een eenvoudige applicatie te maken waarmee Tweetbot, mijn favoriete Twitter-client, wordt geopend. Maak een nieuw project in Xcode 7 en kies het Toepassing enkele weergave sjabloon. Geef het project een naam regelingen En instellen Taal naar Snel.
Voordat we URL-schema's bekijken, wil ik de gebruikersinterface instellen. Open ViewController.swift en voeg een actie toe, openTweetbot (_ :)
, naar de ViewController
klasse. U kunt de implementatie voorlopig leeg laten.
// MARK: - Acties @IBAction func openTweetbot (afzender: AnyObject)
Open Main.storyboard en voeg een knop toe aan de Bekijk Controller Scene. Stel de titel van de knop in Open Tweetbot en verbind de knop met de view controller's openTweetbot (_ :)
actie die we eerder hebben gemaakt.
We gaan niets ingewikkelds maken. Wanneer ik tik op Open Tweetbot knop, opent het besturingssysteem Tweetbot en toont ik mijn tijdlijn. U kunt meer lezen over de URL-schema's voor Tweetbot op de Tapbots-website.
Voordat Apple de bovengenoemde beperkingen oplegde aan het opvragen van URL-schema's, kon je het volgende doen:
@IBAction func openTweetbot (afzender: AnyObject) let application = UIApplication.sharedApplication () laat URLAsString = "tweetbot: // _ bartjacobs / timeline" bewaker laat URL = NSURL.init (string: URLAsString) else retour bewakingstoepassing.canOpenURL (URL) else return // Open URL application.openURL (URL)
We vragen het besturingssysteem of het de URL kan openen waarnaar we gaan canOpenURL (_ :)
. Als deze methode terugkeert vals
op iOS 8 en lager weten we dat de applicatie waarin we zijn geïnteresseerd niet op het apparaat van de gebruiker is geïnstalleerd, ervan uitgaande dat het URL-schema betrekking heeft op een andere applicatie. Dit kan erg handig zijn, maar Apple wil een aantal beperkingen opleggen aan de API om misbruik te voorkomen.
Als u de applicatie in Xcode 7 hebt gebouwd en op de Open Tweetbot knop, canOpenURL (_ :)
komt terug vals
en het besturingssysteem gooit een fout die er ongeveer zo uitziet:
Schema's [9227: 3539016] -canOpenURL: mislukt voor URL: "tweetbot: // _ bartjacobs / timeline" - fout: "Deze app is niet toegestaan om naar schema-tweetbot te zoeken"
Het besturingssysteem meldt ons expliciet dat de toepassing niet is toegestaan weten of het de URL kan openen waarnaar we gaan canOpenURL (_ :)
. Dit betekent niet dat de toepassing de URL waarnaar we zijn gepast niet mag openen Open url(_:)
, hoewel.
Als u de implementatie van openTweetbot (_ :)
zoals hieronder getoond en je hebt Tweetbot geïnstalleerd, de applicatie kan Tweetbot openen wanneer op de knop wordt getikt. Dit benadrukt dat Apple het (mis) gebruik van wil beperken canOpenURL (_ :)
, niet Open url(_:)
.
@IBAction func openTweetbot (afzender: AnyObject) let application = UIApplication.sharedApplication () laat URLAsString = "tweetbot: // _ bartjacobs / timeline" bewaker laat URL = NSURL.init (string: URLAsString) else retour // URL openen application.openURL (URL)
Gelukkig is er een eenvoudige oplossing voor dit probleem. Vanaf iOS 9 vraagt Apple ontwikkelaars om de URL-schema's die een applicatie zou willen bevragen, op de witte lijst te plaatsen. Dit is net zo eenvoudig als het toevoegen van een vermelding aan de applicaties Info.plist.
Open Info.plist, voeg een sleutel met de naam toe LSApplicationQueriesSchemes, en stel het type van de waarde in reeks. Voeg een item van het type toe Draad naar de array en stel de waarde in op Tweetbot.
Als we teruggaan openTweetbot (_ :)
bij de oorspronkelijke implementatie kunnen we een beroep doen op canOpenURL (_ :)
zonder dat het besturingssysteem fouten naar ons gooit. U kunt zoveel URL-schema's toevoegen aan uw programma's Info.plist.
@IBAction func openTweetbot (afzender: AnyObject) let application = UIApplication.sharedApplication () laat URLAsString = "tweetbot: // _ bartjacobs / timeline" bewaker laat URL = NSURL.init (string: URLAsString) else retour bewakingstoepassing.canOpenURL (URL) else return // Open URL application.openURL (URL)
De meeste applicaties hebben geen probleem met het nieuwe beleid van Apple. Het is duidelijk dat Apple de privacy van zijn klanten wil beschermen door de informatietoepassingen te beperken die uit het besturingssysteem kunnen worden gehaald. Toepassingen worden in iOS op sandbox gezet en Apple wil bepalen hoeveel informatie een applicatie kan extraheren uit de omgeving waarin de sandbox leeft.
Witte lijst URL-schema's is niet erg lastig voor de meeste toepassingen, maar het kan vervelend worden als u van plan bent om een toepassingsstartprogramma te maken, zoals Launch Center Pro. Het is nog steeds mogelijk om een opstartprogramma te maken zolang u elk URL-schema opslaat dat de toepassing zou willen opvragen. Dit kan echter behoorlijk vervelend zijn.