Programovanie

Vytvárajte bez námahy prvé mobilné aplikácie offline

Alexander Stigsen je spoluzakladateľom a generálnym riaditeľom spoločnosti Realm.

Je všeobecne uznávanou pravdou, že užívateľ, ktorý vlastní smartphone, musí mať potrebu lepšieho pripojenia. Napriek investíciám do infraštruktúry v hodnote miliárd dolárov a neúnavným technologickým inováciám si všimnutie podstatnej reality spojenej éry netrvá dlhšie ako krátku jazdu: Nemôžete predpokladať, že sieťové pripojenie bude k dispozícii vždy, keď budete chcieť. Ako vývojári mobilných telefónov je pravda, ktorú je dobré ignorovať.

Stav offline môže byť v aplikáciách nepríjemný, problém však začína základným a nesprávnym predpokladom - offline je predvolene chybový stav. To malo zmysel, keď sme vytvorili aplikácie pre stolné počítače s vyhradenými ethernetovými uplinkmi. Nemá zmysel, keď sa po zatvorení dverí výťahu stane aplikácia úplne zbytočnou, alebo keď je rozumné očakávať, že sa vaša aplikácia bude používať na miestach, kde chýba spoľahlivá bunková infraštruktúra.

Nemôžeme pokrývať svet pokrytím, takže musíme ponúknuť alternatívu. Najprv musíme myslieť offline. Musíme navrhnúť aplikácie tak, aby boli užitočné v režime offline. Musíme vytvárať aplikácie, ktoré naplno využívajú internet, keď je k dispozícii, ale uvedomujeme si, že prístup k internetu je vždy dočasný. Musíme robiť rozhodnutia o inteligentnom dizajne, ktoré zahŕňajú offline stavy, a zabezpečiť, aby boli tieto offline stavy pre používateľov zrozumiteľné.

Veľa práce sa venuje definovaniu budúcnosti offline. Spoločnosť Realm, kde pracujem, už nejaký čas buduje platformu pre mobilné aplikácie, ktoré sú prvé v režime offline, v reálnom čase. Naša mobilná databáza a mobilná platforma Realm uľahčujú vytváranie inteligentných aplikácií offline najskôr na takmer akomkoľvek mobilnom zariadení. Ľudia v zozname List Apart enormne prispeli k literatúre prvej offline, najmä k webovým aplikáciám. A vývojárske komunity hlavných mobilných ekosystémov strávili mnoho hodín ponúkaním pôsobivých vlastných riešení otvoreného zdroja.

Nasleduje krátky úvod do toho, ako si môžete vytvoriť mobilnú aplikáciu, ktorá je prvá v režime offline. Na konci nakreslím nejaký jednoduchý vzorový kód Swift, aby som ukázal, ako vyzerá minimálna offline prvá aplikácia, ale tu ponúkané princípy a problémy sú relevantné pre kohokoľvek, kto pracuje na vývoji mobilných aplikácií.

Dizajn pre offline

Predtým, ako vytvoríte aplikáciu offline, ktorú ste vždy chceli, musíme sa znova pozrieť na dizajnové riešenia, ktoré dávali zmysel počítačom s vysokou pravdepodobnosťou online. Ak vaša aplikácia dokáže spracovať offline a online stavy, musíme odpovedať na to, čo dokáže a ako ukážeme používateľovi, čo je možné.

Definujte, čo je možné offline

Zoberme si ako príklad Twitter. Ak ste offline a zverejňujete tweety, mohol by sa prvý klient služby Twitter, ktorý je offline, vydať dvoma cestami. Mohlo by to zaradiť tweet do frontu, kým znova nezíska pripojenie. Alebo by vás mohlo odmietnuť nechať tweetovať - ​​aj keď vám to umožňuje zaradiť do frontu ďalšie akcie, napríklad obľúbené, ako to robí Tweetbot.

