Bina aplikasi mudah alih pertama di luar talian tanpa rasa sakit

Alexander Stigsen adalah pengasas bersama dan CEO Realm.

Ini adalah kebenaran yang diakui secara universal bahawa pengguna yang memiliki telefon pintar pasti memerlukan sambungan yang lebih baik. Walaupun pelaburan infrastruktur bernilai berbilion dolar dan inovasi teknologi tanpa henti, hanya memerlukan perjalanan singkat untuk melihat kenyataan penting dari era yang dihubungkan: Anda tidak boleh menganggap sambungan rangkaian akan tersedia setiap kali anda menginginkannya. Sebagai pembangun mudah alih, itu adalah kebenaran yang mudah untuk diabaikan.

Keadaan luar talian dalam aplikasi boleh mengelirukan untuk dikendalikan, tetapi masalahnya bermula dengan anggapan asas dan salah — bahawa di luar talian, secara lalai, adalah keadaan ralat. Itu masuk akal ketika kami membina aplikasi untuk komputer desktop dengan pautan ethernet uplink khusus. Tidak masuk akal apabila penutupan pintu lif menjadikan aplikasi sama sekali tidak berguna atau ketika masuk akal untuk mengharapkan aplikasi anda akan digunakan di tempat yang kekurangan infrastruktur selular yang boleh dipercayai.

Kami tidak dapat menyelimuti dunia dengan liputan, jadi kami harus menawarkan alternatif. Kita harus berfikir di luar talian terlebih dahulu. Kita harus merancang aplikasi agar berguna di luar talian. Kita harus membina aplikasi yang memanfaatkan sepenuhnya internet apabila tersedia tetapi faham bahawa akses internet sentiasa sementara. Kita harus membuat keputusan reka bentuk pintar yang melibatkan keadaan luar talian dan menjadikan keadaan luar talian itu dapat difahami oleh pengguna.

Banyak kerja sedang dilakukan untuk menentukan masa depan pertama-luar talian. Realm, syarikat tempat saya bekerja, telah membina platform masa nyata untuk aplikasi mudah alih luar talian untuk beberapa waktu. Pangkalan data mudah alih kami dan Realm Mobile Platform mempermudah untuk membuat aplikasi pintar pertama di luar talian di hampir semua peranti mudah alih. Orang-orang di A List Apart telah memberikan sumbangan besar untuk literatur pertama di luar talian, terutama untuk aplikasi web. Dan komuniti pemaju ekosistem mudah alih utama telah menghabiskan berjam-jam untuk menawarkan penyelesaian sumber terbuka yang mengagumkan.

Yang berikut adalah pengenalan ringkas bagaimana anda boleh membina aplikasi mudah alih pertama di luar talian. Saya akan menggunakan beberapa kod contoh Swift yang sederhana hingga akhir untuk menunjukkan seperti apa aplikasi minimum luar talian pertama, tetapi prinsip dan masalah yang ditawarkan di sini relevan bagi sesiapa sahaja yang bekerja dalam pembangunan aplikasi mudah alih.

Reka bentuk untuk luar talian-pertama

Sebelum anda membina aplikasi pertama di luar talian yang selalu anda mahukan, kita harus melihat semula penyelesaian reka bentuk yang sesuai untuk desktop dengan kemungkinan sangat tinggi untuk berada dalam talian. Sekiranya aplikasi anda dapat menangani keadaan luar talian dan dalam talian, kami mempunyai soalan untuk dijawab mengenai apa yang boleh dilakukan dan bagaimana kami menunjukkan kepada pengguna apa yang mungkin.

Tentukan apa yang mungkin di luar talian

Mari kita ambil Twitter sebagai contoh. Sekiranya anda berada di luar talian dan anda menghantar tweet, pelanggan Twitter pertama-luar talian boleh mengambil dua jalan. Ia boleh mengantri tweet sehingga mendapat kembali kesambungan. Atau boleh menolak untuk membiarkan anda tweet — walaupun ia membolehkan anda mengantri tindakan lain seperti faves, seperti yang dilakukan oleh Tweetbot.

