Programiranje

Brez težav ustvarjajte mobilne aplikacije, ki so prvič brez povezave

Alexander Stigsen je soustanovitelj in izvršni direktor podjetja Realm.

Resnica je splošno priznana, da mora imeti uporabnik pametni telefon boljše povezave. Kljub milijardam dolarjev naložb v infrastrukturo in neizprosnim tehnološkim inovacijam ni treba več kot le kratko vožnjo, da opazite bistveno resničnost povezane dobe: ne morete domnevati, da bo omrežna povezava na voljo vsakič, ko jo želite. Kot mobilni razvijalci je resnico, ki jo je priročno prezreti.

Stanja brez povezave v aplikacijah je lahko zmedeno, vendar se težava začne z osnovno in napačno domnevo - da je brez povezave privzeto stanje napake. To je bilo smiselno, ko smo izdelali aplikacije za namizne računalnike z namenskimi povezavami do etherneta. Ni smiselno, kadar zaprtje vrat dvigala povzroči, da je aplikacija popolnoma neuporabna ali ko je smiselno pričakovati, da bo vaša aplikacija uporabljena tam, kjer primanjkuje zanesljive celične infrastrukture.

Ne moremo pokrivati ​​sveta s pokritostjo, zato moramo ponuditi alternativo. Najprej moramo razmišljati brez povezave. Aplikacije moramo oblikovati tako, da bodo uporabne brez povezave. Izdelati moramo aplikacije, ki v celoti izkoristijo internet, ko je na voljo, vendar razumemo, da je dostop do interneta vedno začasen. Sprejeti moramo pametne odločitve o oblikovanju, ki vključujejo stanja brez povezave, in uporabnikom omogočiti, da so ta stanja brez povezave razumljiva.

Veliko dela je namenjenega opredelitvi prihodnosti brez povezave. Podjetje Realm, v katerem delam, že nekaj časa gradi realnočasno platformo za mobilne aplikacije, ki niso prve. Naša mobilna baza podatkov in mobilna platforma Realm omogočata enostavno ustvarjanje inteligentnih aplikacij, ki so prvič brez povezave, na skoraj vseh mobilnih napravah. Ljudje iz A List Apart so ogromno prispevali k literaturi, ki je bila objavljena brez povezave, zlasti za spletne aplikacije. In skupnosti razvijalcev glavnih mobilnih ekosistemov so veliko ur ponujale impresivne lastne odprtokodne rešitve.

Sledi kratek uvod v to, kako lahko ustvarite mobilno aplikacijo, ki ni prva brez povezave. Proti koncu bom pripravil nekaj preproste vzorčne kode Swift, da pokažem, kako izgleda minimalna aplikacija brez povezave, toda načela in težave, ki jih ponujamo tukaj, so pomembne za vse, ki delajo v razvoju mobilnih aplikacij.

Oblikujte za uporabo brez povezave

Preden zgradite aplikacijo, ki je bila prva brez povezave, ki ste si jo vedno želeli, moramo ponovno preučiti oblikovalske rešitve, ki so bile smiselne za namizja z zelo veliko verjetnostjo, da bodo v spletu. Če lahko vaša aplikacija obravnava stanja brez povezave in v spletu, imamo vprašanja, na katera lahko odgovorimo in kako uporabniku pokažemo, kaj je mogoče.

Določite, kaj je mogoče brez povezave

Za primer vzemimo Twitter. Če ste brez povezave in objavite tweet, lahko odjemalec Twitter, ki nima prve povezave, vzame dve poti. Tvit bi lahko čakal v čakalni vrsti, dokler ne znova vzpostavi povezave. Ali pa vam lahko zavrne tweet - tudi če vam omogoča čakanje na druga dejanja, kot so priljubljene, kot to počne Tweetbot.

