Programmēšana

Veidojiet bezsaistē pirmās mobilās lietotnes bez sāpēm

Aleksandrs Stigsens ir Realm līdzdibinātājs un izpilddirektors.

Tā ir vispāratzīta patiesība, ka lietotājam, kuram ir viedtālrunis, ir jāgrib labāks savienojums. Neskatoties uz miljardiem dolāru ieguldījumiem infrastruktūrā un nerimstošajiem tehnoloģiskajiem jauninājumiem, lai pamanītu saistītā laikmeta būtisko realitāti, nav vajadzīgs daudz vairāk nekā īss brauciens: jūs nevarat pieņemt, ka tīkla savienojums būs pieejams katru reizi, kad vēlaties. Kā mobilo ierīču izstrādātāji tā ir patiesība, kuru ir ērti ignorēt.

Bezsaistes stāvokļi lietotnēs var būt apgrūtinoši, taču problēma sākas ar pamata un nepareizu pieņēmumu - ka bezsaistē pēc noklusējuma ir kļūdas stāvoklis. Tam bija jēga, kad mēs izveidojām lietotnes galddatoriem ar īpašu Ethernet augšupsaiti. Nav jēgas, ja, aizverot lifta durvis, lietotne kļūst pilnīgi nederīga vai ja ir pamats sagaidīt, ka jūsu lietojumprogramma tiks izmantota vietās, kur trūkst uzticamas mobilās infrastruktūras.

Mēs nevaram aptvert pasauli, tāpēc mums jāpiedāvā alternatīva. Mums vispirms jādomā bezsaistē. Mums ir jāizstrādā lietotnes, lai tās būtu noderīgas bezsaistē. Mums jāveido lietotnes, kas pilnībā izmanto internetu, kad tas ir pieejams, taču saprotam, ka piekļuve internetam vienmēr ir īslaicīga. Mums jāpieņem gudri dizaina lēmumi, iesaistot bezsaistes valstis, un šīs bezsaistes valstis jāpadara lietotājiem saprotamas.

Tiek darīts daudz darba, lai noteiktu nākotni bezsaistē. Uzņēmums Realm, kurā es strādāju, jau kādu laiku ir izveidojis reāllaika platformu mobilajām lietotnēm, kas ir pirmās bezsaistē. Mūsu mobilā datu bāze un Realm Mobile platforma ļauj viegli izveidot viedas, bezsaistes lietotnes gandrīz jebkurā mobilajā ierīcē. A List Apart ļaudis ir devuši milzīgu ieguldījumu bezsaistes literatūrā, īpaši tīmekļa lietotnēs. Un galveno mobilo ekosistēmu izstrādātāju kopienas ir pavadījušas daudzas stundas, piedāvājot iespaidīgus savus atvērtā pirmkoda risinājumus.

Tālāk ir sniegts īss ievads par to, kā izveidot mobilo lietotni bezsaistē. Uz beigām es izmantošu vienkāršu Swift parauga kodu, lai parādītu, kā izskatās minimāla bezsaistes lietotne, taču šeit piedāvātie principi un problēmas ir būtiskas ikvienam, kurš strādā mobilo lietotņu izstrādē.

Dizains vispirms bezsaistē

Pirms izveidojat bezsaistes lietotni, kuru vienmēr esat vēlējies, mums ir atkārtoti jāpārskata dizaina risinājumi, kas bija lietderīgi galddatoriem ar ļoti lielu varbūtību būt tiešsaistē. Ja jūsu lietotne spēj darboties bezsaistes un tiešsaistes režīmos, mums ir jāatbild uz jautājumiem par to, ko tā var darīt, un kā mēs parādām lietotājam to, kas ir iespējams.

Definējiet bezsaistē iespējamo

Ņemsim par piemēru čivināt. Ja esat bezsaistē un ievietojat čivināt, pirmais bezsaistes čivināt klients varētu iet divus ceļus. Tas varētu ierindot čivināt rindā, līdz tas atgūs savienojamību. Vai arī tas varētu atteikties ļaut jums čivināt, pat ja tas ļauj rindā sastādīt citas darbības, piemēram, faves, kā to dara Tweetbot.

