Bagaimana saya melakukan pelacak parkir untuk orang-orang

Baru-baru ini, saya kembali menjepit. Saya tinggal di Eropa, dan bukannya denda karena parkir yang tidak tepat dan truk derek “clamper”, mereka mengikat roda mobil Anda. Untuk keluar, Anda perlu melakukan panggilan telepon, membayar jumlah bulat dan menunggu pria dengan kunci untuk mengangkat rantai. Itu panjang, memalukan dan kadang-kadang (tergantung pada area) mahal mahal.

Hari itu saya terlambat kemana-mana. Menunggu pekerja menelepon dengan kunci, saya bertanya-tanya seberapa bodohnya saya. Saya berlari masuk, meninggalkan mobil selama setengah jam, bukannya maksimum 20 menit gratis - tepatnya di menit ke-21 dan tertangkap. Sialnya, van bergaris parkir tidak jauh, dan mereka langsung bereaksi. Mereka biasa menangkap saya sebelumnya, karena berbagai alasan: Saya lupa, jangka waktu pembayaran telah berakhir, dan kadang-kadang saya tidak dapat menemukan mobil saya di jalan yang berliku.

"Pasti ada aplikasi untuk semuanya," pikirku, dan mulai mempelajari app store. Setelah banyak hasil yang meragukan, kepercayaan diri saya berkurang, dan saya memutuskan untuk mengklarifikasi: "pasti ada aplikasi android untuk semuanya." Kemudian dia menemukan huavei-nya dan naik ke perut play store. Dari sana, lebih banyak puing menumpahkan pada saya, dan, tenggelam dalam kerajinan canggung, saya meludah. Entah saya entah bagaimana keliru, atau tidak ada pelacak parkir yang nyaman dan dapat dimengerti. Kesimpulannya sederhana: jika kita tidak memiliki sesuatu, mari kita lakukan sendiri.

Terhadap latar belakang, saya sudah melihat konstruksi jangka panjang , menghilangkan hampir semua waktu luang saya. Saya memutuskan untuk istirahat dan mengambil jeda proyeksi. Setelah memperkirakan fungsionalitas yang diinginkan, saya membayangkan periode satu setengah bulan, dan, melihat ke depan, saya akan mengatakan bahwa, pada prinsipnya, ternyata lebih cepat. Hasilnya adalah aplikasi yang ringkas dan bersih di kedua platform, sangat nyaman. Sekarang saya menggunakannya sendiri dan menyarankan Anda mencobanya.

gambar

Ide


Jadi apa yang saya inginkan dari pelacak parkir? Apa yang selalu saya lewatkan ketika saya mendapat denda? Setelah berpikir, saya merumuskan pengantar berikut:

  1. Sederhana Idealnya, satu tombol. Minimal fungsi yang mengganggu: tidak ada profil, riwayat parkir, dukungan untuk beberapa mobil secara bersamaan, dll.
  2. Dengan notifikasi. Saya tidak akan lupa tentang mobil, jika aplikasi mengingatkan saya: bro, Anda memiliki parkir di sana, dan itu akan segera kedaluwarsa.
  3. Pertimbangkan waktu berjalan. Ini adalah pemikiran paling sederhana yang belum pernah saya lihat di mana pun. Saya tidak perlu tahu bahwa parkir akan berakhir dalam 5 menit jika saya setengah jam darinya. Saya perlu diingatkan agar saya dapat pergi ke mobil beberapa menit sebelum akhir dan pergi.
  4. Rute dan navigasi ke tempat parkir. Navigasi, tentu saja, melalui Google atau Apple Maps, tetapi rute dapat ditampilkan di aplikasi Anda. Ini akan membantu jika Anda meninggalkan mobil di area yang tidak dikenal, timer berdetak, dan Anda berputar-putar di sepanjang jalan yang sama.

Saya memilih Flutter sebagai basis teknologi, karena saya telah bekerja dengannya untuk beberapa waktu dan menganggapnya bagus. Untuk rute saya memutuskan untuk menggunakan API DI SINI, juga bukan untuk pertama kalinya, tetapi untuk peta - Mapbox. Saya membuat sketsa beberapa opsi untuk antarmuka, memilih yang paling minimalis dan terlibat dalam pekerjaan.

Pengembangan