Prečo by vám Tweetbot zabránil tweetovať offline? Možno preto, že v čase, keď sa znova pripojíte k internetu, vaše tweety už nebudú relevantné. Vyriešenie tohto problému by vyžadovalo vytvorenie nového používateľského rozhrania pre zoznam tweetov, ktoré ste zatiaľ nezverejnili, ale ktoré budete možno musieť upraviť alebo odstrániť skôr, ako sa dostanú do režimu online. Na druhej strane, ak ste počuli tweet, je nepravdepodobné, že by ste ho vrátili, keby ste dostali viac informácií - a je oveľa menej problematické jednoducho naznačiť, že je zaradený do frontu na zverejnenie.

Offline aplikáciu nemôžete urobiť tak, aby dokázala všetko, čo online aplikácia môže, ale môžete to urobiť užitočným.

Navrhujte konflikty

Bez ohľadu na stratégiu, ktorú na zadnej strane používate na zosúladenie zmien, bude vaša aplikácia čeliť bodu, v ktorom máte dva navzájom si odporujúce údaje. Možno je to preto, že zlyhal server, alebo preto, že ste vy a iná osoba vykonali zmeny offline a teraz ich chcete synchronizovať. Všeličo sa mohlo stať!

Predvídajte teda konflikty a snažte sa ich vyriešiť predvídateľným spôsobom. Ponuka možností. A snažte sa v prvom rade vyhnúť konfliktom.

Predvídateľnosť znamená, že vaši používatelia vedia, čo sa môže stať. Ak môže dôjsť ku konfliktu, keď sú používatelia offline, keď vykonávajú úpravy na dvoch miestach, mali by na to byť upozornení, keď sú offline.

Ponuka možností znamená nielen jednoducho prijať posledný zápis alebo zreťaziť zmeny alebo vymazať najstaršiu kópiu. Znamená to nechať používateľa rozhodnúť sa, čo je vhodné.

Nakoniec je najlepším riešením nikdy nenechať konflikty na prvom mieste. Možno to znamená zostaviť aplikáciu tak, aby nové a podivné údaje z mnohých zdrojov neviedli ku konfliktu a namiesto toho sa zobrazovali presne tak, ako by ste chceli. To by mohlo byť ťažké urobiť v aplikácii na písanie, ktorá je online aj offline, ale zdieľanú aplikáciu na kreslenie je možné navrhnúť tak, aby do kresby pridávala nové cesty vždy, keď sa synchronizujú.

Buďte explicitný

Jedna vec je definovať, čo môže používateľ robiť offline. Ďalším problémom je dosiahnuť, aby tieto rozhodnutia boli pre vašich používateľov zrozumiteľné. Neúspech v úspešnej komunikácii o stave vašich údajov a pripojiteľnosti alebo dostupnosti daných funkcií sa rovná zlyhaniu pri vytváraní aplikácie typu offline prvá.

Problém ilustruje zdieľaná aplikácia na zaznamenávanie poznámok. Ak idete do režimu offline a čakáte, že spolupracovníci budú môcť pokračovať v úpravách aplikácie aj v neprítomnosti, nestačí iba umožniť používateľovi pokračovať v písaní, kým nebude spokojný. Keď sa znova pripoja, budú prekvapení vzniknutými konfliktmi.

Namiesto toho pomôžte používateľovi urobiť správne rozhodnutie. Ak vidíte, že vaše pripojenie k serveru bolo prerušené, pretože horná lišta vašej aplikácie mení farbu, viete, čo môže prísť: konflikty zlúčenia! To môže byť väčšinou v poriadku a užívateľské rozhranie vašej aplikácie môže pomôcť napraviť neočakávané konflikty, keď sa znova vrátite online. Ale ak stratíte pripojenie, keď vašu aplikáciu upravuje viac ľudí, nebolo by užitočné vedieť, že riziko konfliktov je oveľa väčšie? "Stratil si spojenie, ale iní upravovali." Pokračovanie v úpravách by mohlo spôsobiť konflikty. “ Používateľ môže pokračovať, ale pozná riziko.