Mengapa Tweetbot menghalang anda daripada tweet di luar talian? Mungkin kerana pada masa anda kembali dalam talian, tweet anda mungkin sudah tidak relevan lagi. Menyelesaikan masalah itu akan melibatkan membuat UI baru untuk senarai tweet yang belum anda hantar, tetapi yang mungkin perlu anda edit atau hapus sebelum masuk ke dalam talian. Sekiranya anda suka tweet, sebaliknya, tidak mungkin anda akan membatalkannya jika berhadapan dengan lebih banyak maklumat — dan lebih kurang bermasalah untuk menunjukkan bahawa ia diatur untuk diposkan.

Anda tidak boleh membuat aplikasi luar talian melakukan semua yang boleh dilakukan oleh aplikasi dalam talian, tetapi anda boleh menjadikannya berguna.

Rancang konflik

Terlepas dari strategi yang Anda gunakan di ujung belakang untuk mendamaikan perubahan, aplikasi Anda akan menghadapi titik di mana anda mempunyai dua data yang saling bertentangan. Mungkin kerana pelayan mengalami kerosakan atau kerana anda dan orang lain membuat perubahan di luar talian dan sekarang mahu menyegerakkannya. Apa sahaja boleh berlaku!

Oleh itu, jangkakan konflik dan berusaha untuk menyelesaikannya dengan cara yang dapat diramalkan. Menawarkan pilihan. Dan cuba untuk mengelakkan konflik di tempat pertama.

Menjadi ramalan bermaksud pengguna anda tahu apa yang boleh berlaku. Sekiranya konflik dapat timbul ketika pengguna mengedit di dua tempat sekaligus ketika mereka berada di luar talian, mereka harus diberitahu tentang hal itu ketika mereka berada di luar talian.

Menawarkan pilihan bermaksud tidak hanya menerima penulisan terakhir atau penggabungan perubahan atau menghapus salinan tertua. Ini bermaksud membiarkan pengguna memutuskan perkara yang sesuai.

Akhirnya, penyelesaian terbaik adalah jangan sekali-kali membiarkan konflik berkembang. Mungkin itu bermaksud membina aplikasi anda sedemikian rupa sehingga data baru dan pelik dari banyak sumber tidak menimbulkan konflik, dan sebaliknya akan memaparkan persis seperti yang anda mahukan. Itu mungkin sukar dilakukan dalam aplikasi penulisan yang masuk dalam talian dan luar talian, tetapi aplikasi gambar bersama dapat diarkibkan untuk menambahkan jalan baru ke gambar setiap kali mereka diselaraskan.

Bersikap eksplisit

Satu perkara untuk menentukan apa yang pengguna boleh lakukan di luar talian. Masalah lain melibatkan membuat keputusan tersebut difahami oleh pengguna anda. Kegagalan untuk berjaya menyampaikan keadaan data dan sambungan anda, atau ketersediaan ciri yang diberikan, sama dengan kegagalan dalam membina aplikasi pertama di luar talian.

Aplikasi pengambilan nota bersama menggambarkan masalahnya. Sekiranya anda pergi ke luar talian tetapi mengharapkan kolaborator untuk terus mengedit dalam aplikasi sekiranya anda tidak hadir, tidak cukup dengan membiarkan pengguna terus menaip sehingga mereka gembira. Apabila mereka menyambung semula, mereka akan terkejut dengan konflik yang telah berkembang.

Sebaliknya, bantu pengguna anda membuat keputusan yang tepat. Sekiranya anda melihat bahawa sambungan pelayan anda terputus kerana bar atas aplikasi anda berubah warna, anda tahu apa yang akan berlaku: gabungkan konflik! Itu mungkin baik sepanjang masa, dan UI aplikasi anda dapat membantu menyelesaikan konflik yang tidak dijangka apabila anda kembali dalam talian. Tetapi jika anda kehilangan sambungan ketika banyak orang mengedit aplikasi anda, tidakkah berguna untuk mengetahui bahawa risiko konflik jauh lebih besar? "Anda kehilangan sambungan, tetapi yang lain sedang menyunting. Terus mengedit boleh menyebabkan konflik. " Pengguna boleh meneruskan tetapi mengetahui risikonya.

