Programavimas

Kurkite pirmąsias neprisijungus pasiekiamas programas mobiliesiems be skausmo

Aleksandras Stigsenas yra vienas iš „Realm“ įkūrėjų ir generalinis direktorius.

Visuotinai pripažinta tiesa, kad išmanųjį telefoną turintis vartotojas turi norėti geresnio ryšio. Nepaisant milijardų dolerių investicijų į infrastruktūrą ir negailestingų technologinių naujovių, norint pastebėti esminę sujungtos eros tikrovę nereikia daug daugiau nei trumpo kelio: negalima manyti, kad tinklo ryšys bus prieinamas kiekvieną kartą, kai to norite. Kaip mobiliojo ryšio kūrėjai, tai tiesa, kurios patogu ignoruoti.

Programų neprisijungus veikiančias būsenas gali būti sunku valdyti, tačiau problema prasideda nuo pagrindinės ir neteisingos prielaidos - kad neprisijungus pagal numatytuosius nustatymus yra klaidos būsena. Tai buvo prasminga, kai kūrėme programas staliniams kompiuteriams su tam skirtais „Ethernet“ ryšiais. Nėra prasmės, kai uždarius lifto duris programa tampa visiškai nenaudinga, arba kai yra tikslinga tikėtis, kad jūsų programa bus naudojama vietose, kuriose nėra patikimos korinio ryšio infrastruktūros.

Mes negalime uždengti pasaulio aprėpties, todėl turime pasiūlyti alternatyvą. Pirmiausia turime galvoti neprisijungę. Turime sukurti programas, kad jos būtų naudingos neprisijungus. Turime kurti programas, kurios visapusiškai išnaudoja internetą, kai jis yra prieinamas, tačiau suprantame, kad prieiga prie interneto visada yra laikina. Turime priimti protingus dizaino sprendimus, susijusius su neprisijungus veikiančiomis būsenomis, ir padaryti tas neprisijungus veikiančias valstybes suprantamas vartotojams.

Apibrėžta ateitis, neprisijungus. „Realm“, įmonė, kurioje aš dirbu, kurį laiką kūrė realaus laiko platformą, skirtą pirmosioms mobiliesiems programoms. Mūsų mobilioji duomenų bazė ir „Realm Mobile“ platforma leidžia lengvai kurti pažangias, pirmiausia neprisijungus veikiančias programas beveik bet kuriame mobiliajame įrenginyje. „A List Apart“ žmonės nepaprastai prisidėjo prie literatūros neprisijungus, ypač žiniatinklio programoms. Pagrindinių mobiliųjų ekosistemų kūrėjų bendruomenės daug valandų praleido siūlydamos įspūdingus savo atvirojo kodo sprendimus.

Toliau pateikiama trumpa įžanga apie tai, kaip galite sukurti pirmąją mobiliesiems skirtą programą. Pabaigoje pasitelksiu paprastą „Swift“ pavyzdinį kodą, kad parodyčiau, kaip atrodo minimali programa, skirta pirmiausia neprisijungus, tačiau čia siūlomi principai ir problemos yra aktualios visiems, dirbantiems programų mobiliesiems kūrime.

Dizainas, skirtas pirmiausia neprisijungus

Prieš kurdami „offline“ programą, kurios visada norėjote, turime iš naujo peržiūrėti dizaino sprendimus, kurie buvo prasmingi staliniams kompiuteriams, turintiems labai didelę tikimybę, kad jie bus prisijungę. Jei jūsų programa gali valdyti būsenas neprisijungus ir internetu, turime klausimų, į kuriuos reikia atsakyti, ką ji gali padaryti ir kaip vartotojui parodome, kas įmanoma.

Apibrėžkite, kas įmanoma neprisijungus

Paimkime pavyzdžiu „Twitter“. Jei esate neprisijungęs ir paskelbiate „Twitter“, „Twitter“ klientas, neprisijungęs prie interneto, gali pasirinkti du kelius. Jis gali įrašyti tvitą į eilę, kol atgaus ryšį. Arba ji gali atsisakyti leisti jums tweetuoti, net jei tai leidžia eilėje atlikti kitus veiksmus, pvz., „Faves“, kaip tai daro „Tweetbot“.

