Deze tutorial leert je alles over de nieuwste multitasking-verbeteringen die de iOS 7 SDK biedt. In het bijzonder komt u meer te weten over de API's Achtergrond ophalen, Externe meldingen en Achtergrondoverdrachtservice. Lees verder!
Met iOS 7 heeft Apple drie nieuwe multitasking-API's beschikbaar gesteld aan ontwikkelaars:
Al deze API's bieden programmeurs de mogelijkheid om multitasking-applicaties te ontwikkelen die de apparaathardware beter zullen gebruiken terwijl gebruikers een grotere ervaring krijgen. In deze zelfstudie leer je meer over de drie bovengenoemde verbeteringen en wanneer je ze moet gebruiken.
Om het te maken Achtergrond Fetch API beter begrepen, stel je voor dat je een nieuws-app wilt bouwen. Hypothetisch nemen we de aanname dat de inhoud van deze app wordt aangeboden via internet en een van de essentiële functies is om updates te ontvangen telkens wanneer de gebruiker de app start.
Vóór iOS 7 konden ontwikkelaars de app nieuwe inhoud laten maken zodra deze was gelanceerd. Dit werkt, maar het nadeel is dat gebruikers een tijdje moeten wachten telkens wanneer de app start. Ook wordt de verbindingssnelheid van de telefoon een belangrijke factor. Stel je voor dat de gebruiker verbinding maakt via een mobiel netwerk na een week of twee inactiviteit! Dit is natuurlijk niet wat ontwikkelaars willen, omdat het de gebruikerservaring verslechtert.
Op iOS 7 zijn dingen drastisch veranderd! Met de Background Fetch API kan onze hypothetische toepassing daadwerkelijk nieuwe inhoud passief downloaden terwijl ze nog steeds op de achtergrond blijven. iOS 7 maakt de app wakker, zorgt voor de uitvoeringstijd op de achtergrond en wanneer de app klaar is met updaten, gaat hij weer in slaap. Uiteraard worden gebruikers niet op de hoogte gebracht wanneer dit gebeurt. Ze vinden eenvoudig de nieuwe inhoud gereed voor gebruik bij het starten van de toepassing.
Het updateproces kan plaatsvinden op vooraf gedefinieerde intervallen die zijn ingesteld door de programmeur of in intervallen die zijn opgegeven door het besturingssysteem. Als u aangepaste intervallen instelt, raadt Apple u aan deze verstandig in te stellen en niet vaak gegevens op de achtergrond op te halen. Als u dat wel doet, leidt dit tot leegraken van de batterij en verspilling van systeembronnen. Als u het besturingssysteem eenvoudigweg dingen laat regelen, maakt iOS 7 gebruiksvoorspellingen. Het doet dit door te observeren hoe vaak de app wordt gelanceerd en op welke tijden. Vervolgens anticipeert het op dit gedrag door online te gaan en inhoud op te halen voordat het voorspelt dat de gebruiker het wil hebben. Als een gebruiker van onze hypothetische nieuws-app bijvoorbeeld elke middag de app start, neemt iOS dit waar en besluit dat de app ergens in de middag en vóór de gebruikelijke starttijd inhoud moet ophalen. Heel cool!
Het hierboven beschreven ophaalproces omvat drie stappen:
toepassing: performFetchWithCompletionHandler:
Laten we de dingen gedetailleerder bekijken.
Zoals ik net noemde, is de eerste stap in het hele proces het inschakelen van de achtergrondophaalcapaciteit voor de toepassing in Xcode 5. Dit kan op twee manieren worden gedaan. De eerste manier is om de .plist
bestand, waar u het moet toevoegen Vereiste achtergrondmodi
toets met de halen
waarde, zoals dit:
De volgende stappen zijn een alternatieve benadering:
Standaard is de initiële ophaalintervalwaarde ingesteld op de UIApplicationBackgroundFetchIntervalNever
modus, wat betekent dat het ophalen van de achtergrond nooit zal worden uitgevoerd. Als deze waarde niet wordt gewijzigd, werkt de achtergrondophaal niet, zelfs als deze is ingeschakeld met een van de twee manieren die hierboven zijn besproken. Om dit te bereiken, moet je naar de toepassing: didFinishLaunchingWithOptions:
en stel de minimale ophaalintervalwaarde als volgt in:
- (BOOL) toepassing: (UIApplication *) toepassing didFinishLaunchingWithOptions: (NSDictionary *) launchOptions [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; terugkeer JA;
De UIApplicationBackgroundFetchIntervalMinimum
is de minimale intervalwaarde die is toegestaan en beheerd door het systeem. U kunt natuurlijk een aangepast tijdsinterval instellen door eenvoudig de bovenstaande methode te voorzien van een NSTimeInterval
waarde. Maar tenzij het nodig is, is het over het algemeen beter om iOS te laten beslissen wanneer het de app moet toestaan om op de achtergrond te werken en nieuwe inhoud op te halen. Als je een minimum instelt, is het belangrijk je te realiseren dat het UIApplicationBackgroundFetchIntervalMinimum
bepaalt niet absoluut de timing. Ze lijken meer op suggesties. iOS zal proberen het schema te volgen als dat mogelijk is, maar afhankelijk van de beschikbare systeembronnen kan het ophalen van het systeem min of meer vaak gebeuren.
De laatste vereiste stap is het implementeren van de nieuw toegevoegde toepassing: performFetchWithCompletionHandler:
gedelegeerde methode. Deze wordt elke keer genoemd dat een achtergrondophaal moet worden uitgevoerd. De voltooiingshandler van de methode accepteert een van de volgende drie waarden om iOS op de hoogte te stellen van de ophaalresultaten:
UIBackgroundFetchResultNewData
: Als er nieuwe gegevens zijn gevonden door de ophaalactieUIBackgroundFetchResultNoData
: Als er geen nieuwe gegevens zijn gevondenUIBackgroundFetchResultFailed
: Als er een fout is opgetreden tijdens het ophaalprocesLaten we dit in actie zien:
-(ongeldige) toepassing: (UIApplication *) toepassing performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler // Bel of schrijf de code die nodig is om nieuwe gegevens op te halen, te verwerken en de gebruikersinterface bij te werken. // De logica voor het informeren van iOS over de ophaalresultaten in gewone taal: if (/ ** NIEUWE GEGEVENS BESTAAN EN WERDEN SUCCESVOL VERWERKT ** /) completionHandler (UIBackgroundFetchResultNewData); if (/ ** GEEN NIEUWE GEGEVENS BESTAAT ** /) completionHandler (UIBackgroundFetchResultNoData); if (/ ** ELKE FOUT STAAT ** /) completionHandler (UIBackgroundFetchResultFailed);
Als er nieuwe gegevens worden gevonden, moet u ook de nodige updates van de gebruikersinterface uitvoeren. Deze moeten om twee redenen meteen plaatsvinden: (1) gebruikers moeten de inhoud zien wanneer de app de volgende keer wordt gestart, en (2) de momentopname van de app blijft bijgewerkt.
Er zijn nog enkele feiten die u moet weten. Ten eerste, als de app op de achtergrond wordt gestart, heeft het ongeveer dertig seconden tot zijn beschikking om alle vereiste taken uit te voeren en de voltooiingshandler te bellen. Als deze tijdslimiet wordt overschreden, wordt de app opnieuw opgeschort. Voor apps die meer dan 30 seconden nodig hebben (misschien vanwege mediadownloads), moet u een achtergrondophaal plannen met behulp van de Background Transfer Service API. We zullen deze optie later bespreken.
Nadat je het ophaalmechanisme hebt ingesteld en klaar om te werken, biedt Apple twee manieren om de achtergrondophoping te testen bij gebruik van de simulator.
De eerste benadering volgt deze stappen:
Op deze manier is het handig om de API te proberen terwijl de app wordt uitgevoerd. De tweede manier is meer betrokken, maar u kunt de app testen terwijl deze op de achtergrond blijft. Ga als volgt te werk om dit te proberen:
Achtergrondophalen is bedoeld om te worden gebruikt voor niet-kritieke updates van apps, omdat het tijdstip waarop het optreedt, kan verschillen. Zie voor meer essentiële updates het gedeelte Meldingen op afstand dat hierna verschijnt. Over het algemeen is de API voor achtergrondaanvragen geschikt voor toepassingen die naadloos inhoud willen beheren. Een paar voorbeeldcategorieën voor apps zijn nieuws, sociaal netwerk, weer en delen van foto's.
Stel je voor dat we een applicatie bouwen met zowel schriftelijke als videozelfstudies. Laten we veronderstellen dat gebruikers 2-3 keer per maand nieuwe zelfstudievideo's kunnen downloaden. Dus, hoe zouden we onze gebruikers bewust maken van nieuwe videoreleases? We kunnen geen oplossing kiezen die de API voor achtergrond fetch of iets dergelijks gebruikt, omdat dit zou leiden tot verspilling van apparaatbronnen en zinloze verzoeken aan de server. We kunnen ook niet weten wanneer een nieuwe video-release klaar is. Daarom moeten we pushmeldingen gebruiken, dus elke keer dat er nieuwe inhoud is, kunnen we onze gebruikers hiervan op de hoogte stellen door ze eenvoudig te waarschuwen. We verwachten van onze gebruikers dat ze daarom de app starten en nieuwe inhoud downloaden. Het probleem is dat deze benadering de gebruiker dwingt te wachten tot de video wordt gedownload en als de inhoud groot genoeg is, moeten ze mogelijk lang wachten. Dus, hoe kunnen gebruikers nieuwe inhoud in hun toepassing verkrijgen wanneer deze inhoud beschikbaar is, maar zonder te wachten?
Dit is waar Remote Notifications van pas komen. Externe meldingen zijn eigenlijk stille pushmeldingen, Dit zijn pushmeldingen die gebruikers niet informeren over hun bestaan. Wanneer een nieuwe externe melding binnenkomt, maakt het systeem de app stil, zodat deze de melding kan verwerken. De toepassing is vervolgens verantwoordelijk voor het starten van het downloadproces voor de nieuwe inhoud. Wanneer het downloaden is voltooid, lokale kennisgeving wordt verzonden naar de gebruiker. Wanneer de toepassing wordt gestart, wacht de nieuwe inhoud op de gebruiker.
Net als Background Fetch proberen Remote Notifications de wachttijd voor gebruikers weg te nemen bij het downloaden van nieuwe inhoud of het uploaden van gegevens naar een server. Beide API's werken in de achtergrondthread en gebruikers worden op de hoogte gebracht nadat de taak is voltooid. Externe meldingen zijn echter geschikt in gevallen waarin inhoud niet vaak wordt bijgewerkt of anderszins kritiek is voor de gebruikerservaring.
Als u externe meldingen binnen een toepassing wilt gebruiken, moet u deze eerst inschakelen. U kunt dit doen met het * .plist-bestand of het nieuwe mogelijkheden projecttabblad. Als u het * .plist-bestand wilt gebruiken, moet u de Vereiste achtergrond sleutel met de waarde voor externe meldingen als volgt:
Ga als volgt te werk om het tabblad Mogelijkheden te gebruiken:
De volgende stap is het implementeren van de toepassing: didReceiveRemoteNotification: fetchCompletionHandler:
gedelegeerde methode in uw AppDelegate-bestand. Deze wordt gebeld wanneer een nieuwe melding binnenkomt. Gebruik de voltooiingshandler om iOS op de hoogte te stellen van het resultaat van de gegevensophaalactie:
-(ongeldige) toepassing: (UIApplication *) toepassing didReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler // Bel of schrijf de code die nodig is om nieuwe gegevens te downloaden. completionHandler (UIBackgroundFetchResultNewData);
Een melding stil maken is vrij eenvoudig. In de kennisgeving payload hoeft u alleen de code beschikbaar: 1
markeer en laat alle waarschuwings- of geluidsgegevens weg die de gebruiker zouden waarschuwen.
aps content-available: 1
Over het algemeen geldt hier ook alles wat geldig is bij het werken met Background Fetch. U hebt bijvoorbeeld maximaal 30 seconden om nieuwe inhoud te downloaden en het systeem in de bovenstaande methode op de hoogte te stellen voordat de app weer in slaap valt. Als de nieuwe inhoud tijd nodig heeft om te worden gedownload, overweeg dan het gebruik van de Service voor achtergrondoverdracht API.
Houd er rekening mee dat Apple de snelheid beheert van de levering van externe meldingen (stille pushmeldingen) die worden verzonden door een push-provider. Als de snelheid normaal is, worden zowel normale als stille meldingen meteen afgeleverd. Als stille meldingen echter vaak worden verzonden, slaat de Apple Push Service ze op om ze later af te leveren. Zorg ervoor dat u externe meldingen verstandig verzendt.
Een andere geweldige functie van iOS 7 is de Service voor achtergrondoverdracht API. Traditioneel was het verzamelen van grote hoeveelheden gegevens niet eenvoudig, vooral vanwege de beperkte tijd en het overgedragen gegevensbeheer. Aanvragen waren nodig om het grootste deel van het upload- of downloadproces te voltooien terwijl ze zich op de voorgrond bevonden. Met iOS 7 zijn de zaken echter totaal anders. Toepassingen kunnen meer vrijheid genieten bij het uitvoeren van achtergrondtaken. Allereerst krijgen applicaties met de service voor achtergrondoverdracht zoveel tijd als ze nodig hebben om een overdracht te voltooien. Of ze zich op de voorgrond of op de achtergrond bevinden, is niet relevant. Tijdbeperkingen zijn niet langer aanwezig en het systeem is nu verantwoordelijk voor het beheer van de gegevens die worden geüpload of gedownload. Zelfs als een applicatie niet draait, wordt iOS wakker om situaties aan te pakken waar beslissingen moeten worden genomen. Een paar voorbeelden hiervan zijn wanneer een bestand wordt gedownload of wanneer er meer informatie aan de server moet worden verstrekt.
De service voor achtergrondoverdracht is gebaseerd op de NSURLSession
klasse, die net is geïntroduceerd met iOS 7. Deze klasse is verantwoordelijk voor het overbrengen van gegevens via HTTP of HTTPS en biedt de mogelijkheid voor achtergrondnetwerkgerelateerde taken. Het hele idee erachter is eenvoudig en het is gebaseerd op het gebruik van een sessies, waarbij een enkele sessie alle gerelateerde gegevensoverdrachtstaken beheert. Er zijn verschillende sessietypen beschikbaar, maar de achtergrondsessies is degene waar we om geven, en het werkt altijd op afzonderlijke threads (processen) die door het systeem zijn gecreëerd. Achtergrondsessies ondersteunen beide downloads (NSURLSessionDownloadTask
) en upload (NSURLSesssionUploadTask
) taken, die aan de achtergrond worden toegevoegd NSURLSession
voorwerpen.
Een ander opmerkelijk feit in verband met overdrachten op de achtergrond is dat een overdracht discretionair of niet-discretionair kan zijn. Niet-discretionaire overdrachten kunnen alleen worden gestart als de toepassing op de voorgrond staat, maar er is een optie om de discretionaire status in te stellen op basis van de behoeften van de toepassing. Discretionaire overdrachten hebben meestal de voorkeur, omdat hiermee het besturingssysteem een efficiënter energiebeheer op het apparaat kan realiseren. Er is ook een beperking die van toepassing is op discretionaire overdrachten en dat is dat ze alleen via wifi-netwerken moeten worden uitgevoerd. Achtergrondoverdrachten worden altijd gestart als discretionaire overdrachten.
De gedelegeerde methode toepassing: handleEventsForBackgroundURLSession: completionHandler:
wordt opgeroepen wanneer een achtergrondoverdracht voltooid is, zodat de voltooide taak kan worden afgehandeld. Als er bijvoorbeeld nieuwe inhoud is gedownload, moet u deze gedelegeerde methode implementeren om deze permanent op te slaan en indien nodig de gebruikersinterface bij te werken. Deze methode wordt ook genoemd wanneer inloggegevens van de app nodig zijn om door te kunnen gaan met de overdracht. Over het algemeen past u in deze gedelegeerde methode alle benodigde logica toe die uw toepassing vereist wanneer een download- of uploadproces is voltooid en de toepassing binnen de achtergrondthread bestaat. Uiteraard gebruikt u de voltooiingshandler om het systeem te laten weten wanneer u klaar bent, zodat het de app weer in slaap kan brengen.
De service voor achtergrondoverdracht is ideaal voor gebruik in combinatie met de achtergrondophaal en de API's voor externe meldingen. Toegegeven het bovenstaande, wordt het duidelijk dat het de beste praktijk is om de gedelegeerde methoden van de achtergrondophaal en de externe meldingen te gebruiken enqueue uw overdrachten en laat het systeem het werk doen. Immers, tenzij de gegevens die moeten worden uitgewisseld met de server een kleine voetafdruk hebben, zijn in de meeste gevallen de 30 seconden die worden geboden aan alleen de twee genoemde gedelegeerde methoden voldoende om de achtergrondoverdracht en alle gerelateerde taken in te stellen. Gebruik de NSURLSession
klasse om alle gewenste overdrachten te definiëren en ervoor te zorgen dat uw app nieuwe inhoud ophaalt. Het stuurt ook alle gegevens die moeten worden verwerkt, ongeacht de tijd die nodig is.
Background Fetch, Remote Notifications en de Background Transfer Service API's zijn functies die ontwikkelaars graag al lang geleden hebben gezien. Gelukkig heeft Apple met de uitgave van iOS 7 het gemakkelijker dan ooit gemaakt om applicatiegegevens te verwerken. Vanaf iOS 7 kan de app-inhoud vrijwel altijd up-to-date zijn, maar het is uiteindelijk aan elke ontwikkelaar om dit te regelen en de geboden hulpmiddelen te gebruiken! Veel multitasking en bedankt voor het lezen!