watchOS 2 Achtergrondoverdrachten en wachtrijen

Invoering

Kijk Connectivity is een nieuw communicatieraamwerk dat is uitgebracht naast iOS 9 en watchOS 2. Het belangrijkste doel is om eenvoudig en naadloos informatie over te dragen tussen een Apple Watch-toepassing en de bijbehorende iOS-applicatie..

Het framework biedt veel verschillende functionaliteiten. Een paar weken geleden schreef Jorge Costa over de mogelijkheid om berichten te verzenden tussen een iOS- en een Apple Watch-toepassing. In deze zelfstudie zullen we inzoomen op het overbrengen van gegevens op de achtergrond.

De mogelijkheid om berichten te verzenden is ontworpen voor gegevens die onmiddellijk nodig zijn door het andere apparaat. Daarentegen zijn achtergrondoverdrachten het meest geschikt voor grotere hoeveelheden gegevens die niet onmiddellijk door de tegenpartij nodig zijn. Een uitzondering hierop is met informatie over complicaties, die we later in deze zelfstudie bespreken.

voorwaarden

Voor deze zelfstudie is vereist dat u Xcode 7 gebruikt in OS X 10.10 of hoger. Je zult ook het startersproject van GitHub moeten downloaden.

1. Framework-instellingen

Om het Watch Connectivity-framework te gebruiken, moeten zowel uw iOS- als watchOS-app een klasse hebben die voldoet aan de WCSessionDelegate protocol en dat de standaard correct configureert WCSession. De methoden van de WCSessionDelegate protocol verwerken het ontvangen van alle gegevens via het Watch Connectivity-framework en stellen u in staat controle te krijgen over de nieuwe gegevens in uw applicatie.

Open het startersproject in Xcode en bewerk het AppDelegate.swift. Voeg bovenaan het volgende toe importeren uitspraak:

importeer WatchConnectivity

Werk vervolgens de klassedefinitie van de bij AppDelegate klasse om het conform te maken met de WCSessionDelegate protocol.

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

We verklaren ook een eigenschap van het type WCSession! in de AppDelegate klasse om een ​​verwijzing naar de standaard op te slaan WCSession voorwerp.

var sessie: WCSession!

Werk ten slotte het applicatie (_: didFinishLaunchingWithOptions :) methode zoals hieronder getoond.