Zakaj bi vam Tweetbot preprečil, da bi tweetali brez povezave? Morda zato, ker ko se vrnete v splet, vaši tviti morda ne bodo več ustrezni. Reševanje te težave bi vključevalo ustvarjanje novega uporabniškega vmesnika za seznam tweetov, ki jih še niste objavili, vendar jih boste morda morali urediti ali izbrisati, preden se povežejo v splet. Če ste slišali tweet, pa ga verjetno ne bi razveljavili, če bi se soočili z več informacijami - in veliko manj problematično preprosto navesti, da je v čakalni vrsti za objavo.

Ne morete narediti, da aplikacija brez povezave počne vse, kar lahko spletna aplikacija, lahko pa jo naredite koristno.

Oblikujte konflikte stran

Ne glede na strategijo, ki jo uporabljate na zadnji strani za usklajevanje sprememb, se bo vaša aplikacija soočila s točko, ko imate dva nasprotujoča si si podatka. Mogoče zato, ker se je strežnik zrušil ali ker ste vi in ​​druga oseba naredili spremembe brez povezave in jih zdaj želite sinhronizirati. Karkoli se lahko zgodi!

Tako predvidevajte konflikte in si jih prizadevajte rešiti na predvidljiv način. Ponudba izbire. In se najprej poskusite izogniti konfliktom.

Predvidljivost pomeni, da uporabniki vedo, kaj se lahko zgodi. Če lahko pride do konflikta, ko uporabniki urejajo na dveh mestih hkrati, ko nimajo povezave, jih je treba na to opozoriti, ko nimajo povezave.

Ponudba možnosti pomeni, da ne sprejmete samo zadnjega pisanja, združite sprememb ali izbrišete najstarejšo kopijo. Pomeni, da se uporabnik odloči, kaj je primerno.

Nazadnje, najboljša rešitev je, da nikoli ne dovolimo, da se konflikti sploh razvijejo. Morda to pomeni, da svojo aplikacijo sestavite tako, da novi in ​​čudni podatki iz številnih virov ne vodijo do konflikta in se prikazujejo točno tako, kot bi si želeli. To je težko storiti v pisalni aplikaciji, ki deluje v spletu in zunaj nje, vendar je mogoče skupno aplikacijo za risanje zgraditi tako, da risbi doda nove poti, kadar koli se sinhronizira.

Bodite eksplicitni

Ena stvar je določiti, kaj lahko uporabnik počne brez povezave. Popolnoma druga težava je, da so te odločitve razumljive vašim uporabnikom. Neuspešno sporočanje stanja vaših podatkov in povezljivosti ali razpoložljivost danih funkcij je enakovredno neuspehu, če ste najprej zgradili aplikacijo, ki ni prva v načinu brez povezave.

Težavo ponazarja skupna aplikacija za zapiske. Če greste brez povezave, vendar pričakujete, da bodo sodelavci še naprej urejali aplikacijo v vaši odsotnosti, ni dovolj, da preprosto dovolite uporabniku, da še naprej tipka, dokler ni zadovoljen. Ko se znova povežejo, jih bodo presenetili konflikti, ki so se razvili.

Namesto tega pomagajte uporabniku, da se pravilno odloči. Če vidite, da je bila povezava s strežnikom prekinjena, ker zgornja vrstica vaše aplikacije spreminja barvo, veste, kaj bi lahko prišlo: spoji spoji! To je lahko večino časa v redu in uporabniški vmesnik aplikacije lahko pomaga pri odpravljanju nepričakovanih sporov, ko se vrnete v splet. Toda če izgubite povezavo, ko več ljudi ureja vašo aplikacijo, ne bi bilo koristno vedeti, da je tveganje za konflikte veliko večje? »Izgubili ste povezavo, drugi pa so urejali. Če nadaljujete z urejanjem, lahko pride do konfliktov. " Uporabnik lahko nadaljuje, vendar pozna tveganje.