Sangat mudah untuk menulis tanpa henti mengenai masalah dan penyelesaian reka bentuk, tetapi sebelum kita terlalu jauh dari alat yang harus kita gunakan, mungkin berguna untuk melihat bagaimana rasanya membuat aplikasi mudah alih pertama di luar talian.

Bina aplikasi pertama di luar talian dengan Realm

Seni bina aplikasi asas luar talian pertama tidak mewah. Anda memerlukan cara untuk mengekalkan data dalam aplikasi (menggunakan pangkalan data pada peranti), protokol untuk berkomunikasi dengan pelayan (termasuk kod bersiri dan deserialisasi jika perlu), dan pelayan di mana data yang diselaraskan akan hidup sehingga dapat diedarkan kepada sesiapa yang mempunyai kebenaran.

Pertama, saya akan membimbing anda bagaimana untuk memulakan dengan Realm Mobile Database di dalam aplikasi iOS (walaupun kodnya tidak akan kelihatan jauh berbeza dalam aplikasi Android). Kemudian saya akan menunjukkan strategi untuk membuat siri dan deserialisasi kod yang anda dapat dari pelayan dan simpan di pangkalan data Realm tempatan anda. Akhirnya, saya akan menunjukkan kepada anda bagaimana semuanya berfungsi bersama dalam aplikasi senarai tugasan kolaboratif yang diselaraskan dalam masa nyata.

Pangkalan Data Mudah Alih Realm

Sangat mudah untuk memulakan dengan Realm. Anda memasang Realm Mobile Database, kemudian tentukan skema anda dengan membuat kelas. Kerana Realm adalah pangkalan data objek, sangat mudah seperti membuat kelas, membuat beberapa objek, dan mengirimkan objek tersebut ke dalam writeblok untuk meneruskannya ke disk. Tidak perlu bersiri atau ORM, ditambah lebih pantas daripada Data Teras Apple.

Inilah inti model kami dan aplikasi senarai tugas yang paling asas (yang mesti anda kumpulkan semula setiap kali anda ingin membuat tugas baru):

import RealmSwift

class Task: Object {

   dynamic var name

}

class TaskList: Object {

   let tasks = List()

}

let myTask = Task()

myTask.task

let myTaskList = TaskList()

myTaskList.tasks.append(myTask)

let realm = Realm()

try! realm.write{

            realm.add([myTask, myTaskList])

}

Dari sana, tidak banyak yang diperlukan untuk membina aplikasi yang berfungsi sepenuhnya di sekitar TableViewController:

import UIKit

import RealmSwift

class TaskListTableViewController: UITableViewController {

   var realm = try! Realm()

   var taskList = TaskList()

   override func viewDidLoad() {

       super.viewDidLoad()

       print(Realm.Configuration.defaultConfiguration.fileURL!)

       // Here, you could replace self.taskList with a previously saved TaskList object

       try! realm.write {

           realm.add(self.taskList)

       }

       // add navbar +

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

   }

   func displayTaskAlert() {

       // make and display an alert that’ll take a name and make a task.

       let alert = UIAlertController(title: “Make a task”, message: “What do you want to call it?”, preferredStyle: UIAlertControllerStyle.alert)

       alert.addTextField(configurationHandler: nil)

       alert.addAction(UIAlertAction(title: “Cancel”, style: UIAlertActionStyle.cancel, handler: nil))

       alert.addAction(UIAlertAction(title: “Create Task”, style: UIAlertActionStyle.default, handler: { (action) in

           let task = Task()

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

           try! self.realm.write {

               self.realm.add(task)

               self.taskList.tasks.append(task)

           }

           self.tableView.reloadData()

       }))

       self.present(alert, animated: true, completion: nil)

   }

