كيف أضفنا دعم Harmony OS إلى تطبيق inDriver Android

بدأ كل شيء بحقيقة أن وزارة التجارة الأمريكية أدرجت Huawei في قائمة الشركات التي يُحظر معها إجراء أعمال تجارية مع الشركات الأمريكية . كان رد Huawei هو نظام التشغيل Harmony OS لهواتفها الذكية ، ورفض استخدام خدمات Google فيه. ولكي لا نخسر جزءًا من السوق ، قمنا بدمج دعمها في inDriver. على الرغم من أن "دمج نظام التشغيل" يبدو مرتفعًا - فإن تطبيقنا ، مثل أي تطبيق آخر مكتوب لنظام Android ، سيتم تشغيله على Harmony ، ولكن بالنسبة للعمل الكامل ، من الضروري استبدال خدمات Google بخدمات Huawei مماثلة.



في InDriver ، نستخدم خدمات Google لثلاثة أغراض:

  • إرسال إشعارات الدفع ؛
  • تعريف الموقع
  • خرائط جوجل.

Push Kit - إرسال إشعارات الدفع


بالنسبة للمبتدئين ، لدى Huawei بعض الوثائق الجيدة . ولكن لبدء سريع ، ما عليك سوى استخدام البرنامج التعليمي خطوة بخطوة .

لن أعيد رواية ما هو مكتوب هناك ، وسوف أتناول فقط بعض النقاط ، حيث أن التعليقات مطلوبة هنا.

تمكين الخدمة

سيُطلب منك إعداد موقع تخزين البيانات. لاحظ أنه لا يمكنك تغييره لاحقًا . لا يؤثر الموقع على التشغيل المباشر للدفع ، ولكنه مجرد مكان لتخزين ومعالجة البيانات المتعلقة بها.

دمج HMS SDK

بعد إكمال الدمج ، ربما تواجه مشاكل في بناء المشروع. على أي حال ، كان هذا هو الحال على خادم بناء Ubuntu 16.04.5 LTS (GNU / Linux 4.4.0-174-generic x86_64) ، بينما كان يعمل محليًا على جهاز Mac mini (أواخر 2018 ، Mojave) بشكل جيد. يمكنك إصلاح هذا إذا قمت بإضافة

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



agcp {
   manifest false
}

في نهاية الملف build.gradleعلى مستوى التطبيق لتعطيل البيان الخاص بـ agcp. المشكلة هنا هي أنها agcpتبحث عن ملف بيان ، ولكن لا يمكن العثور عليه وتحميله ، وهو على الأرجح مشكلة agconnect. على الأقل هكذا رد علينا الدعم الفني الرسمي من Huawei.

تكوين AndroidManifest.xml

أنا لا أعرف السبب ، لكنه لا يقول عن التهيئة التلقائية ، وهو موضح في القسم 2.6 التهيئة التلقائية للوثائق الكاملة. يعد ذلك ضروريًا إذا قمت بإرسال رمز مميز إلى الخادم في الطريقة

public void onNewToken(String token) {}

إرسال الرسائل: وحدة تحكم دفع HUAWEI.

مع ذلك ، يمكنك التحقق من تشغيل الدفع. حقيقة مثيرة للاهتمام: إذا حددت في وحدة التحكمType: Notification Message،onMessageReceived(RemoteMessage message)فسيتم عرضها على الفور على الهاتفمتجاوزًا المعالج.

عندما قمت بإعداد الدفع ، كان عليّ في الغالب استخدام وحدة التحكم. تأخرت هي والضغطات المرسلة من الخادم لمدة تصل إلى 30 دقيقة. آمل أن تكون هذه صعوبات مؤقتة عالجها المطورون بالفعل.

الآن لدينا خدمتان دفع على هاتفنا ، ولكن كيف يمكننا تنظيم عملهما المشترك؟ تحتاج أولاً إلى تحديد الخدمات المتاحة على الهاتف. قررنا في مكاننا أن خدمات Google ستكون ذات أولوية بالنسبة لنا. لنفترض أنه في حالة توفر كل من خدمات Google و Huawei على الهاتف ، فنحن نعمل مع Google.

نرسل علامة حالة الخدمات إلى الخادم بقيم محتملة:

- 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
}

بناءً على القيمة المستلمة ، سيرسل الخادم إشعارات الدفع إلى الخدمة المقابلة.

تنظيم عملهم هو مسألة تقنية. لقد فعلت ذلك.

معالجة الأحداث لـ FCM:

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

و HCM:

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

مفوض إلى الفئة المجردة:

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> {
}

الذي يحتوي على تطبيقين:

لـ FCM:

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

لـ HCM:

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

تتمتع فصول Huawei بواجهة مشابهة تقريبًا مع خدمات Google. هذا "تقريبا" انا اظهرت شخصيا في حقيقة أن RemoteMessageالخروج com.google.firebase.messagingعن Map<String, String>الذي تريد الاتصال به RemoteMessage.getData()، و RemoteMessageالخروج com.huawei.hms.push- getDataOfMap().

كيت الموقع - تحديد الموقع


يمكن التعامل مع المواقع LOCATION_SERVICE، والتي تتوفر بدون خدمات Google و Huawei. ولكن بالنسبة لخدمة نقل الركاب ، يعد تحديد الموقع بدقة معلمة مهمة. لحسن الحظ ، لم تختلف واجهات فئات الموقع عن تلك التي تحمل الاسم نفسه لخدمات Google ، لذلك لم يختلف تطبيقها في الرمز. ومع ذلك ، كانت خدمات Huawei أقل دقة في التشغيل. أتمنى أن تكون هذه مشكلة مؤقتة.
لقد واجهنا أيضًا حقيقة أن طلب تحديد الموقع الجغرافي يتم إرساله من خلال HMS Core ، مما يعني أنه من أجل التشغيل الصحيح ، من الضروري تعيين حقوق تحديد الموقع الجغرافي على أنها "تسمح دائمًا".

موقعك

استبدال خرائط جوجل


في رابطة الدول المستقلة ، استخدمنا محرك OSM مع بلاط 2GIS. في المرحلة الأولى من الدمج ، قررنا عدم العمل مع Map Kit من HUAWEI ، ولكن ببساطة استخدم محرك OSM مع بلاط OSM. كل شيء بسيط.

قبل الإفراج


أنصح الجميع بالاهتمام بالأسباب الشائعة للفشل قبل تشغيل تطبيقك في AppGallery.

على سبيل المثال ، أبلغنا فريق إصدار Huawei بالانتهاكات التالية.

التقديم غير المعياري لهونج كونج وماكاو

الصين هو دقيق حول سيادة مناطقها الإدارية المستقلة ويطلب منها أن يطلق عليها "المنطقة". أجبرنا ذلك على تغيير جميع العناوين التي تذكر الدولة لتذكر الدولة أو المنطقة.



معلومات حول المنتجات المنافسة للجهات الخارجية في تفاصيل التطبيق

لا تنسَ تقييم التطبيق عن طريق إرسال المستخدم إلى الصفحة في معرض التطبيقات ، وليس متجر Google Play :)

بشكل عام ، تشبه خدمات Huawei خدمات Google ولا يؤدي دعمها مباشرة في الرمز إلى حدوث صعوبات. يمكن أن تكون الأسئلة فقط على "النظام البيئي" لشركة Huawei ككل ، ولكن يمكن أن تُعزى إلى شبابها وباحتمال كبير أن كل شيء سيكون أفضل مع مرور الوقت.

All Articles