Kodėl „Tweetbot“ sutrukdytų jums „Twitter“ rašyti neprisijungus? Gal todėl, kad kol vėl prisijungsite, jūsų tweetai gali būti nebeaktualūs. Jei išspręsite šią problemą, reikės sukurti naują vartotojo sąsają „Twitter“ sąrašui, kurio dar nepaskelbėte, bet kurį gali tekti redaguoti arba ištrinti, kol jie bus prisijungę. Kita vertus, jei jums nepatiko tweetas, vargu ar jį anuliuotumėte, jei susidurtumėte su daugiau informacijos - ir daug mažiau problemiška paprasčiausiai nurodyti, kad jis yra eilėje dėl paskelbimo.

Negalite priversti programos neprisijungus padaryti visko, ką gali internetinė programa, tačiau galite padaryti ją naudingą.

Supraskite konfliktus

Nepriklausomai nuo strategijos, kurią naudojate gale suderindami pakeitimus, jūsų programa susidurs su ta vieta, kur turite du nesuderinamus duomenis. Galbūt todėl, kad sugedo serveris, arba todėl, kad jūs ir kitas asmuo atlikote pakeitimus neprisijungę ir dabar norite juos sinchronizuoti. Bet kas gali atsitikti!

Taigi, numatykite konfliktus ir stenkitės juos spręsti nuspėjamu būdu. Pasiūlymų pasirinkimas. Ir visų pirma pasistenkite išvengti konfliktų.

Būdamas nuspėjamas reiškia, kad jūsų vartotojai žino, kas gali atsitikti. Jei gali kilti konfliktas, kai vartotojai redaguojasi dviejose vietose vienu metu, kai yra neprisijungę, jie turėtų būti apie tai įspėti, kai yra neprisijungę.

Siūlyti pasirinkimus reiškia ne tik priimti paskutinį rašymą ar sutvarkyti pakeitimus ar ištrinti seniausią kopiją. Tai reiškia leisti vartotojui nuspręsti, kas tinka.

Galiausiai geriausias sprendimas yra niekada neleisti konfliktams vystytis. Galbūt tai reiškia kurti savo programą taip, kad nauji ir keisti duomenys iš daugelio šaltinių nesukeltų konflikto ir būtų rodomi tiksliai taip, kaip norėtumėte. Tai gali būti sunku padaryti rašymo programoje, kuri veikia internete ir neprisijungus, tačiau gali būti sukurta bendroji piešimo programa, kuri pridėtų naujų kelių prie piešinio, kai tik jie bus sinchronizuojami.

Būk aiškus

Vienas dalykas yra apibrėžti, ką vartotojas gali atlikti neprisijungęs. Visai kita problema yra tų sprendimų supratimas vartotojams. Nepavykus sėkmingai pranešti apie savo duomenų būseną ir ryšį ar galimybę naudotis tam tikromis funkcijomis, prilygsta nesėkmei pirmiausia sukūrus programą „Neprisijungus“.

Bendra užrašų programėlė iliustruoja problemą. Jei esate neprisijungę, bet tikitės, kad bendradarbiai tęs jūsų redagavimą programoje, kai jūsų nėra, nepakanka paprasčiausiai leisti vartotojui toliau rašyti, kol jis bus patenkintas. Kai jie vėl prisijungs, juos nustebins išsivystę konfliktai.

Vietoj to padėkite savo vartotojui priimti teisingą sprendimą. Jei matote, kad jūsų serverio ryšys nutrūko, nes jūsų programos viršutinė juosta keičia spalvą, žinote, kas gali atsirasti: sujunkite konfliktus! Tai dažniausiai gali būti gerai, o jūsų programos vartotojo sąsaja gali padėti ištaisyti netikėtus konfliktus, kai grįšite į internetą. Bet jei prarandate ryšį, kai jūsų programą redaguoja keli žmonės, ar nebūtų naudinga žinoti, kad konfliktų rizika yra daug didesnė? „Jūs praradote ryšį, bet kiti redagavo. Tolesnis redagavimas gali sukelti konfliktų “. Vartotojas gali tęsti, bet žino riziką.

Lengva be galo rašyti apie dizaino problemas ir sprendimus, tačiau prieš tai, kai per daug nutolstame nuo įrankių, kuriuos turėsime naudoti, gali būti naudinga sužinoti, kaip yra sukurti mobiliąją programą, skirtą pirmiausia neprisijungus.