Kāpēc Tweetbot neļautu jums čivināt bezsaistē? Varbūt tāpēc, ka, atgriežoties tiešsaistē, jūsu tvīti vairs var nebūt aktuāli. Šīs problēmas risināšana nozīmē jauna lietotāja interfeisa izveidošanu to tweetu sarakstam, kurus vēl neesat ievietojis, bet kurus, iespējams, vajadzēs rediģēt vai izdzēst, pirms tie nonāk tiešsaistē. No otras puses, ja jums iepatikās čivināt, maz ticams, ka jūs to atsauktu, ja saskaraties ar vairāk informācijas - un daudz mazāk problemātiski ir vienkārši norādīt, ka tas ir ievietots rindā.

Jūs nevarat likt bezsaistes lietotnei darīt visu, ko var tiešsaistes lietotne, taču varat padarīt to noderīgu.

Izstrādājiet konfliktus

Neatkarīgi no stratēģijas, kuru izmantojat aizmugurē, lai saskaņotu izmaiņas, jūsu lietotne saskarsies ar punktu, kurā jums ir divi konfliktējoši dati. Varbūt tas ir tāpēc, ka serveris avarēja vai tāpēc, ka jūs ar citu personu veicāt bezsaistes izmaiņas un tagad vēlaties tās sinhronizēt. Jebkas var notikt!

Tādējādi paredziet konfliktus un cenšaties tos atrisināt paredzamā veidā. Piedāvājuma izvēle. Un vispirms mēģiniet izvairīties no konfliktiem.

Paredzamība nozīmē, ka jūsu lietotāji zina, kas varētu notikt. Ja konflikts var rasties, kad lietotāji bezsaistē rediģē divās vietās vienlaikus, viņiem par to jābrīdina, kad viņi ir bezsaistē.

Piedāvāt izvēli nozīmē vienkārši nepieņemt pēdējo rakstīto vai apvienot izmaiņas vai izdzēst vecāko kopiju. Tas nozīmē ļaut lietotājam izlemt, kas ir piemērots.

Visbeidzot, labākais risinājums ir nekad neļaut konfliktiem attīstīties. Varbūt tas nozīmē, ka jūsu lietotne ir jāveido tā, lai jauni un dīvaini dati no daudziem avotiem neradītu konfliktu un tā vietā tiktu parādīti tieši tā, kā vēlaties. To varētu būt grūti izdarīt rakstīšanas lietotnē, kas darbojas tiešsaistē un bezsaistē, taču koplietojamo zīmēšanas lietotni var izveidot, lai pievienotu zīmējumam jaunus ceļus ikreiz, kad tie tiek sinhronizēti.

Esi izteikts

Viena lieta ir definēt, ko lietotājs var darīt bezsaistē. Cita problēma ir padarīt šos lēmumus saprotamus lietotājiem. Neveiksmīga saziņa ar datu un savienojamības stāvokli vai noteikto funkciju pieejamību ir līdzvērtīga neveiksmei, ja vispirms esat izveidojis bezsaistes lietotni.

Koplietojama piezīmju veidošanas lietotne parāda problēmu. Ja dodaties bezsaistē, bet sagaidāt, ka jūsu prombūtnes laikā līdzstrādnieki turpinās rediģēt lietotnē, nepietiek, ja vienkārši ļaujiet lietotājam turpināt rakstīt, līdz viņš ir apmierināts. Kad viņi atkal izveidos savienojumu, viņus pārsteigs izveidojušies konflikti.

Tā vietā palīdziet savam lietotājam pieņemt pareizo lēmumu. Ja redzat, ka servera savienojums ir pārtraukts, jo jūsu lietotnes augšējā josla maina krāsu, jūs zināt, kas varētu būt: sapludiniet konfliktus! Tas var būt lielisks laiks, un jūsu lietotnes lietotāja saskarne var palīdzēt novērst negaidītus konfliktus, kad atgriezīsities tiešsaistē. Bet, ja zaudējat savienojamību, kad jūsu lietotni rediģē vairāki cilvēki, vai nebūtu lietderīgi zināt, ka konfliktu risks ir daudz lielāks? "Jums zaudēja savienojumu, bet citi rediģēja. Rediģēšanas turpināšana var izraisīt konfliktus. ” Lietotājs var turpināt, bet zina risku.