Preprosto je neskončno pisati o oblikovalskih težavah in rešitvah, toda preden se preveč oddaljimo od orodij, ki jih bomo morali uporabiti, bi bilo morda koristno ugotoviti, kako je zgraditi mobilno aplikacijo, ki ni prva brez povezave.

Z Realm ustvarite aplikacijo, ki je prva brez povezave

Arhitektura osnovne aplikacije, ki je prva brez povezave, ni modna. Potrebujete način za ohranitev podatkov v aplikaciji (z uporabo zbirke podatkov v napravi), protokol za komunikacijo s strežnikom (vključno s kodo za serializacijo in deserializacijo, če je potrebno) in strežnik, na katerem bodo sinhronizirani podatki v živo, da jih bo mogoče razdeljeno tistemu, ki ima dovoljenje.

Najprej vam bom predstavil, kako začeti z Realm Mobile Database v aplikaciji za iOS (čeprav koda v aplikaciji za Android ne bi bila videti drugače). Nato bom predstavil strategijo za serializacijo in deserializacijo kode, ki jo dobite s strežnika in shranite v svojo lokalno bazo podatkov Realm. Na koncu vam bom pokazal, kako lahko vse skupaj združite v skupni aplikaciji s seznami opravil, ki se sinhronizira v realnem času.

Realm Mobile Database

Z Realmom je enostavno začeti. Namestite Realm Mobile Database, nato pa določite svojo shemo z izdelavo razredov. Ker je Realm baza podatkov predmetov, je v resnici tako preprosto, kot je ustvarjanje razredov, instanciranje nekaterih predmetov in posredovanje teh predmetov v piši blok, da jih vztraja na disku. Serializacija ali ORM ni potrebna, poleg tega pa je hitrejša od Appleovih osnovnih podatkov.

Tu je jedro našega modela in najosnovnejša možna aplikacija s seznamom opravil (ki bi jo morali znova sestaviti vsakič, ko bi želeli narediti novo nalogo):

uvozi RealmSwift

razred Naloga: Predmet {

dinamično ime var

}

class TaskList: Object {

naj opravila = Seznam ()

}

naj myTask = Naloga ()

myTask.task

let myTaskList = TaskList ()

myTaskList.tasks.append (myTask)

naj območje = Področje ()

poskusite! realm.write {

realm.add ([myTask, myTaskList])

}

Od tam naprej ni treba veliko ustvariti bolj funkcionalne aplikacije okoli a TableViewController:

uvoz UIKit

uvozi RealmSwift

razred TaskListTableViewController: UITableViewController {

var realm = poskusite! Področje ()

var taskList = TaskList ()

preglasi funkc viewDidLoad () {

super.viewDidLoad ()

tiskanje (Realm.Configuration.defaultConfiguration.fileURL!)

// Tukaj lahko self.taskList nadomestite s predhodno shranjenim objektom TaskList

poskusite! realm.write {

realm.add (self.taskList)

       }

// dodaj navbar +

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

   }

func displayTaskAlert () {

// ustvari in prikaže opozorilo, ki bo prevzelo ime in opravilo.

let alert = UIAlertController (naslov: »Naredite opravilo«, sporočilo: »Kako ga želite poklicati?«, preferStyle: UIAlertControllerStyle.alert)

alert.addTextField (configurationHandler: nil)

alert.addAction (UIAlertAction (naslov: »Prekliči«, slog: UIAlertActionStyle.cancel, vodnik: nič))

alert.addAction (UIAlertAction (naslov: “Ustvari nalogo”, slog: UIAlertActionStyle.default, vodnik: {(dejanje) v

naj naloga = Naloga ()

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

poskusite! self.realm.write {

self.realm.add (naloga)

self.taskList.tasks.append (naloga)

           }

self.tableView.reloadData ()

       }))

self.present (opozorilo, animirano: res, zaključek: nič)

   }

preglasi funkc didReceiveMemoryWarning () {

super.didReceiveMemoryWarning ()

   }

preglasi funkc numberOfSections (v tableView: UITableView) -> Int {

vrnitev 1

   }

preglasiti func tableView (_ tableView: UITableView, numberOfRowsInSection razdelek: Int) -> Int {

vrni self.taskList.tasks.count

   }

preglasiti funkc tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

naj celica = tableView.dequeueReusableCell (withIdentifier: “reuseIdentifier”, za: indexPath)

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

povratna celica

   }

}