Sukurkite pirmąją programą neprisijungę naudodami „Realm“

Pagrindinės programos, veikiančios neprisijungus, architektūra nėra išgalvota. Jums reikalingas būdas išsaugoti duomenis programoje (naudojant įrenginyje esančią duomenų bazę), protokolas, skirtas bendrauti su serveriu (įskaitant serijos ir deserializacijos kodą, jei reikia) ir serveris, kuriame bus sinchronizuoti duomenys, kad juos būtų galima išdalinta tam, kas turi leidimą.

Pirmiausia aš jums paaiškinsiu, kaip pradėti naudotis „Realm Mobile Database“ „iOS“ programoje (nors „Android“ programoje kodas neatrodys labai skirtingas). Tada pateiksiu kodo, kurį gaunate iš serverio ir saugote savo vietinėje „Realm“ duomenų bazėje, nuoseklinimo ir deserializavimo strategiją. Galiausiai aš jums parodysiu, kaip pasiekti, kad visa tai veiktų realiuoju laiku sinchronizuojamoje bendrų darbų sąrašo programoje.

„Realm Mobile“ duomenų bazė

Su „Realm“ lengva pradėti. Įdiekite „Realm Mobile Database“, tada nustatykite savo schemą kurdami klases. Kadangi „Realm“ yra objektų duomenų bazė, tai iš tikrųjų taip paprasta, kaip klasių sudarymas, kai kurių objektų eksponavimas ir tų objektų perdavimas į rašyti blokuoti, kad jie išliktų diske. Nereikia serializavimo ar ORM, be to, tai greitesnė nei pagrindiniai „Apple“ duomenys.

Čia yra mūsų modelio esmė ir paprasčiausia įmanomų darbų sąrašo programa (kurią turėtumėte sukompiliuoti kiekvieną kartą, kai norite atlikti naują užduotį):

importuoti „RealmSwift“

klasės užduotis: objektas {

dinaminis var vardas

}

class TaskList: Object {

tegul užduotys = sąrašas ()

}

tegul myTask = Užduotis ()

„myTask.task“

tegul myTaskList = TaskList ()

„myTaskList.tasks.append“ („myTask“)

tegul karalystė = karalystė ()

bandyti! realm.write {

realm.add ([myTask, myTaskList])

}

Taigi, norint sukurti labiau funkcionalią programą aplink a, nereikia daug „TableViewController“:

importuoti UIKit

importuoti „RealmSwift“

class TaskListTableViewController: UITableViewController {

var karalystė = pabandyk! Karalystė ()

var taskList = TaskList ()

nepaisyti func viewDidLoad () {

super.viewDidLoad ()

spausdinti (Realm.Configuration.defaultConfiguration.fileURL!)

// Čia galite pakeisti „self.taskList“ anksčiau išsaugotu „TaskList“ objektu

bandyti! realm.write {

realm.add (self.taskList)

       }

// pridėti naršymo juostą +

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

   }

func displayTaskAlert () {

// padarykite ir parodykite įspėjimą, kuris pavadins pavadinimą ir atliks užduotį.

tegul įspėjimas = UIAlertController (pavadinimas: „Padaryti užduotį“, pranešimas: „Kaip tu nori tai pavadinti?“, „PreferStyle“: UIAlertControllerStyle.alert)

alert.addTextField (configurationHandler: nulis)

alert.addAction (UIAlertAction (pavadinimas: „Atšaukti“, stilius: UIAlertActionStyle.cancel, tvarkytuvas: nulis))

alert.addAction (UIAlertAction (pavadinimas: „Sukurti užduotį“, stilius: UIAlertActionStyle.default, tvarkytuvas: {(veiksmas) in

tegul užduotis = Užduotis ()

task.name = (perspėjimo.teksto laukai? [0] .tekstas)!

bandyti! self.realm.write {

self.realm.add (task)

self.taskList.tasks.append (task)

           }

self.tableView.reloadData ()

       }))

pats. esamas (perspėjimas, animacinis: tiesa, užbaigimas: nulis)

   }

nepaisyti func didReceiveMemoryWarning () {

super.didReceiveMemoryWarning ()

   }

nepaisyti func numberOfSections (tableView: UITableView) -> Int {

grįžti 1

   }

nepaisyti func tableView (_ tableView: UITableView, numberOfRowsInSection skyrius: Int) -> Int {

grąžinti self.taskList.tasks.count

   }

nepaisyti func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

tegul langelis = tableView.dequeueReusableCell (withIdentifier: „reuseIdentifier“, skirtas: indexPath)

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

grįžtamoji ląstelė

   }

}