Pada prinsipnya, tidak banyak yang bisa diceritakan tentang proses pengembangan itu sendiri. Tidak ada bagian server di sini, klien paling sederhana, yang pada dasarnya terdiri dari satu tampilan besar di berbagai negara. Pada halaman pertama, Anda memilih preset - 1, 2, 4, 6 jam - atau menggunakan slider untuk menyesuaikan periode parkir Anda. Setelah mencobanya secara langsung, saya menyadari bahwa slidernya cukup kasar, dan menambahkan tombol "+" dan "-" ke dalamnya. Nuansa lucu dan agak tidak jelas di sini adalah saat Anda memilih, waktu terus berjalan. Jadi, Anda perlu memperbarui tampilan ini secara real time. Setelah memilih istilah, klik pada satu-satunya tombol di bawah ini, dan lokasi dan data waktu disimpan, dan parkir dimulai. Penting untuk dicatat bahwa saya pada dasarnya menyimpan semua data di papan, tidak ada yang ditransfer ke server apa pun. Di masa depan, ini, omong-omong, akan menciptakan kesulitan bagi saya, tetapi lebih pada nanti.

Halaman kedua sebenarnya adalah penghitung waktu parkir. Saya mencoba banyak opsi di sini: Saya mulai dengan prototipe info yang sangat berlebihan, kemudian secara iteratif menyingkirkan dan disederhanakan hingga batasnya. Saya benar-benar ingin status parkir ditampilkan secara visual, bukan angka kering, jadi elemen utama halaman ini bersama dengan peta adalah bagan donat. Ini menunjukkan waktu yang telah berlalu, waktu berjalan dan waktu yang tersisa. Jika Anda tidak berada di dekat mobil dan waktu berjalannya adalah nol, tombol mulai navigasi akan muncul, dan peta menunjukkan perkiraan rute ke tempat parkir. Faktanya, itu saja.

Meskipun kesederhanaan visualnya, layar ini cukup membuat saya jengkel. Harus dipahami bahwa ketika parkir aktif, sejumlah proses terjadi secara bersamaan:

  • waktu berlalu dan timer habis
  • Anda bergerak dan waktu perjalanan berubah

Semua ini terjadi secara real time dan harus langsung ditampilkan pada antarmuka. Bagan harus dibangun kembali dengan lancar, peta harus bergerak dan menggambar ulang rute, jika ada risiko terlambat atau parkir berakhir, peringatan yang sesuai juga akan muncul. Selain itu: ketika Anda menutup dan membuka aplikasi, Anda harus mengembalikan semua ini dengan benar. Dan akhirnya, yang menakutkan: semua fungsi harus dapat bekerja di latar belakang, karena aplikasi akan menghabiskan sebagian besar hidupnya di latar belakang. Hal-hal seperti itu.

Saya tidak akan menjelaskan implementasi secara rinci, saya hanya bisa mengatakan bahwa pekerjaan flutter dengan negara bagian sangat layak. Di mana di android murni desain berorientasi objek yang berlebihan akan berubah, ternyata sederhana dan elegan. Keadaan normal yang dapat dimengerti, penjilidan yang masuk akal ke model - dalam tugas seperti ini bergetar. Namun, itu bukan tanpa tiang tembok yang khas: misalnya, perpustakaan lokal yang bekerja dengan peta tidak memiliki transisi animasi ke koordinat baru. Saya harus masuk ke kodenya, mengeluarkan beberapa metode pribadi dan menambahkan kruk saya. Ada kemungkinan bahwa fungsi ini akan ditambahkan segera, tetapi ini adalah keseluruhan bergetar - dengan semua daya tariknya, bersiaplah untuk penemuan seperti itu.

Segalanya tampak berjalan lancar. Sebenarnya, tidak banyak yang lain: beberapa dialog, dan halaman intro di mana pacar saya (dia seorang seniman ) menggambar animasi yang bagus. Akhirnya, saya menerjemahkan seluruh aplikasi ke dalam bahasa Rusia, termasuk peta. Tapi kemudian rasa sakit mulai: pemberitahuan.

Notifikasi


Bagi saya, kemampuan untuk mengirim pemberitahuan pintar adalah kunci ke aplikasi - tanpa itu, tidak ada yang perlu diributkan. Namun, ketika saya mulai mengerjakan fitur ini, saya menyadari bahwa saya telah menginjak kaki saya sendiri. Sebenarnya ada dua masalah. Yang pertama adalah flutter, yang tidak tahu cara bekerja dengan perangkat api tingkat rendah di luar kotak: Anda perlu menulis paking dalam bentuk plug-in yang berisi dua kode asli dan abstraksi pada panah. Masalah kedua adalah posisi fundamental saya bahwa semuanya harus dilakukan di atas kapal. Jadi, kami meringkas apa yang dibutuhkan. Perlu bahwa aplikasi di latar belakang :

  1. Terus memantau geolokasi Anda,
  2. Memeriksa berapa menit berjalan kaki ke tempat parkir
  3. Diperiksa dengan timer yang kedaluwarsa
  4. Jika ada risiko tidak memiliki waktu untuk kembali, pemotretan pemberitahuan