func applicatie (toepassing: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = self if WCSession.isSupported () session.activateSession () return true

In applicatie (_: didFinishLaunchingWithOptions :), we krijgen een verwijzing naar de standaard WCSession object, stel de gedelegeerde van de sessie in op uw apps AppDelegate instantie en, indien ondersteund, activeer de sessie. De wordt ondersteund class-methodecontroles om te zien of de watchOS-app van een tegenhanger voor uw iOS-app is geïnstalleerd op een gekoppelde Apple Watch en in staat is om gegevens te verzenden.

De setup voor de watchOS-kant lijkt erg op elkaar. Open ExtensionDelegate.swift en vervang de inhoud ervan door het volgende:

import WatchKit importeren WatchConnectivity-klasse ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var session: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = self session.activateSession () func applicationDidBecomeActive ()  func applicationWillResignActive () 

Je zult merken dat we niet bellen wordt ondersteund op de WCSession klas voordat de sessie wordt geactiveerd. Dit komt omdat deze methode altijd terugkeert waar aan de zijde van watchOS.

Als u wilt controleren of alles correct werkt, voert u uw Apple Watch-app uit op een van de twee simulators, zoals hieronder wordt weergegeven.

Voer vervolgens uw iOS-app uit op hetzelfde iPhone-simulatortype dat u hebt geselecteerd bij het uitvoeren van de horloge-app.

Zodra uw iOS-app is gelanceerd, moet uw Apple Watch-simulator teruggaan naar de wijzerplaat zoals wordt weergegeven in de onderstaande schermafbeelding.

2. Gegevens verzenden

Met de standaard WCSession object correct geconfigureerd, het is tijd voor ons om enkele gegevens te verzenden tussen de iOS en de Apple Watch-toepassing.

Open TableViewController.swift en voeg de volgende regel code toe aan het einde van de createNewItem (_ :) methode:

WCSession.defaultSession (). TransferUserInfo (item)

De transferUserInfo (_ :) methode accepteert een woordenboek als enige parameter. Nadat deze methode is aangeroepen, wordt het door u opgegeven gebruikersinfo-woordenboek toegevoegd aan de wachtrij met informatie die moet worden overgedragen.

Zowel iOS als watchOS werken in combinatie met elkaar om de informatie op een geschikt moment over te dragen. Het gecombineerde systeem kijkt naar zaken als app-gebruik, levensduur van de batterij, of het andere apparaat momenteel wordt gebruikt, enz. Zodra het systeem de informatie heeft overgedragen, voert de app op het andere apparaat een gedelegeerde callback-methode uit wanneer de volgende keer wordt gelanceerd.

Nu is het tijd voor ons om de ontvangstkant van de Apple Watch te implementeren. Open ExtensionDelegate.swift en voeg de volgende methode toe aan de ExtensionDelegate klasse:

func sessie (sessie: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Void in als let items = NSUserDefaults.standardUserDefaults (). objectForKey ("items") als? [NSDictionary] var newItems = items newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems als AnyObject, forKey: "items") else NSUserDefaults.standardUserDefaults (). SetObject ([userInfo] als AnyObject, forKey : "items")

Deze methode wordt aangeroepen zodra we de Apple Watch-app uitvoeren en nadat de informatie is overgedragen.

Merk op dat hoewel deze tutorial alleen een voorbeeld toont van het overbrengen van informatie van iOS naar watchOS, de WCSession en WCSessionDelegate methoden gedragen zich op beide platforms precies hetzelfde voor achtergrondoverdrachten.

Met deze code geïmplementeerd, voert u uw Apple Watch-app uit in de simulator. Voer vervolgens de iPhone-app opnieuw uit en druk op de knop om een ​​nieuw item te maken.

Ga nu terug naar de Apple Watch-simulator en druk op Command-Shift-H twee keer om terug te gaan naar de meest recente app. Je zult zien dat het item dat je zojuist hebt gemaakt, wordt weergegeven op de Apple Watch.

Merk op dat, hoewel de informatieoverdracht onmiddellijk plaatsvond tussen de simulatoren, in een situatie van de echte wereld met fysieke apparaten dit niet altijd het geval zal zijn.

3. Toegang tot de wachtrij in wachtrij

Laat de Apple Watch-simulator in de menubalk staan ​​of druk op als uw iOS-app nog steeds actief is Command-Q. Nadat u dit hebt gedaan, drukt u op de knop in uw iOS-app om nog een aantal items te maken, zoals hieronder wordt weergegeven.

Telkens wanneer u probeert informatie over te dragen met behulp van het framework Watch Connectivity, wordt het toegevoegd aan een wachtrij die geleidelijk wordt gewist wanneer informatie wordt overgedragen. Deze wachtrij is toegankelijk en ook de overschrijvingen in de wachtrij zijn toegankelijk.

Dit is handig, omdat u kunt zien hoeveel artikelen nog in behandeling zijn en u kunt zelfs specifieke overdrachten annuleren als dat nodig is. De items die u zojuist hebt gemaakt, worden momenteel vastgehouden in de gebruikersinformatiewachtrij omdat de Apple Watch momenteel is losgekoppeld van het bovenliggende apparaat, waardoor een overdracht onmogelijk is.

Open AppDelegate.swift en voeg de volgende code toe aan het eind van applicatie (_: didFinishLaunchingWithOptions :):

laat transfers = session.outstandingUserInfoTransfers if transfers.count> 0 let transfer = transfers.first! transfer.cancel ()

Met deze code hebben we toegang tot de uitstekende overdrachten van gebruikersinformatie en, als er minstens één is, annuleert u de eerste overdracht. De WCSessionUserInfoTransfer objecten terug van de outstandingUserInfoTransfers eigenschap hebben ook twee alleen-lezen eigenschappen die u kunt openen:

  • gebruikers informatie: Deze eigenschap slaat het woordenboek op dat u overdraagt.
  • overbrengen: Deze eigenschap slaat een Booleaanse waarde op en geeft aan of de gebruikersinformatie momenteel wordt overgedragen.

Er is niet veel functionaliteit beschikbaar met uitstekende informatieoverdracht in het kader van Watch Connectivity, maar afhankelijk van uw toepassing kunnen sommige van deze functies zeer nuttig zijn.

4. Andere overdrachtsmethoden

In deze zelfstudie hebben we alleen achtergrondoverdrachten van gebruikersinformatie behandeld, maar er zijn een paar andere manieren om gegevens tussen apparaten over te zetten. Elk van deze methoden is ontworpen voor een specifiek doel bij communicatie tussen een iPhone en een Apple Watch.

Applicatie context

Hier moet u informatie tussen apparaten overbrengen, waarbij alleen de meest recente informatie relevant is. U zet een enkel woordenboek over door het updateApplicationContext (_: error :) methode. De fout parameter in deze methode is een verwijzing naar een NSError object, dat wordt gevuld met informatie als er een probleem optreedt met de overdracht.

Aan de ontvangende kant kunt u de sessie (_: didReceiveApplicationContext :) methode of, als alternatief, toegang tot de toepassingscontext via de standaard WCSession voorwerpen receivedApplicationContext eigendom.

Complicatie informatie

Hier moet u een gebruikerswoordenboek voor één gebruiker overdragen, specifiek voor de aangepaste complicatie van uw app. Je kunt alleen informatie van de kant van iOS verzenden en dit gebeurt met de transferCurrentComplicationUserInfo (_ :) methode.

Het belangrijkste verschil tussen dit en het transferUserInfo (_ :) De methode die eerder in deze zelfstudie werd gebruikt, is dat het systeem bij het bijwerken van een complicatie altijd zal proberen de informatie onmiddellijk over te dragen.

Houd er rekening mee dat een overdracht niet wordt gegarandeerd omdat de apparaten kunnen worden losgekoppeld of uw complicatie mogelijk het budget voor de uitvoering van de achtergrond heeft overschreden. Als een overdracht van informatie over complicaties niet kan worden voltooid, wordt deze toegevoegd aan de outstandingUserInfoTransfers wachtrij waar het kan worden bekeken en geannuleerd indien nodig.

Merk ook op dat, als een complicatie-info-overdracht in de wachtrij staat en u de transferCurrentComplicationUserInfo (_ :) methode opnieuw, de bestaande overdracht in de wachtrij wordt ongeldig en geannuleerd.

bestanden

U kunt zelfs het framework Watch Connectivity gebruiken om bestanden over te zetten tussen apparaten. Dit gebeurt via de transferFile (_: metaData :) methode waarbij de eerste parameter een lokale is NSURL naar het bestand en de tweede is een optioneel woordenboek, met alle aanvullende gegevens die aan dat bestand zijn gekoppeld.

Zoals je zou verwachten, wordt het ontvangen van dit bestand afgehandeld door een methode van de WCSessionDelegate protocol, de sessie (_: didReceiveFile :) methode om precies te zijn. In deze methode krijg je een single WCSessionFile object dat een nieuwe lokale URL bevat voor het daadwerkelijke bestand, evenals de metagegevens die u hebt overgebracht.

Net als bij overdrachten van gebruikersinformatie, kunt u ook lopende of bestandsoverdrachten via de standaard bekijken WCSession voorwerpen outstandingFileTransfers eigendom.

Conclusie

Over het algemeen biedt het Watch Connectivity-framework een zeer eenvoudige en gemakkelijk te gebruiken interface voor het overbrengen van gegevens tussen een aangesloten iPhone en een Apple Watch. Het framework maakt de overdracht mogelijk van gebruikersinformatie, applicatiecontext en informatieve woordenboeken en bestanden.

U moet nu vertrouwd zijn met zowel het verzenden als ontvangen van informatie met behulp van het Watch Connectivity-framework en ook hoe u kunt omgaan met uitstaande overdrachten.

Laat zoals altijd uw opmerkingen en feedback achter in de opmerkingen hieronder.