Oppdaterer iOS-programmer med GroundControl

Det er uunngåelig å sende inn en oppdatering til App Store hvis du vil legge til større forbedringer i et program. Det er imidlertid tungvint og tidkrevende å gå gjennom App Store-gjennomgangsprosessen for enkle modifikasjoner. I denne artikkelen vil jeg vise deg hvordan du oppdaterer et program eksternt ved hjelp av GroundControl-prosjektet.


Introduksjon

Ideen bak GroundControl er enkel, programmet henter en ekstern eiendomsliste og oppdaterer sin NSUserDefaults med innholdet i eiendomslisten. Selv om mange applikasjoner laster ned data fra en dedikert backend for dynamisk oppdatering av innholdet, vil strategien jeg legger ut i denne artikkelen være ideell hvis en dedikert backend ikke er et alternativ eller overgår kravene til søknaden din.

Oppsettet diskutert i denne opplæringen er lett og rimelig. Ikke bare er det billig, det er også lett å vedlikeholde, noe som ofte overses av både kunder og utviklere.

Det er viktig å understreke at eiendomslister er ideelle for små biter av data og ikke skal brukes som erstatning for en dedikert backend. Hvis en applikasjon må oppdateres daglig med nytt innhold, vil strategien som er omtalt i denne opplæringen, ikke kutte den.

For å illustrere hvordan alle de forskjellige stykkene passer sammen, vil vi bygge et iOS-program som er riktig navngitt Fjernkontroll. Selv om applikasjonen selv ikke vil gjøre mye, ved å integrere GroundControl for å oppdatere programmets NSUserDefaults Det blir tydelig hvor lett det er å eksternt oppdatere et program med svært lite overhead. La oss komme i gang.


Trinn 1: Prosjektoppsett

Opprett et nytt prosjekt i Xcode ved å velge Enkeltvisningsprogram mal fra listen over maler (figur 1). Navn søknaden din Fjernkontroll, skriv inn en bedriftsidentifikator, sett iPhone for enhetens familie, og sjekk Bruk automatisk referansetelling. Sørg for å fjerne merket for de resterende avmerkingsboksene for dette prosjektet. Fortell Xcode hvor du vil lagre prosjektet ditt og klikk på Skape knapp (figur 2).


Trinn 2: GroundControl

Navnet Mattt Thompson høres kanskje kjent for deg. Han er en av skaperne og drivkraften bak AFNetworking, det mest populære nettverksbiblioteket for iOS og OS X. GroundControl er bygget på toppen av AFNetworking og gir en enkel løsning for eksternt konfigurering av et program ved å oppdatere programmets NSUserDefaults. Det gjør dette gjennom en kategori på NSUserDefaults, som tillater NSUserDefaults å oppdatere seg asynkront med en ekstern eiendomsliste.

Det spiller ingen rolle hvor eiendomslisten er plassert så lenge det kan nås gjennom HTTP (S) protokollen og innholdstypen av svaret er satt til application / x-plist.

På GitHub-siden til GroundControl gir Mattt to eksempler på hvordan man implementerer serversiden av historien, en Ruby-implementering og en Python-implementering. Men jeg lovet deg at oppsettet ville være lett og billig. I stedet for å bruke en server som du trenger å vedlikeholde, bruker vi Amazonas Simple Storage Service eller S3. Som jeg forklarte tidligere, er kravene enkle, det vil si at (1) filen må være en eiendomsliste og (2) innholdstypen av svaret må være application / x-plist. Amazonas S3 er en perfekt passform.

Ikke bare er AWS S3 perfekt egnet til servering av statiske filer, det har oppnådd sine striper gjennom årene. Selv om søknaden din når topp 10 i App Store, vil S3 fortsette å vise opp eiendomslisten uten problemer. Før du går over til AWS-konsollen (Amazon Web Services), må du først integrere GroundControl i prosjektet.


Trinn 3: Legge til AFNetworking og GroundControl

GroundControl er bygget på toppen av AFNetworking, noe som betyr at du må legge til AFNetworking i ditt Xcode-prosjekt. Selv om vi kunne legge til AFNetworking og GroundControl ved hjelp av CocoaPods, legger vi til begge biblioteker manuelt, siden noen av dere kanskje ikke er kjent med CocoaPods. Last ned den nyeste versjonen av AFNetworking og GroundControl og dra hvert bibliotek til ditt Xcode-prosjekt. Pass på å kopiere innholdet i mappen til prosjektet ditt ved å merke av i boksen merket Kopier elementer til målgruppens mappe (om nødvendig) og ikke glem å legge til begge biblioteker til fjernkontrollmålet (figur 3 og 4).