   override func didReceiveMemoryWarning() {

       super.didReceiveMemoryWarning()

   }

   override func numberOfSections(in tableView: UITableView) -> Int {

       return 1

   }

   override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

       return self.taskList.tasks.count

   }

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

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

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

       return cell

   }

}

Itu sahaja yang diperlukan untuk memulakan! Anda dapat menjadi lebih pintar dengan pemberitahuan koleksi dan objek Realm, jadi anda dapat memuat ulang dengan cerdas tableViewketika objek ditambahkan atau dihapus, tetapi buat masa ini kami mempunyai kegigihan — asas aplikasi pertama-offline.

Serialisasi dan deserialisasi

Aplikasi luar talian pertama tidak banyak aplikasi luar talian melainkan ia juga boleh masuk dalam talian, dan mendapatkan data ke dan dari Realm boleh menjadi agak rumit.

Pertama sekali, memadankan skema pelanggan anda dengan skema pelayan anda sangat penting. Memandangkan bagaimana kebanyakan pangkalan data back-end berfungsi, kemungkinan melibatkan penambahan medan kunci utama ke kelas Realm anda, kerana objek Realm tidak mempunyai kunci primer secara lalai.

Setelah skema anda dipadankan dengan baik, anda memerlukan cara untuk membuat deserialisasi data yang berasal dari pelayan ke Realm dan untuk menyusun data ke dalam JSON untuk dihantar kembali ke pelayan. Kaedah termudah untuk melakukannya adalah dengan memilih perpustakaan pemetaan model kegemaran anda dan membiarkannya melakukan angkat berat. Swift mempunyai Argo, Decodable, ObjectMapper, dan Mapper. Sekarang apabila anda mendapat tindak balas dari pelayan anda, anda membiarkan model mapper menguraikannya menjadi RealmObject asli.

Namun, ini bukan penyelesaian yang baik. Anda masih perlu menulis banyak kod rangkaian untuk mendapatkan JSON ke dan dari pelayan anda dengan selamat, dan kod pemeta model anda akan memerlukan penulisan semula dan debug pada bila-bila masa skema anda berubah. Seharusnya ada cara yang lebih baik, dan kami berpendapat bahawa Realm Mobile Platform memang begitu.

Bekerja dengan Realm Mobile Platform

Realm Mobile Platform (RMP) memberi anda penyegerakan masa nyata sehingga anda dapat memberi tumpuan untuk membina aplikasi mudah alih, bukan berjuang untuk mendapatkan pelayan dan aplikasi untuk bercakap. Anda hanya menggunakan model Realm anda di atas, tambahkan pengesahan pengguna RMP, dan biarkan RMP menjaga penyegerakan data antara pelayan dan alam aplikasi anda. Kemudian anda terus bekerja dengan objek Swift asli.

Untuk memulakan, muat turun dan pasang bundle Realm Mobile Platform MacOS, yang membolehkan anda mendapatkan contoh Realm Object Server yang berlaku di Mac anda dengan cepat. Kemudian kami akan menambahkan beberapa item ke aplikasi senarai tugas yang perlu kami buat untuk menghubungkannya ke Realm Object Server.

Setelah selesai mengikuti arahan pemasangan di atas, anda harus menjalankan pelayan dan pengguna pentadbir di //127.0.0.1:9080. Ingatlah kelayakan tersebut, dan kami akan kembali ke kod Swift kami.

Sebelum kita menulis lagi kod, kita perlu membuat dua perubahan kecil pada projek ini. Pertama, kita perlu pergi ke editor sasaran aplikasi kita di Xcode, dan di tab Keupayaan, aktifkan suis Perkongsian Rantai Kunci.

Kemudian, kita perlu membenarkan permintaan rangkaian bukan TLS. Pergi ke fail Info.plist projek dan tambahkan yang berikut di dalam tag:

NSAppTransportSecurity

   NSAllowsArbitraryLoads