Ir viegli bezgalīgi rakstīt par dizaina problēmām un risinājumiem, taču, pirms mēs nonākam pārāk tālu no rīkiem, kas mums būs jāizmanto, varētu būt noderīgi uzzināt, kā tas ir, veidojot bezsaistes mobilo lietotni.

Veidojiet bezsaistes lietotni, izmantojot Realm

Bāzes bezsaistē pirmās lietotnes arhitektūra nav izdomāta. Jums ir nepieciešams veids, kā saglabāt datus lietotnē (izmantojot ierīcē esošu datu bāzi), protokols saziņai ar serveri (ieskaitot sērijas un deserializācijas kodu, ja nepieciešams), un serveris, kurā dzīvos sinhronizētie dati, lai tos varētu izplata tam, kam ir atļauja.

Pirmkārt, es iepazīstināšu jūs ar to, kā sākt lietot Realm Mobile Database iOS lietotnē (lai gan kods Android lietotnē neizskatās daudz savādāks). Tad es iepazīstināšu ar koda, kuru iegūstat no servera un glabājat savā vietējā Realm datu bāzē, sērijas un deserializācijas stratēģiju. Visbeidzot, es jums parādīšu, kā panākt, lai tas viss darbotos kopīgā uzdevumu saraksta lietotnē, kas tiek sinhronizēta reāllaikā.

Realm Mobile datu bāze

Sākt ar Realm ir viegli. Jūs instalējat Realm Mobile Database, pēc tam definējat savu shēmu, veidojot klases. Tā kā valstība ir objektu datu bāze, tas patiešām ir tikpat vienkāršs kā klašu veidošana, dažu objektu instantizēšana un šo objektu nodošana a rakstīt bloķēt, lai saglabātu tos diskā. Serializācija vai ORM nav nepieciešama, turklāt tā ir ātrāka nekā Apple pamatdati.

Šeit ir mūsu modeļa kodols un visvienkāršākā iespējamo uzdevumu saraksta lietotne (kas jums būs jāpārkompilē katru reizi, kad vēlaties veikt jaunu uzdevumu):

importēt RealmSwift

klases uzdevums: objekts {

dinamiskais var nosaukums

}

klases uzdevumu saraksts: objekts {

ļaujiet uzdevumiem = Saraksts ()

}

ļaujiet myTask = Uzdevums ()

myTask.task

ļaujiet myTaskList = TaskList ()

myTaskList.tasks.append (myTask)

ļaujiet valstībai = valstība ()

pamēģini! realm.write {

realm.add ([myTask, myTaskList])

}

Turpmāk nav nepieciešams daudz, lai izveidotu pilnvērtīgāku lietotni ap TableViewController:

importēt UIKit

importēt RealmSwift

klase TaskListTableViewController: UITableViewController {

var valstība = pamēģini! Valstība ()

var taskList = TaskList ()

ignorēt func viewDidLoad () {

super.viewDidLoad ()

drukāt (Realm.Configuration.defaultConfiguration.fileURL!)

// Šeit jūs varat aizstāt self.taskList ar iepriekš saglabātu objektu TaskList

pamēģini! realm.write {

realm.add (self.taskList)

       }

// pievienot navigācijas joslu +

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

   }

func displayTaskAlert () {

// izveidojiet un parādiet brīdinājumu, kas uzņems vārdu un izveidos uzdevumu.

let alert = UIAlertController (nosaukums: “Izveidot uzdevumu”, ziņojums: “Kā jūs to vēlaties nosaukt?”, PreferredStyle: UIAlertControllerStyle.alert)

alert.addTextField (configurationHandler: nulle)

alert.addAction (UIAlertAction (nosaukums: “Atcelt”, stils: UIAlertActionStyle.cancel, apstrādātājs: nulle))

alert.addAction (UIAlertAction (nosaukums: “Izveidot uzdevumu”, stils: UIAlertActionStyle.default, apstrādātājs: {(darbība) iekš

let task = Uzdevums ()

task.name = (brīdinājums.textFields? [0] .text)!

pamēģini! self.realm.write {

self.realm.add (uzdevums)

self.taskList.tasks.append (uzdevums)

           }

self.tableView.reloadData ()

       }))

self.present (brīdinājums, animācija: taisnība, pabeigšana: nulle)

   }

ignorēt func didReceiveMemoryWarning () {

super.didReceiveMemoryWarning ()

   }

ignorēt func numberOfSections (tabulāView: UITableView) -> Int {

1. atgriešanās

   }

ignorēt func tableView (_ tableView: UITableView, numberOfRowsInSection sadaļa: Int) -> Int {

atgriezt self.taskList.tasks.count

   }

ignorēt func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

ļaujiet cell = tableView.dequeueReusableCell (withIdentifier: “reuseIdentifier”, domēnam: indexPath)

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

atgriešanās šūna

   }

}