To je vse, kar potrebujete za začetek! Z obvestili o zbiranju in predmetih Realm lahko postanete bistrejši, zato lahko pametno znova naložite tableView ko je objekt dodan ali izbrisan, zaenkrat pa imamo vztrajnost - temelj aplikacije, ki ni povezana s spletom.

Serializacija in deserializacija

Aplikacija, ki ne uporablja prve povezave, ni velika aplikacija, ki ne uporablja prve povezave, razen če lahko tudi vzpostavi povezavo in pridobivanje podatkov v Realm in iz njega je lahko nekoliko zapleteno.

Najprej je ključnega pomena, da se odjemalska shema ujema s shemo vašega strežnika. Glede na to, kako deluje večina zalednih baz podatkov, bo to verjetno vključevalo dodajanje polja primarnega ključa v vaš razred Realm, saj predmeti Realm privzeto nimajo primarnega ključa.

Ko se vaša shema dobro ujema, potrebujete način za deserializacijo podatkov, ki prihajajo s strežnika, v Realm in za serializacijo podatkov v JSON za pošiljanje nazaj na strežnik. To najlažje naredite tako, da izberete svojo najljubšo knjižnico za preslikavo modelov in jo pustite dvigniti. Swift ima Argo, Decodable, ObjectMapper in Mapper. Zdaj, ko od strežnika prejmete odgovor, preprosto pustite, da ga preslikava modela dekodira v domači RealmObject.

Kljub temu ni tako dobra rešitev. Še vedno morate napisati tono mrežne kode, da boste JSON najprej varno pripeljali na strežnik in z njega. Koda za preslikavo vašega modela bo zahtevala ponovno pisanje in odpravljanje napak, kadar koli se spremeni vaša shema. Moral bi obstajati boljši način in mislimo, da je Realm Mobile Platform točno to.

Delo z mobilno platformo Realm

Realm Mobile Platform (RMP) vam omogoča sinhronizacijo v realnem času, tako da se lahko osredotočite na izdelavo mobilne aplikacije in se ne borite, da bi strežnik in aplikacija govorili. Preprosto vzamete zgornji model Realm, dodate preverjanje pristnosti uporabnika RMP in pustite, da RMP poskrbi za sinhronizacijo podatkov med strežnikom in področji vaše aplikacije. Potem preprosto nadaljujete z delom z naravnimi predmeti Swift.

Če želite začeti, prenesite in namestite sveženj Realm Mobile Platform MacOS, ki vam omogoča, da primerek strežnika Realm Object Server na vašem Macu zares hitro zaženete. Nato bomo v našo aplikacijo s seznamom opravil dodali nekaj elementov, da se bo lahko povezal s strežnikom Realm Object.

Ko končate z zgornjimi navodili za namestitev, naj bo strežnik zagnan in uporabnik skrbnika na //127.0.0.1:9080. Zapomnite si te poverilnice in vrnili se bomo k naši Swift kodi.

Preden napišemo še kodo, moramo v projektu narediti dve majhni spremembi. Najprej moramo v Xcode odpreti ciljni urejevalnik naše aplikacije in na zavihku Zmogljivosti omogočiti stikalo Skupna raba ključa.

Nato bomo morali dovoliti omrežne zahteve, ki niso TLS. Pojdite na datoteko Info.plist projekta in dodajte naslednje v datoteko oznake:

NSAppTransportSecurity

NSAllowsArbitraryLoads

   

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