Skicka in en uppdatering till App Store är oundviklig om du vill lägga till större förbättringar i en applikation. Det är emellertid besvärligt och tidskrävande att gå igenom App Store granskningsprocessen för enkla ändringar. I den här artikeln kommer jag att visa dig hur du uppdaterar en applikation på distans med hjälp av GroundControl-projektet.
Tanken bakom GroundControl är enkel, applikationen hämtar en lista över fjärranläggningar och uppdaterar dess NSUserDefaults
med innehållet i fastighetslistan. Även om många applikationer hämtar data från en dedikerad backend för att dynamiskt uppdatera innehållet, är den strategi som jag kommer att lägga ut i den här artikeln perfekt om en dedikerad backend inte är ett alternativ eller överstiger programmets krav.
Den inställning som diskuteras i denna handledning är lätt och billig. Det är inte bara billigt, det är också lätt att underhålla, vilket är en faktor som ofta förbises av både kunder och utvecklare.
Det är viktigt att betona att fastighetslistorna är ideala för små bitar av data och bör inte användas som ersättning för en dedikerad backend. Om en applikation behöver uppdateras dagligen med nytt innehåll kommer den strategi som anges i denna handledning inte att skära den.
För att illustrera hur alla olika bitar passar ihop, kommer vi att bygga en iOS-applikation med namnet Fjärrkontroll. Även om applikationen själv inte kommer att göra mycket, genom att integrera GroundControl för att uppdatera programmets NSUserDefaults
Det blir tydligt hur lätt det är att fjärransluta en applikation med mycket låga kostnader. Låt oss börja.
Skapa ett nytt projekt i Xcode genom att välja Enkel visningsprogram mall från listan med mallar (figur 1). Namn på din ansökan Fjärrkontroll, Ange en företagsidentifierare, inställd iPhone för enhetsfamiljen och kontrollera Använd automatisk referensräkning. Se till att avmarkera de övriga kryssrutorna för det här projektet. Berätta Xcode där du vill spara ditt projekt och klicka på Skapa knapp (figur 2).
Namnet Mattt Thompson kanske låter bekanta för dig. Han är en av skaparna och drivkraften bakom AFNetworking, det mest populära nätverksbiblioteket för iOS och OS X. GroundControl bygger på AFNetworking och ger en enkel lösning för att fjärrkonfigurera en applikation genom att uppdatera programmets NSUserDefaults
. Det gör det genom en kategori på NSUserDefaults
, vilket tillåter NSUserDefaults
att uppdatera sig asynkront med en fjärransluten fastighetslista.
Det spelar ingen roll om fastighetslistan finns så länge den kan nås via HTTP (S) -protokollet och svarets innehållstyp är inställt på application / x-plist
.
På GitHub-sidan av GroundControl tillhandahåller Mattt två exempel på hur man implementerar seriens sida av berättelsen, en Ruby-implementering och en Python-implementering. Men jag lovade dig att installationen skulle vara lätt och billig. I stället för att använda en server som du behöver behålla, kommer vi att använda Amazons enkla lagringsservice eller S3. Som jag förklarade tidigare är kraven enkla, det vill säga (1) filen måste vara en fastighetslista och (2) svarets innehållstyp måste vara application / x-plist. Amazons S3 passar perfekt.
Inte bara är AWS S3 perfekt för att servera statiska filer, det har tjänat sina ränder genom åren. Även om din ansökan når topp 10 i App Store, fortsätter S3 att servera upp fastighetslistan här utan problem. Innan du går över till AWS-konsolen (Amazon Web Services), behöver du först integrera GroundControl i ditt projekt.
GroundControl bygger på AFNetworking, vilket innebär att du måste lägga till AFNetworking i ditt Xcode-projekt. Även om vi kunde lägga till AFNetworking och GroundControl med CocoaPods, lägger vi till båda biblioteken manuellt eftersom vissa av er kanske inte känner till CocoaPods. Ladda ner den senaste versionen av AFNetworking och GroundControl och dra varje bibliotek till ditt Xcode-projekt. Var noga med att kopiera innehållet i mappen till ditt projekt genom att markera kryssrutan Kopiera objekt till destinationsgruppens mapp (om det behövs) och glöm inte att lägga till båda biblioteken till fjärrkontrollmålet (figurerna 3 och 4).
AFNetworking är beroende av Systemkonfiguration och Mobile Core Services ramar för några av dess funktionalitet. Det är därför nödvändigt att länka ditt projekt mot dessa ramar. Välj ditt projekt i Project Navigator och välj Fjärrkontroll målet från listan över mål. Välja Bygga faser högst upp, öppna Länk binär med bibliotek lådan och lägg till båda ramarna för ditt projekt (figur 5).
Innan vi kan börja arbeta med AFNetworking och GroundControl behöver vi uppdatera projektets Prefix.pch fil genom att lägga till en importdeklaration för de ramar som vi just lagt till projektet. Ta en titt på biten nedan för att förtydliga.
// // Prefixrubrik för alla källfiler i "Remote Control" -målet i fjärrkontrollprojektet // #import#ifndef __IPHONE_4_0 #warning "Det här projektet använder funktioner som endast är tillgängliga i iOS SDK 4.0 och senare." #endif #ifdef __OBJC__ #import #importera #importera #importera #endif
Vi börjar med att lägga till två importdeklarationer till ansökandepartementets implementeringsfil, en för AFNetworking och en annan för GroundControl. Om du slutar använda AFNetworking på olika ställen i ditt projekt är det kanske en bra idé att lägga till importdeklarationen för AFNetworking till ditt projekt Prefix.pch fil.
#import "AFNetworking.h" #import "NSUserDefaults + GroundControl.h"
Integrering av GroundControl är den enkla delen eftersom det bara kräver två rader kod. I ansökningsdelegatets applicationDidBecomeActive:
metod, vi kallar en hjälparmetod för att initiera GroundControl.
- (void) applicationDidBecomeActive: (UIApplication *) applikation // Initialize GroundControl [self initializeGroundControl];
Hjälpermetoden kunde inte bli enklare tack vare kategorin på NSUserDefaults
tillhandahållen av GroundControl. Vi skapar webbadressen för egenskapslistan och skickar den som ett argument i registerDefaultsWithURL:
. Detta kommer att se till att egenskapslistan laddas ner asynkront. En gång nedladdad, NSUserDefaults
uppdateras automatiskt med innehållet i fastighetslistan.
- (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://www.example.com/RemoteControl.plist"); [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url];
Ett annat alternativ är att ringa registerDefaultsWithURL: framgång: misslyckande:
istället om du föredrar att arbeta med framgång och misslyckande återkopplingar. För ännu mer kontroll ger GroundControl en tredje metod, registerDefaultsWithURLRequest: framgång: misslyckande:
. Denna metod accepterar en instans av NSURLRequest
samt ett framgångs- och misslyckningsblock.
Det kan överraska dig, men integrering av GroundControl var den svåra delen. De sista två stegen är (1) att skapa egenskapslistan och (2) ladda upp den till Amazons S3.
Skapa en ny fil i Xcode genom att välja Resurs fliken till vänster och välja Fastighetslista till höger (figur 6). Namnge filen Fjärrkontroll och spara den på datorns skrivbord. Det är inte nödvändigt att lägga till det i ditt Xcode-projekt. Det enklaste sättet att redigera egenskapslistan finns i Xcode. Ta en titt på skärmbilden nedan för att se hur egenskapslistan ser ut och kan redigeras i Xcode (figur 7). Tänk på att en fastighetslista endast kan innehålla boolesker, datum, nummer, binära data, strängar, arrayer och ordböcker. Det är bra att namnpace nycklarna (till exempel med projektets klassprefix) för att se till att de inte stämmer överens med andra poster lagrade i NSUserDefaults
.
För att använda Amazons webbtjänster behöver du ett Amazon-konto. Kostnaderna för Amazons S3 är extremt låga och chansen är att du inte ens kommer att debiteras för en tid sedan fastighetslistan är bara några kilobytes i storlek.
Du kan ladda upp egenskapslistan till Amazon S3 med hjälp av Amazons AWS-konsol eller genom att använda en applikation som stöder Amazons S3, som Panics fantastiska Transmit.
Efter att ha laddat upp fastighetslistan finns det tre saker kvar att göra, (1) kopiera webbadressen till egenskapslistan, (2) bevilja allmänhetens tillgång till fastighetslistan och (3) ställa in rätt innehållstyp.
I AWS-konsolen väljer du egenskapslistan och klickar på Egenskaper knappen längst upp till höger. Välj fliken som heter detaljer i egenskapspanelen (figur 8). Kopiera länken i egenskapslistan och uppdatera initializeGroundControl
metoden i programdelegationen med rätt webbadress.
Välj fliken som heter Behörigheter i egenskapspanelen och lägg till en ny uppsättning behörigheter i egenskapslistan genom att klicka på Lägg till fler behörigheter knapp. Ställ bidragsmottagaren till Alla och begränsa behörigheterna till Öppna / Ladda ner. Detta kommer att se till att din ansökan kan hämta fastighetslistan. Glöm inte att klicka på Spara-knappen för att sprida ändringarna.
Välj fliken som heter metadata i egenskapspanelen och ställ in värdet på nyckeln Innehållstyp till application / x-plist. Glöm inte att klicka på Spara-knappen för att sprida ändringarna.
Din ansökan är nu klar att uppdateras på distans. Hur din ansökan svarar på ändringar som gjorts av fastighetslistan beror på din ansökan. Den här artikeln visar bara hur lätt det är att fjärransluta en applikation utan att behöva skicka in en ny version till App Store.
Du kan testa om allt fungerar genom att ändra modifieringen något initializeGroundControl
metod. Istället för att åberopa registerDefaultsWithURL:
, vi använder registerDefaultsWithURL: framgång: misslyckande:
tillhandahållen av GroundControl. Om du har genomfört GroundControl korrekt ska ordlistan i succéblocket innehålla data i egenskapslistan. Din ansökan är NSUserDefaults
uppdateras automatiskt.
- (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.mobiletuts.bartjacobs/RemoteControl.plist"); [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url framgång: ^ (NSDictionary * standard) NSLog (@ "Standardinställningar>% @", standardvärden); fel: ^ (NSError * fel) NSLog (@ "Fel>% @ med användarinformation% @.", fel, [felanvändareInfo]); ];
Den enorma framgången och den snabba adoptionshastigheten för Dropbox har resulterat i framväxten av många smarta och användbara applikationer. För personer som inte är bekant med AWS och Xcode kan det vara lättare att arbeta med Dropbox. Även om Dropbox är en bra lösning och ger möjlighet att göra en fil offentligt tillgänglig genom att placera den i den offentliga Dropbox-mappen, kan Dropbox inte användas med den nuvarande versionen av GroundControl. Anledningen är att innehållstypen av en fastighetslista som serveras av Dropbox ställs in automatiskt text / plain istället för det nödvändiga application / x-plist. AFNetworking kastar ett fel på grund av att den önskade innehållstypen inte matchar application / x-plist.
Det är dock möjligt att använda Dropbox för att fjärransluta en applikation. Vikten är att du måste göra en del av den tunga lyftningen själv, det vill säga asynkront nedladdning av fastighetslistan och uppdatering av programmets NSUserDefaults
.
Trots användningen av den offentliga Dropbox-mappen är dess framtid osäker. Det är också oklart om det finns en bandgräns för filer i den offentliga Dropbox-mappen. Med andra ord, om du vill använda Dropbox för att fjärransluta en iOS- eller OS X-applikation, bör du komma ihåg att det kan bryta vid något tillfälle eller att ditt Dropbox-konto kan bli avstängt på grund av att vissa begränsningar överskrids.
Det är inte alltid nödvändigt att bygga en anpassad backend för en iOS- eller OS X-applikation om allt du behöver göra är att uppdatera en handfull inställningar från tid till annan. De strategier som diskuteras i den här artikeln visar hur man fjärruppdaterar ett program med en enkel fastighetslista.
Självklart finns det flera andra möjligheter att fjärransluta en applikation. Det är till exempel möjligt att använda en tjänst som Parse. Men jag finner att även Parse är "för mycket" om allt du vill göra är att uppdatera en handfull inställningar.