
Jadi, Mei 2018. 7 upaya dilakukan dalam 7 tahun untuk memulai pemrograman sesuatu untuk iOS. Dan setiap kali hal yang sama: Objective-C adalah sesuatu yang menakutkan dan tidak bisa dipahami, maka tidak ada ide. Dan kemudian Hello World, setahun sekali, secara umum, semuanya tidak berjalan ...
Kali ini, Xcode baru dan bahasa baru untuk saya Swift ... Dan ide baru, saya ingin mendorong notifikasi untuk server Zabbix saya. tidak ada stok resmi, dan tidak ada pelanggan saat itu ...
Sebelum ini, bot mengirim pushgram ke push, tetapi mulai junk dan Roskomnadzor tiba pada waktunya ... Pemblokiran gerobak tidak memainkan peran khusus, karena ada Mikrotik dan langsung "diperbaiki".
Diputuskan untuk menulis notifikasi Zabbix, yang kemudian tidak hanya untuk notifikasi.
Ternyata, hanya melempar notifikasi tidak akan berfungsi. Anda perlu menulis aplikasi, menginstalnya, mengambil token darinya, naikkan server Anda untuk mengirim pemberitahuan push ...
Pengalaman pemrograman hanya dalam PHP. Swift berbeda, tetapi tidak terlihat menakutkan seperti Objective-C pada saat itu. Dan Xcode itu sendiri bagus sebagai IDE yang mengubah kode dari yang lama ke yang baru, membuat petunjuk.
Pertama-tama, latih video, pelajari Zabbix API itu sendiri. Tapi kemudian, satu artikel demi satu, bagaimana NSURLSession bekerja, kerangka apa yang ada.
Versi pertama hanya bisa masuk ke server Zabbix dan memberikan pemicu dan host. Kemudian ditambahkan tampilan grafik, nilai, dll.
Saya akan membahas beberapa poin yang saya temui saat menulis aplikasi.
Kerangka kerja
Kerangka kerja tidak masuk. Mereka "keren", nyaman, tetapi saya tidak ingin memperbaiki proyek nanti karena ada sesuatu yang berubah. Dan ini sudah terjadi. Bagi saya sendiri, saya memutuskan untuk tidak menggunakannya, dan lebih baik untuk menciptakan sepeda saya untuk memahami cara kerja semuanya. Untuk permintaan JSON, ada Alamofire, tetapi saya menggunakan NSURLSession bawaan karena itu sudah cukup untuk semuanya.
Tes
Lebih dari satu tahun telah berlalu, ketika saya memutuskan untuk menambahkan tes :)
Saya pikir hal yang menakjubkan ini akan menyelamatkan dunia ... Tapi ... saya menulis beberapa tes berbeda, menjulurkannya di sini ... Dan kemalasan datang. Saya tidak melihat tugas sejauh ini dalam proyek sekecil ini untuk mengalokasikan begitu banyak waktu untuk pengujian ... Dan ini hanya waktu untuk tes kode, belum lagi tes UI.

Enkripsi
Ada beberapa poin untuk enkripsi.
Apple dengan manualnya ingin semua permintaan dienkripsi. Dan itu benar. Tetapi seperti yang ditunjukkan oleh latihan, tidak semua orang ingin melakukan https untuk Zabbix mereka. Pada awalnya, saya tidak memiliki opsi (Pengaturan Keamanan Transport Transport) yang membolehkan lalu lintas http murni, yang untuk itu saya disalibkan dalam ulasan di AppStore) Lalu saya menyalakannya bukan tanpa petualangan. Xcode tidak melihat baris saya sampai saya baru saja membuat ulang seluruh file Info.plist.
Juga, Apple ingin tahu segalanya tentang aplikasi Anda, lalu lintas https yang biasa tidak termasuk dalam ini. Tetapi jika Anda ingin mengenkripsi sesuatu "dengan cara yang rumit," harap laporkan ke otoritas AS.

Saat berkomunikasi dengan salah satu pengguna aplikasi, ada permintaan untuk enkripsi pesan PUSH End-to-End. Pesan harus dienkripsi di server Zabbix, dan didekripsi hanya di ponsel. Untuk hal seperti itu, Apple memiliki notifikasi "bisa berubah". Yaitu jika "konten yang dapat diubah" telah tiba, maka dalam dorongan Anda perlu mengubah sesuatu sesuai dengan apa yang Anda tulis. Saya sudah mendekripsi pesannya.
Kebijakan Apple di sini tidak menentang penggunaan jenis enkripsi standar. Apakah Anda menginginkan sesuatu sendiri, seperti yang saya tulis di atas, beri saya selembar kertas dan dapat menunjukkan kuncinya? ...
Saya menggunakan lib CommonCrypto bawaan, jadi ini dianggap jenis enkripsi standar. Saya harus mengacaukan kode, karena sebagian besar contoh sudah sangat ketinggalan zaman, atau Xcode berteriak bahwa itu tidak aman, tidak ada yang bekerja dengan byte dan data secara langsung, atau bersenang-senang dengan IV OpenSSL-a, offset itu tidak benar, maka sesuatu yang lain tidak benar. Akibatnya, dimungkinkan untuk membuat kode non-sumpah, dan bekerja dengan benar dengan OpenSSL saat mengenkripsi pesan.
Sirkuit pendek
Dan topik yang paling menarik bagi saya ... Saya tidak bisa menulis kode asinkron .... Sejauh ini, setidaknya saya belum mengerti banyak cara penutupan ini bekerja.