Tas ir viss, kas nepieciešams, lai sāktu darbu! Izmantojot Realm kolekcijas un objektu paziņojumus, jūs varat iegūt daudz gudrāku, lai jūs varētu saprātīgi atkārtoti ielādēt tableView kad objekts tiek pievienots vai izdzēsts, bet pašlaik mums ir neatlaidība - pirmais bezsaistes lietotnes pamats.

Serializācija un deserializācija

Lietotne bezsaistē vispirms nav liela bezsaistes lietotne, ja vien tā var arī pāriet tiešsaistē, un datu iegūšana no valstības un no tās var būt nedaudz grūts.

Pirmkārt, izšķiroša nozīme ir klienta shēmas saskaņošanai ar servera shēmu. Ņemot vērā to, kā darbojas lielākā daļa aizmugures datu bāzu, tas, visticamāk, būs saistīts ar primārās atslēgas lauka pievienošanu jūsu valstības klasei, jo valstības objektiem pēc noklusējuma nav primārās atslēgas.

Kad jūsu shēma ir labi saskaņota, jums ir nepieciešams veids, kā deserializēt datus, kas nāk no servera Realm, un sērijveidot datus JSON, lai tos nosūtītu atpakaļ uz serveri. Vieglākais veids, kā to izdarīt, ir izvēlēties iecienītāko modeļu kartēšanas bibliotēku un ļaut tai smagi pacelt. Swift ir Argo, Decodable, ObjectMapper un Mapper. Tagad, saņemot atbildi no sava servera, jūs vienkārši ļaujiet kartētāja modelim to atšifrēt vietējā RealmObject.

Tomēr tas nav tik lielisks risinājums. Jums joprojām ir jāuzraksta daudz tīkla koda, lai JSON droši nokļūtu uz jūsu serveri un no tā, un jūsu kartētāja modeļa kodam būs nepieciešams pārrakstīt un atkļūdot katru reizi, kad mainās jūsu shēma. Ir jābūt labākam veidam, un mēs domājam, ka Realm Mobile platforma ir tieši tā.

Darbs ar Realm Mobile platformu

Realm Mobile Platform (RMP) nodrošina sinhronizāciju reāllaikā, lai jūs varētu koncentrēties uz mobilās lietotnes izveidi, nevis cīnīties par servera un lietotnes sarunu. Jums vienkārši jāpieņem iepriekšējais Realm modelis, jāpievieno RMP lietotāja autentifikācija un jāļauj RMP rūpēties par datu sinhronizāciju starp serveri un jūsu lietotnes sfēru. Tad jūs vienkārši turpiniet strādāt ar vietējiem Swift objektiem.

Lai sāktu, lejupielādējiet un instalējiet Realm Mobile Platform MacOS paketi, kas ļauj jums patiešām ātri iegūt Realm Object Server instanci jūsu Mac datorā. Tad mēs pievienosim dažus vienumus mūsu uzdevumu saraksta lietotnei, lai tā izveidotu savienojumu ar Realm Object Server.

Kad esat izpildījis iepriekš minētos instalēšanas norādījumus, serverim un administratora lietotājam vajadzētu būt vietnē //127.0.0.1:9080. Atcerieties šos akreditācijas datus, un mēs atgriezīsimies pie mūsu Swift koda.

Pirms rakstām vēl kodu, mums jāveic divas sīkas izmaiņas projektā. Pirmkārt, mums jāiet uz mūsu lietotnes mērķa redaktoru Xcode un cilnē Iespējas iespējojiet slēdzi Keychain Sharing.

Pēc tam mums būs jāatļauj TLS tīkla pieprasījumi. Dodieties uz projekta failu Info.plist un pievienojiet: tagi:

NSAppTransportSecurity

NSAllowsArbitraryLoads

   

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