O dată cu apariția WatchKit SDK, mulți programatori pe iOS au început să experimenteze cu acesta și au scris articole despre provocările întâmpinate în timpul implementării.
Urmărind acest trend, articolul de față descrie prima noastră impresie după abordarea WatchKit SDK-ului și provocările întâmpinate în timpul creării aplicației de navigație pentru ceasuri folosind Scout SDK-ul nostru.
După cum se poate observa în diagrama de jos, o aplicație pentru ceasuri este compusă din două parți: o extensie care rulează pe telefon și o aplicație care rulează pe iWatch.
Aplicația pentru ceas conține doar interfața cu utilizatorul - un fișier de tip storyboard și imagini statice care sunt afișate în interfața aplicației.
Obiectele de interfață afișate pe ceas nu sunt obiecte moștenite din UIView, ci obiecte proxy care moștenesc din clasa NSObject. Aceasta înseamnă că randarea customizată sau animațiile nu sunt posibile.
Deocamdată, customizarea acestor obiecte este foarte limitată comparativ cu obiectele UI folosite pe aplicațiile iPhone. De exemplu, unui obiect care afișează text i se poate schimba doar culoarea și textul, în timp ce pe telefon sunt mult mai multe customizații posibile. E posibil ca acest lucru să se schimbe cu apariția următoarei versiuni a WatchKit SDK.
Interfața cu utilizatorul a aplicației de pe ceas poate fi actualizată cu ajutorul extensiei care rulează pe telefon. Extensia poate să comunice cu aplicația iWatch prin _outlet-_urile legate cu obiectele de interfața din iWatch - toată logica din spate rulează în extensie.
Cele doua target-uri noi vor fi create. Una pentru extensie și una pentru aplicația pentru ceas. După cum se observă în imaginea de mai jos, target-ul aplicației pentru ceas include doar un fișier de tip storyboard și imagini statice care vor fi afișate pe ceas. Logica aplicației va fi implementată în extensie.
Selectați target-ul Watch app și rulați aplicația. Asigurați-vă că unul din display-urile externe ale simulatorului e selectat.
Înainte de a trece la următorul capitol, mai este un lucru de făcut - comunicarea între aplicația iOS și extensia WatchKit, care este posibilă doar printr-un fișier comun. În primul rând, deschideți secțiunea Identifiers de pe https://developer.apple.com Selectați ID-ul aplicației și activați opțiunea App Group. După configurare, regenerați profilul care folosește acest ID. Notă: vă rugam să folosiți app id-ul propriu pentru activarea App Groups.
WatchKitDemo: com.skobbler.WatchKitDemo
WatchKitDemo WatchKit Extension: com.skobbler.WatchKitDemo.watchkitextension
WatchKitDemo Watch App: com.skobbler.WatchKitDemo.watchapp
7.Selectați secțiunea Capabilities a target-urilor iOS și Watch app. Navigați la secțiunea App Groups și activați-o. Ar trebui să vedeți următoarele:
Prima dată, să aruncăm o privire la rezultatul final:
Aplicația WatchKitDemo pornește o navigație între două locații de pe hartă folosind Scout SDK.
Cu aplicația rulând pe ceas, iar extensia și aplicația mobila pe iPhone, utilizatorii văd instrucțiuni vizuale și distanța până la acestea.
Când ecranul ceasului e atins, se afișează o imagine a hărții cu o rută și poziția curentă. Aceasta este actualizată la câteva milisecunde.
Comunicarea între extensie și aplicația de pe iPhone se face printr-un fișier comun. Pentru aceasta, programatorii trebuie să activeze opțiunea App Groups în iTunes Connect și să configureze bundle identifiers pentru fiecare target.
Pentru că nu este vreun API pentru comunicarea directă între aplicația de pe iPhone și extensie, inițial am vrut să folosim un NSTimer pentru actualizarea informațiilor afișate pe ceas la câteva milisecunde.
Aici provocarea era că nu am fost notificați când fișierul comun era modificat. Soluția a fost utilizarea unui obiect MMWormhole. El notifică aplicația și extensia când fișierul comun era modificat, astfel încât nu am mai avut nevoie de NSTimer.
Obiectul MMWormHole trebuie inițializat atât în aplicația de pe iPhone cât și în extensie:
self.wormHole = [[MMWormhole alloc] [initWithApplicationGroupIdentifier:@"group.WatchKitDemoGroup"](mailto:initWithApplicationGroupIdentifier:@"group.WatchKitDemoGroup") optionalDirectory:nil];
Pentru a trimite și primi informații între aplicație și extensie folosiți:
//send message from the app to the extension
[self.wormHole passMessageObject:imageData identifier:@"image"];
//listen for messages in the extension
[self.wormHole listenForMessageWithIdentifier:@"image" listener:^(id messageObject) {}];
Aplicația creată este o demonstrație a ceea ce pot face programatorii cu Scout SDK și WatchKit SDK. Câteva scenarii posibile sunt:
Proiectul demo se poate descărca de aici.
Sperăm ca în următoarea versiune a librăriei aceste probleme să poată fi rezolvate.
de Peter Lawrey
de Răzvan Costa