Secara default, NSURLSession hanya asinkron dan saya tidak bisa mengerti bagaimana cara menggunakannya nanti ... Saya menggunakan DispatchSemaphore untuk membuat kode itu sinkron ... Tentu saja ada banyak keluhan dari pengguna yang crash dan crash ...
Kemudian, sama saja, saya sadar apa dan bagaimana cara kerjanya di sirkuit, batas waktu apa di NSURLSession, dan apa itu. Kode sepenuhnya diganti oleh normal, penangan kesalahan ditambahkan. Dan hidup telah menjadi lebih baik, hidup telah menjadi lebih menyenangkan.
Tata letak

Ya, saya memiliki semuanya dalam satu Storyboard. Saya tahu ini tidak terlalu, tetapi sejauh ini ada beberapa layar. Mungkin saya akan memasukkan xibs nanti.
iOS 13 telah membawa perubahan pada tampilan layar. Sebelumnya, semua layar baru ditampilkan sebagai PUSH yaitu. layar penuh. Sekarang layar ini dapat ditarik ke bawah dan akan menutup.
Secara umum, ada bug jika Anda mengklik LogOut dan Anda dapat dengan mudah menutup formulir login kembali. Ini hanya terjadi jika Xcode terakhir dirakit 11. Ini dikoreksi hanya dengan mengatur opsi tampilan untuk ditampilkan hanya dalam layar penuh.
SwiftUI juga muncul di iOS 13, tetapi jika Anda mengulang aplikasi sekarang, itu berarti melupakan mereka yang menggunakan aplikasi pada perangkat lama dengan firmware lama ...
Tata Letak AppStore
Walaupun saya menulis aplikasi untuk diri saya sendiri, maka saya memutuskan untuk mempostingnya di AppStore. Itu semua hanya membayar $ 100 per tahun dan mengeluarkannya. Yang benar masih memeriksa aplikasi, menjelaskan mengapa aplikasi ini, dll.
Karena aplikasi untuk Zabbix, pada logo saya ingin menggunakan sesuatu yang mengatakan tentang Zabbix. Tapi itu tidak ada di sana. Saya menulis surat kepada Zabbix meminta agar dimungkinkan untuk menggunakan bentuk huruf Z ... Tapi tidak. Karena itu, saya melukis ikon saya, kurva miring, tetapi milik saya)
Keuangan
Aplikasi ini hampir 2 tahun. Menghabiskan $ 200 hanya untuk memiliki aplikasi di AppStore. Terlepas dari pengembangan dan server push.

Aplikasi ini memiliki iklan dari Google ... yang membawa ... ... $ 5
Menonaktifkan iklan menghasilkan $ 88 ... Tetapi ambang penarikan adalah dari $ 150.
Kemudian saya akan menghapus iklan secara umum segera setelah saya mencapai ambang penarikan.
Server dorong
Ya, ya, semuanya dimulai untuknya ... Pemberitahuan push sangat dibutuhkan. Setelah selesai sehingga Anda dapat mengenkripsi pushy, banyak yang beralih ke terenkripsi.
Ada 2 server, Moskow dan Belanda pada 2 rubel / hari. Penyeimbangan DNS, Nginx c Let's Encrypt, skrip PHP untuk menerima dan mengirim.
Awalnya, ada server gratis di Amazon (15 pertunjukan lalu lintas ...), tetapi ketika saatnya mulai, saya membeli VPS-ku untuk pindah ke sana. Dan saya menemukan saat ketika DDOS pergi ke penyedia hosting dan vps tidak tersedia selama 12 jam ... 2 rubel yang saya inginkan lebih banyak. Yah, saya masih di Amazon dan itu belum mempengaruhi saya. Karena itu, maka satu lagi diambil 2 rubel per hari tetapi di lokasi yang berbeda. Setidaknya beberapa toleransi kesalahan dan lalu lintas 15 gigabyte ... Perhatian utama untuk lalu lintas Amazon, mikro, dan Anda mendapat uang.
Saya ingin menggunakan Cloudflare sebagai penyeimbang, tetapi mereka ingin mendelegasikan seluruh domain kepada mereka, dan bukan di bawah domain.
Beberapa statistik
Total hampir 6 ribu unduhan. Dan Brasil ada di puncak ... siapa sangka)

Kesimpulan
- Swift tidak seperti itu)
- Banyaknya artikel dan kenyamanan IDE di dunia modern memungkinkan Anda untuk segera memulai.
- Aplikasi ini awalnya ditulis untuk saya sendiri, tetapi ternyata menjadi pengalaman yang baik dengan pengembangan dan penataan di AppStore dengan ulasan positif dan negatif.
- Perkembangan membersihkan otak dengan baik.
- Lebih baik membaca dok dan tidak membuat sinkron dari kode asinkron :)
- Umumnya menulis, menyalin, belajar. Hanya dengan cara ini seseorang dapat memahami dalam praktik apa itu apa.
- * Berkomunikasi lebih banyak dengan pengguna, mereka pasti akan mengatakan mengapa mereka membutuhkannya dan bagaimana mereka ingin melihatnya. Saya menambahkan sepertiga fungsi dalam aplikasi tepat sesuai dengan keinginan pengguna.