Je ľahké písať donekonečna o problémoch a riešeniach v oblasti dizajnu, ale skôr ako sa dostaneme príliš ďaleko od nástrojov, ktoré budeme musieť použiť, mohlo by byť užitočné pochopiť, aké to je, vytvoriť mobilnú aplikáciu, ktorá bude prvá v režime offline.

Vytvorte si s Realm aplikáciu, ktorá je prvá v režime offline

Architektúra základnej aplikácie offline ako prvá nie je fantázia. Potrebujete spôsob, ako uchovať údaje v aplikácii (pomocou databázy v zariadení), protokol na komunikáciu so serverom (v prípade potreby vrátane kódu na serializáciu a deserializáciu) a server, na ktorom budú synchronizované údaje žiť, aby ich bolo možné distribuované každému, kto má povolenie.

Najprv vás prevediem tým, ako začať s mobilnou databázou Realm v aplikácii pre iOS (hoci by sa kód v aplikácii pre Android nevyzeral veľmi odlišne). Potom predstavím stratégiu na serializáciu a deserializáciu kódu, ktorý získate zo servera a ktorý uložíte do miestnej databázy Realm. Na záver vám ukážem, ako to všetko dosiahnuť spoločnou prácou v aplikácii úloh, ktorá sa synchronizuje v reálnom čase.

Realm Mobile Database

Začať s Realm je ľahké. Nainštalujete si Realm Mobile Database a potom definujete svoju schému vytvorením tried. Pretože Realm je objektová databáza, je to naozaj také jednoduché ako vytváranie tried, vytváranie inštancií niektorých objektov a odovzdávanie týchto objektov do a napíš blok, aby ste ich uchovali na disk. Nevyžaduje sa žiadna serializácia ani ORM, navyše sú rýchlejšie ako Core Data spoločnosti Apple.

Tu je jadro nášho modelu a najzákladnejšia možná aplikácia úloh (ktorú musíte prekompilovať zakaždým, keď chcete urobiť novú úlohu):

importovať RealmSwift

trieda Úloha: Objekt {

názov dynamickej var

}

trieda TaskList: Objekt {

nechať úlohy = Zoznam ()

}

let myTask = Task ()

myTask.task

nech myTaskList = TaskList ()

myTaskList.tasks.append (myTask)

nech realm = Realm ()

skús! realm.write {

realm.add ([myTask, myTaskList])

}

Od tejto chvíle už netreba veľa na to, aby ste vytvorili kompletnejšie funkčnú aplikáciu v okolí a TableViewController:

import UIKit

importovať RealmSwift

trieda TaskListTableViewController: UITableViewController {

var realm = vyskúšať! Ríša()

var taskList = TaskList ()

prepísať func viewDidLoad () {

super.viewDidLoad ()

tlač (Realm.Configuration.defaultConfiguration.fileURL!)

// Tu môžete nahradiť self.taskList predtým uloženým objektom TaskList

skús! realm.write {

realm.add (self.taskList)

       }

// pridať navbar +

navigationItem.setRightBarButton (UIBarButtonItem.init (barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector (displayTaskAlert)), animated: false)

   }

func displayTaskAlert () {

// vytvorí a zobrazí upozornenie, ktoré pomenuje meno a urobí úlohu.

let alert = UIAlertController (nadpis: „Vytvoriť úlohu“, správa: „Ako to chcete nazvať?“, preferovaný štýl: UIAlertControllerStyle.alert)

alert.addTextField (configurationHandler: nil)

alert.addAction (UIAlertAction (názov: „Zrušiť“, štýl: UIAlertActionStyle.cancel, obslužný program: nulový))

alert.addAction (UIAlertAction (nadpis: „Vytvoriť úlohu“, štýl: UIAlertActionStyle.default, obslužná rutina: {(akcia) v

let task = Task ()

task.name = (alert.textFields? [0] .text)!

skús! self.realm.write {

self.realm.add (úloha)

self.taskList.tasks.append (úloha)

           }

self.tableView.reloadData ()

       }))

self.present (výstraha, animovaný: true, dokončenie: nula)

   }

prepísať func didReceiveMemoryWarning () {

super.didReceiveMemoryWarning ()

   }

prepísať func numberOfSections (in tableView: UITableView) -> Int {

návrat 1

   }

prepísať func tableView (_ tableView: UITableView, numberOfRowsInSection časť: Int) -> Int {

vrátiť self.taskList.tasks.count

   }

prepísať func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell (withIdentifier: “reuseIdentifier”, pre: indexPath)

cell.textLabel? .text = self.taskList.tasks [indexPath.row] .name

návratová bunka

   }

}

