Bagaimana kami menambahkan dukungan Harmony OS ke aplikasi Android inDriver

Semuanya berawal dari fakta bahwa Departemen Perdagangan AS memasukkan Huawei ke dalam daftar perusahaan yang dilarang berbisnis dengan perusahaan Amerika . Tanggapan Huawei adalah sistem operasi Harmony OS untuk smartphone-nya, dan penolakan untuk menggunakan layanan Google di dalamnya. Dan agar tidak kehilangan bagian dari pasar, kami mengintegrasikan dukungannya pada inDriver. Meskipun "integrasi OS" terdengar keras - aplikasi kami, seperti yang ditulis untuk Android lainnya, akan berjalan pada Harmony, tetapi untuk pekerjaan penuh itu perlu untuk mengganti layanan Google dengan yang serupa Huawei.



Di inDriver, kami menggunakan layanan Google untuk 3 tujuan:

  • Mengirim pemberitahuan push;
  • Definisi lokasi;
  • Google maps.

Push Kit - kirim pemberitahuan push


Sebagai permulaan, Huawei memiliki beberapa dokumentasi yang cukup bagus . Tetapi untuk memulai dengan cepat, cukup gunakan tutorial langkah demi langkah .

Saya tidak akan menceritakan kembali apa yang tertulis di sana, saya hanya akan membahas beberapa hal, karena komentar diperlukan di sini.

Mengaktifkan Layanan

Anda akan diminta untuk mengatur Lokasi Penyimpanan Data. Perhatikan bahwa Anda tidak dapat mengubahnya nanti . Lokasi tidak mempengaruhi operasi langsung dari push, tetapi hanya tempat untuk menyimpan dan memproses data tentang mereka.

Mengintegrasikan HMS SDK

Setelah Anda menyelesaikan integrasi, Anda mungkin akan mengalami masalah dalam membangun proyek. Bagaimanapun, ini adalah kasus pada server build Ubuntu 16.04.5 LTS kami (GNU / Linux 4.4.0-174-generik x86_64), sementara secara lokal pada Mac mini yang berfungsi (akhir 2018, Mojave) semuanya bekerja dengan baik. Anda dapat memperbaiki ini jika Anda menambahkan

Execution failed for task ':app:processIndriverReleaseManifest'. org.gradle.api.GradleException: ERROR: no manifest file found



agcp {
   manifest false
}

di akhir file build.gradledi tingkat aplikasi untuk menonaktifkan manifes untuk agcp. Masalahnya di sini adalah bahwa ia agcpmencari file manifes, tetapi tidak dapat menemukan dan memuatnya, yang kemungkinan besar merupakan masalah agconnect. Setidaknya itulah jawaban resmi dukungan teknis Huawei kepada kami.

Mengkonfigurasi AndroidManifest.xml

Saya tidak tahu mengapa, tetapi tidak mengatakan tentang inisialisasi otomatis, yang dijelaskan pada bagian 2.6 Inisialisasi Otomatis dari dokumentasi lengkap. Ini diperlukan jika Anda mengirim token ke server dalam metode ini

public void onNewToken(String token) {}

Mengirim Pesan: Konsol Kit Dorong HUAWEI.

Dengan itu, Anda dapat memeriksa operasi push. Fakta yang menarik: jika Anda memilih di konsolType: Notification Message, merekaonMessageReceived(RemoteMessage message)akan segera ditampilkan di ponselmelewati pawang.

Ketika saya mengatur push, saya sering harus menggunakan konsol. Baik dia dan dorongan yang dikirim dari server memiliki penundaan hingga 30 menit. Saya berharap ini adalah kesulitan sementara yang sudah ditangani oleh para pengembang.

Sekarang kami memiliki dua layanan push di ponsel kami, tetapi bagaimana kami dapat mengatur kerja bersama mereka? Pertama, Anda perlu menentukan layanan apa yang tersedia di telepon. Di tempat kami, kami memutuskan bahwa layanan Google akan menjadi prioritas bagi kami. Misalkan jika layanan Google dan Huawei tersedia di ponsel, kami bekerja dengan Google.

Kami mengirim bendera status layanan ke server dengan nilai yang mungkin:

- UNKNOWN
- GOOGLE
- HUAWEI

fun checkServices(context: Context): PlayServicesState {
   val googleAPI = GoogleApiAvailability.getInstance()
   when (googleAPI.isGooglePlayServicesAvailable(context)) {
       ConnectionResult.SUCCESS,
       ConnectionResult.SERVICE_MISSING,
       ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED,
       ConnectionResult.SERVICE_DISABLED -> return PlayServicesState.GOOGLE
   }
   val huaweiAPI = HuaweiApiAvailability.getInstance()
   when (huaweiAPI.isHuaweiMobileNoticeAvailable(context)) {
       com.huawei.hms.api.ConnectionResult.SUCCESS,
       com.huawei.hms.api.ConnectionResult.SERVICE_MISSING,
       com.huawei.hms.api.ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED,
       com.huawei.hms.api.ConnectionResult.SERVICE_DISABLED -> return PlayServicesState.HUAWEI
   }
   return PlayServicesState.UNKNOWN
}