Rasakan skala tragedi itu? Jelas bahwa tidak ada kemampuan teknis untuk melakukan ini jika aplikasi benar-benar mati. Tapi anggap saja diminimalkan, dan layar mati. DI SINI api memberi saya rute dan perkiraan waktu berjalan, apakah ini berarti bahwa aplikasi akan mengirim permintaan spam di latar belakang? Berapa banyak kode yang akan dijalankan? Bagaimana dengan konsumsi memori dan energi?

Saya duduk untuk berpikir. Dimulai dengan yang kecil: secara teknis, flutter baru-baru ini memiliki kemampuan untuk mengeksekusi kode di latar belakang, itu disebut isolate. Jika semuanya ditulis dengan benar, maka Anda dapat membangun logika dengan cara tertentu sehingga tidak semuanya berjalan dengan latar belakang, tetapi beberapa fungsi tertentu. Memang, dalam mode diminimalkan, kita tidak perlu menggambar antarmuka atau memperbarui status - kita tertarik pada logika waktu penghitungan yang kosong, dan logika ini cukup kompak dan murah. Pada saat yang sama, itu tidak boleh dipicu oleh perubahan geolokasi, seperti yang saya miliki di versi aslinya, tetapi oleh beberapa timer internal. Karena notifikasi harus terbang, walaupun Anda tidak bergerak, tetapi duduk diam.

Yah, kami menulis kode ringan yang dapat berjalan di latar belakang dan dikendalikan oleh timer. Bagaimana kita dapat memicunya dalam kerangka aplikasi asli dan mengirimkan data geolokasi di sana? Ternyata berbeda.

Logika android dan iPhone dalam hal eksekusi kode di latar belakang sangat berbeda. Untuk iPhone, tidak ada: kode latar belakang hanya dapat memicu peristiwa sistem dari jenis tertentu, misalnya, memutar audio streaming atau, untungnya bagi saya, memperbarui lokasi. Untuk melakukan ini, cukup minta izin dan di bagian asli plug-in Flater berlangganan acara tersebut. Dari sana, melalui saluran komunikasi tertentu (MethodChannel), kami memanggil panggilan balik dalam sebuah panah, meneruskan geodata ke sana dan memulai latar belakang dengan logika yang kita butuhkan. Kecantikan

Android bekerja secara berbeda. Secara teknis, ia memiliki kemampuan untuk mengeksekusi kode di latar belakang tanpa terikat dengan peristiwa sistem - untuk ini Anda perlu menggambarkan layanan. Itu tergantung secara terpisah dari aplikasi, baik sepenuhnya di latar belakang atau di atas tanah kosong (di sana itu membuatnya dirasakan oleh pesan terlampir pada orang buta). Tampaknya masalah telah teratasi: di bagian asli plugin, kami menggambarkan layanan latar belakang yang melacak lokasi dan menarik kode Darth. Namun, ada nuansa. Dari Android versi 8.0, sikap terhadap layanan tersebut telah berubah: sekarang, jika aplikasi diminimalkan pada saat ini, layanan latar belakangnya sangat terpotong oleh poros untuk menghemat energi. Dan, jika kode Anda melakukan, misalnya, backup data, maka pada prinsipnya Anda tidak peduli pada saat yang tepat sumbu akan membiarkannya bekerja - hal utama adalah ia bekerja. Namun dalam kasus saya, kami perlu melacak perubahan lokasi dalam waktu yang hampir nyata, dan waktu sangat penting di sini. Oleh karena itu, satu-satunya jalan keluar adalah memulai layanan dengan mudah. Kami menjelaskan pemberitahuan kecil yang terpasang di tirai, berlangganan ke lokasi, mengirimkannya ke anak panah melalui MethodChannel. Segalanya tampak bekerja.

Omong-omong, kembali ke masalah memori, konsumsi energi dan jumlah permintaan - kode dijalankan ketika lokasi digeser ke 50 meter, atau oleh timer. Selain itu, dia sendiri sangat ringan, dan permintaan tidak melewati saya, tetapi langsung pergi ke api DI SINI. Saya sendiri tidak menerima data apa pun dan tidak menyimpannya di mana pun. Secara umum, implementasi seperti itu dijelaskan dengan sangat baik di sini , ini adalah blog dari salah satu insinyur flutter - kode ini juga dilampirkan di sana. Contohnya agak berbeda, tetapi pendekatan umumnya jelas, jadi saya sarankan membacanya.

Hasil


Faktanya, itu saja. Selama sebulan waktu luang, saya mendapat aplikasi yang dengan sempurna memecahkan masalah tertentu. Saya harap artikel ini akan menarik bagi seseorang, dan aplikasi ini akan menyelamatkan Anda dari denda dan stres. Anda dapat melihat dan memarahi di sini: Android , iOS .

Terima kasih atas perhatiannya.

Source: https://habr.com/ru/post/id464451/


All Articles