AFNetworking er avhengig av Systemkonfigurasjon og Mobile Core Services rammer for noen av dens funksjonalitet. Det er derfor nødvendig å knytte prosjektet ditt mot disse rammene. Velg prosjektet ditt i Prosjektnavigator og velg Fjernkontroll mål fra listen over mål. Velge Bygg faser øverst, åpne Link binær med biblioteker skuff, og legg begge rammene til prosjektet ditt (figur 5).

Før vi kan begynne å jobbe med AFNetworking og GroundControl, må vi oppdatere prosjektets Prefix.pch fil ved å legge til en importerklæring for rammene vi nettopp har lagt til prosjektet. Ta en titt på koden nedenfor for avklaring.

 // // Prefiksheader for alle kildefiler i "Remote Control" -målet i "Fjernkontroll" -prosjektet // #import  #ifndef __IPHONE_4_0 #warning "Dette prosjektet bruker funksjoner som bare er tilgjengelige i iOS SDK 4.0 og nyere." #endif #ifdef __OBJC__ #import  #importere  #importere  #importere  #slutt om

Trinn 4: Integrering av GroundControl

Vi starter med å legge til to importerklæringer til applikasjonsdelegates implementasjonsfil, en for AFNetworking og en annen for GroundControl. Hvis du ender med å bruke AFNetworking på forskjellige steder i prosjektet ditt, kan det være lurt å legge til importoppgaven for AFNetworking til prosjektet ditt Prefix.pch fil.

 #import "AFNetworking.h" #import "NSUserDefaults + GroundControl.h"

Integrering av GroundControl er den enkle delen, da det bare krever to linjer med kode. I søknadens delegat s applicationDidBecomeActive: Metode, vi kaller en hjelpemetode for å initialisere GroundControl.

 - (ugyldig) applicationDidBecomeActive: (UIApplication *) søknad // Initialize GroundControl [self initializeGroundControl]; 