Tergantung pada nilai yang diterima, server akan mengirimkan pemberitahuan push ke layanan yang sesuai.

Mengorganisir pekerjaan mereka adalah masalah teknologi. Saya melakukan hal itu.

Penanganan Acara untuk FCM:

class AppFcmListenerService : FirebaseMessagingService() {
   private val cloudMessageHandler: CloudMessageHandler = GoogleMessageHandler(this)
   override fun onMessageReceived(message: RemoteMessage) {
       cloudMessageHandler.onMessageReceived(message)
   }
}

dan HCM:

class AppHmsListenerService : HmsMessageService() {
   private val cloudMessageHandler: CloudMessageHandler = HuaweiMessageHandler(this)
   override fun onMessageReceived(message: RemoteMessage) {
       cloudMessageHandler.onMessageReceived(message)
   }
}

didelegasikan ke kelas abstrak:

abstract class CloudMessageHandler { 
fun onMessageReceived(message: Any) {
   val data = getData(message)
   onMessageReceived(data)
}
private fun onMessageReceived(data: Map<String, String>) {
   //   
}
abstract fun getData(message: Any) :  Map<String, String> {
}

yang memiliki dua implementasi:

untuk FCM:

class FirebaseMessageHandler(override val context: Context) : CloudMessageHandler(context) {
   override fun getData(message: Any): Map<String, String> {
       return (message as RemoteMessage).data
   }
}

untuk HCM:

class HuaweiMessageHandler(override val context: Context) : CloudMessageHandler(context) {
   override fun getData(message: Any): Map<String, String> {
       return (message as RemoteMessage).dataOfMap
   }
}

Kelas Huawei memiliki antarmuka yang hampir mirip dengan layanan Google. Ini "hampir" Saya secara pribadi telah diwujudkan dalam kenyataan bahwa RemoteMessagekeluar com.google.firebase.messaginguntuk Map<String, String>yang Anda ingin menyebutnya RemoteMessage.getData(), dan untuk RemoteMessagekeluar com.huawei.hms.push- getDataOfMap().

Kit Lokasi - penentuan lokasi


Lokasi dapat ditangani LOCATION_SERVICE, yang tersedia tanpa layanan Google dan Huawei. Tetapi untuk layanan transportasi penumpang, penentuan lokasi yang akurat adalah parameter penting. Untungnya, antarmuka dari kelas Kit Lokasi tidak berbeda dari yang dengan nama yang sama untuk layanan Google, sehingga aplikasi mereka dalam kode tidak berbeda. Namun, layanan Huawei kurang akurat dalam pengoperasian. Semoga ini masalah sementara.
Kami juga menemukan fakta bahwa permintaan geolokasi dikirim melalui HMS Core, yang berarti bahwa untuk operasi yang benar perlu menetapkan hak untuk geolokasi sebagai "Selalu izinkan".

lokasi

Mengganti Google Maps


Di CIS, kami menggunakan mesin OSM dengan ubin 2GIS. Pada tahap pertama integrasi, kami memutuskan untuk tidak bekerja dengan Map Kit dari HUAWEI, tetapi cukup menggunakan mesin OSM dengan ubin OSM. Semuanya sederhana.

Sebelum rilis


Saya menyarankan semua orang untuk memperhatikan penyebab umum kegagalan sebelum meluncurkan aplikasi Anda di AppGallery.

Misalnya, tim rilis Huawei memberi tahu kami tentang pelanggaran berikut.

Presentasi Non-Standar Hong Kong dan Makau

Cina sangat teliti tentang kedaulatan wilayah administratif otonomnya dan meminta mereka disebut "wilayah". Ini memaksa kami untuk mengubah semua judul yang menyebutkan negara untuk menyebut negara atau wilayah.



Informasi tentang Produk Pesaing Pihak Ketiga dalam Detail Aplikasi

Jangan lupa untuk menilai aplikasi dengan mengirimkan pengguna ke halaman di Galeri Aplikasi, bukan Google Play Store :)

Secara umum, layanan Huawei mirip dengan layanan Google dan mendukungnya langsung dalam kode tidak menyebabkan kesulitan. Pertanyaan hanya bisa untuk "ekosistem" Huawei secara keseluruhan, tetapi mereka dapat dikaitkan dengan masa mudanya dan dengan probabilitas tinggi semuanya akan lebih baik seiring waktu.

All Articles