To je všetko, čo potrebujete, aby ste mohli začať! Vďaka zbierkam a oznámeniam o objektoch spoločnosti Realm môžete byť oveľa chytrejší, takže inteligentne načítate ďalšie tableView keď je objekt pridaný alebo odstránený, ale zatiaľ máme vytrvalosť - základ prvej offline aplikácie.

Serializácia a deserializácia

Aplikácia prvá offline nie je príliš prvou aplikáciou offline, pokiaľ nemôže byť tiež online. Získavanie údajov do a zo sféry môže byť trochu zložité.

Najdôležitejšie je najskôr čo najlepšie zosúladenie schémy klienta so schémou servera. Vzhľadom na to, ako funguje väčšina databáz typu back-end, bude to pravdepodobne vyžadovať pridanie poľa primárneho kľúča do vašej triedy Realm, pretože objekty Realm predvolene primárny kľúč nemajú.

Akonáhle budete mať svoju schému dobre zosúladenú, potrebujete spôsob, ako deserializovať údaje prichádzajúce zo servera do Realmu a serializovať údaje do JSON a odoslať ich späť na server. Najjednoduchšou metódou je vybrať si svoju obľúbenú knižnicu mapovania modelov a nechať ju vykonávať ťažké práce. Swift má Argo, Decodable, ObjectMapper a Mapper. Teraz, keď dostanete odpoveď od svojho servera, jednoducho necháte mapovač modelu dekódovať ju do natívneho RealmObject.

Stále to však nie je také skvelé riešenie. Stále musíte napísať kopu sieťového kódu, aby ste bezpečne dostali JSON na server a zo servera, a váš model mapovacieho kódu bude potom, keď sa zmení vaša schéma, potrebovať prepisovanie a ladenie. Mala by existovať lepšia cesta a myslíme si, že Realm Mobile Platform je presne taká.

Práca s mobilnou platformou Realm

Realm Mobile Platform (RMP) vám poskytuje synchronizáciu v reálnom čase, aby ste sa mohli sústrediť na vytváranie mobilných aplikácií a nebojovať o to, aby server a aplikácia hovorili. Jednoducho si vezmete svoj model Realm vyššie, pridáte autentifikáciu používateľa RMP a necháte RMP postarať sa o synchronizáciu dát medzi serverom a oblasťami vašej aplikácie. Potom jednoducho pokračujete v práci s natívnymi objektmi Swift.

Ak chcete začať, stiahnite si a nainštalujte balík Realm Mobile Platform MacOS, ktorý vám umožní skutočne rýchlo inštanciu servera Realm Object Server spustiť na vašom počítači Mac. Potom pridáme niekoľko položiek do našej aplikácie zoznam úloh, aby sme sa pripojili k Realm Object Server.

Po dokončení pokynov na inštaláciu uvedených vyššie by ste mali mať server spustený a používateľa správcu na adrese //127.0.0.1:9080. Zapamätajte si tieto poverenia a my sa vrátime k nášmu kódu Swift.

Predtým, ako napíšeme ďalší kód, musíme v projekte urobiť dve drobné zmeny. Najskôr musíme prejsť do cieľového editora našej aplikácie v Xcode a na karte Možnosti povoliť prepínač Zdieľanie kľúčeniek.

Potom budeme musieť povoliť sieťové požiadavky, ktoré nie sú TLS. Prejdite do súboru Info.plist projektu a do priečinka tagy:

NSAppTransportSecurity

NSAllowsArbitraryLoads

   

$config[zx-auto] not found$config[zx-overlay] not found