Hjelpemetoden kunne ikke vært enklere takket være kategorien på NSUserDefaults levert av GroundControl. Vi lager nettadressen for eiendomslisten og sender den som et argument i registerDefaultsWithURL:. Dette vil sikre at eiendomslisten lastes ned asynkront. En gang lastet ned, NSUserDefaults oppdateres automatisk med innholdet i eiendomslisten.

 - (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://www.example.com/RemoteControl.plist"]; [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url]; 

Et annet alternativ er å ringe registerDefaultsWithURL: suksess: fiasko: i stedet hvis du foretrekker å jobbe med suksess og feil tilbakekalling. For enda mer kontroll gir GroundControl en tredje metode, registerDefaultsWithURLRequest: suksess: fiasko:. Denne metoden aksepterer en forekomst av NSURLRequest så vel som en suksess og feil blokk.

Det kan kanskje overraske deg, men integrering av GroundControl var den vanskelige delen. De siste to trinnene er (1) å lage eiendomslisten og (2) laste den opp til Amazons S3.


Trinn 5: Lag en eiendomsliste

Opprett en ny fil i Xcode ved å velge Ressurs fanen til venstre og velge Eiendomsliste til høyre (figur 6). Gi filen navnet Fjernkontroll og lagre det på datamaskinens skrivebord. Det er ikke nødvendig å legge til det i ditt Xcode-prosjekt. Den enkleste måten å redigere eiendomslisten er i Xcode. Ta en titt på skjermbildet nedenfor for å se hvordan eiendomslisten ser ut og kan redigeres i Xcode (figur 7). Husk at en eiendomsliste bare kan inneholde booleans, datoer, tall, binære data, strenge, arrayer og ordbøker. Det er god praksis å navngi nøklene (for eksempel med prosjektets klassekode) for å sikre at de ikke er i konflikt med andre oppføringer lagret i NSUserDefaults.

Trinn 6: Last opp eiendomslisten

For å bruke Amazons webtjenester trenger du en Amazon-konto. Kostnadene forbundet med Amazons S3 er ekstremt lave, og sjansen er at du ikke en gang vil bli belastet for en stund siden eiendomslisten er bare noen få kilobytes i størrelse.

Du kan laste opp eiendomslisten til Amazon S3 ved hjelp av Amazonas AWS Console eller ved hjelp av et program som støtter Amazons S3, som Panics fantastiske Transmit.

Når du har lastet opp eiendomslisten, er det tre ting igjen å gjøre, (1) å kopiere nettadressen til eiendomslisten, (2) gi offentlig tilgang til eiendomslisten, og (3) sette riktig innholdstype.

Kopier nettadressen

I AWS-konsollen velger du eiendomslisten og klikker på Eiendommer knappen øverst til høyre. Velg kategorien navngitt detaljer i egenskapspanelet (figur 8). Kopier lenken til eiendomslisten og oppdatere initializeGroundControl metode i programdelegatet med riktig nettadresse.

Gi offentlig tilgang

Velg kategorien navngitt tillatelser i egenskapspanelet og legg til et nytt sett med tillatelser til eiendomslisten ved å klikke på Legg til flere tillatelser knapp. Sett stipend til alle og begrense tillatelsene til Åpne / Last ned. Dette vil sørge for at søknaden din kan laste ned eiendomslisten. Ikke glem å klikke på lagre-knappen for å forandre endringene.

Angi innholdstype

Velg kategorien navngitt metadata i egenskapspanelet og sett verdien av nøkkelen Innholdstype til application / x-plist. Ikke glem å klikke på lagre-knappen for å forandre endringene.


Trinn 7: Bygg og kjøre

Din søknad er nå klar til å bli oppdatert eksternt. Hvordan søknaden din svarer på endringene som er gjort av eiendomslisten, avhenger av søknaden din. Denne artikkelen viser bare hvor enkelt det er å eksternt oppdatere et program uten å måtte sende inn en ny versjon til App Store.

Du kan teste om alt fungerer ved å endre litt initializeGroundControl metode. Istedenfor å påberope seg registerDefaultsWithURL:, vi bruker registerDefaultsWithURL: suksess: fiasko: levert av GroundControl. Hvis du har implementert GroundControl riktig, bør ordboken til suksessblokken inneholde dataene i eiendomslisten. Din søknad er NSUserDefaults vil bli oppdatert automatisk.

 - (void) initializeGroundControl NSURL * url = [NSURL URLWithString: @ "https://s3.amazonaws.com/com.mobiletuts.bartjacobs/RemoteControl.plist"]; [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL: url suksess: ^ (NSDictionary * standard) NSLog (@ "Standardinnstillinger>% @", standard);  feil: ^ (NSError * feil) NSLog (@ "Feil>% @ med brukerinfo% @.", feil, [feil brukerInfo]); ]; 

Dropbox

Den enorme suksessen og den raske adopsjonsraten til Dropbox har resultert i fremveksten av mange smarte og nyttige applikasjoner. For folk som ikke er kjent med AWS og Xcode, kan det være lettere å jobbe med Dropbox. Selv om Dropbox er en god løsning og gir mulighet til å gjøre en fil offentlig tilgjengelig ved å plassere den i den offentlige Dropbox-mappen, kan Dropbox ikke brukes med den nåværende versjonen av GroundControl. Årsaken er at innholdstypen av en eiendomsliste som vises av Dropbox, settes automatisk til text / plain i stedet for det nødvendige application / x-plist. AFNetworking kaster en feil på grunn av at den nødvendige innholdstypen ikke stemmer overens application / x-plist.

Det er imidlertid mulig å bruke Dropbox for å oppdatere et program eksternt. Forholdet er at du må gjøre noe av det tunge løftet selv, det vil si asynkront å laste ned eiendomslisten og oppdatere programmets NSUserDefaults.

Til tross for bruken av den offentlige Dropbox-mappen, er fremtidens fremtid usikker. Det er også uklart om det er en båndgrense som pålegges filer i den offentlige Dropbox-mappen. Med andre ord, hvis du ønsker å bruke Dropbox for ekstern oppdatering av et iOS- eller OS X-program, må du huske på at det kan bryte på et tidspunkt eller at Dropbox-kontoen din kan bli suspendert på grunn av å overskride visse begrensninger.


Konklusjon

Det er ikke alltid nødvendig å bygge en tilpasset backend for et iOS- eller OS X-program hvis alt du trenger å gjøre er å oppdatere en håndfull innstillinger fra tid til annen. Strategiene som er omtalt i denne artikkelen, viser hvordan du eksternt oppdaterer et program med en enkel eiendomsliste.

Selvfølgelig er det flere andre muligheter for å oppdatere et program eksternt. For eksempel er det mulig å bruke en tjeneste som Parse. Imidlertid finner jeg at selv Parse er "for mye" hvis alt du vil gjøre er å oppdatere en håndfull innstillinger.