Viskas, ko reikia norint pradėti! Galite gauti daug protingesnio naudodami „Realm“ kolekcijos ir objektų pranešimus, todėl galite protingai iš naujo įkelti tableView kai objektas pridedamas arba ištrinamas, bet kol kas turime atkaklumą - programos, kuri veikia neprisijungus, pagrindas.

Serializavimas ir deserializavimas

„Pirmiausia neprisijungus“ veikianti programa nėra svarbiausia „neprisijungus“ programa, nebent ji taip pat gali prisijungti prie interneto, o duomenų gavimas į „Realm“ ir iš jos gali būti šiek tiek keblus.

Visų pirma, labai svarbu suderinti kliento schemą su savo serverio schema. Atsižvelgiant į tai, kaip veikia dauguma vidinių duomenų bazių, greičiausiai teks įtraukti pirminio rakto lauką į savo „Realm“ klasę, nes „Realm“ objektai pagal numatytuosius nustatymus neturi pagrindinio rakto.

Kai jūsų schema bus gerai suderinta, jums reikės būdų, kaip panaikinti duomenų, gaunamų iš serverio į „Realm“, duomenis ir susisteminti duomenis į „JSON“, kad juos būtų galima siųsti atgal į serverį. Lengviausias būdas tai padaryti yra pasirinkti mėgstamą modelių žemėlapių biblioteką ir leisti jai sunkiai pakelti. „Swift“ turi „Argo“, „Decodable“, „ObjectMapper“ ir „Mapper“. Dabar, kai gausite atsakymą iš savo serverio, paprasčiausiai leiskite modelio žemėlapiui iššifruoti jį į vietinį „RealmObject“.

Vis dėlto tai nėra toks puikus sprendimas. Vis tiek turite parašyti daugybę tinklo kodų, kad JSON pirmiausia patektų į jūsų serverį ir iš jo, o modelio žemėlapio kodą reikės perrašyti ir derinti, kai tik pasikeis schema. Turėtų būti geresnis būdas, ir mes manome, kad „Realm Mobile Platform“ yra būtent tokia.

Darbas su „Realm Mobile Platform“

„Realm Mobile Platform“ (RMP) suteikia jums sinchronizavimą realiuoju laiku, kad galėtumėte sutelkti dėmesį į mobiliosios programos kūrimą, o ne kovą, kad serveris ir programa būtų kalbama. Paprasčiausiai paimkite aukščiau nurodytą „Realm“ modelį, pridėkite RMP vartotojo autentifikavimą ir leiskite RMP rūpintis duomenų sinchronizavimu tarp serverio ir jūsų programos srities. Tada jūs tiesiog toliau dirbate su vietiniais „Swift“ objektais.

Norėdami pradėti, atsisiųskite ir įdiekite „Realm Mobile Platform MacOS“ paketą, kuris leidžia jums greitai pasiekti „Realm Object Server“ egzempliorių „Mac“. Tada mes pridėsime keletą elementų prie savo darbų sąrašo programos, kad ji prisijungtų prie „Realm Object Server“.

Vykdę aukščiau pateiktas diegimo instrukcijas, turėtumėte paleisti serverį ir administratoriaus vartotoją šiuo adresu: //127.0.0.1:9080. Prisiminkite tuos kredencialus ir mes grįšime prie „Swift“ kodo.

Prieš rašydami daugiau kodo, turime atlikti du mažus projekto pakeitimus. Pirmiausia turime pereiti į savo programos tikslinį redaktorių „Xcode“, o skirtuke „Galimybės“ įgalinkite raktų pakabuko bendrinimo jungiklį.

Tada turėsime leisti ne TLS tinklo užklausas. Eikite į projekto „Info.plist“ failą ir į jį įtraukite: žymos:

NSAppTransportSecurity

NSAllowsArbitraryLoads

   

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