React Native HMS Core с Expo

Экспо

Expo может быть фантастическим инструментом для ускорения процесса разработки, управления различными платформами, а также учетными данными.

К сожалению, для того, чтобы сделать этот инструмент по-настоящему полным, не хватает еще многих вещей, а разработчики неохотно интегрируют определенные технологии из-за глубокой природы Expo и ее философии.

Именно поэтому они запустили новую систему сборки eas-cli, которая должна наконец заменить классический сервис expo-cli.

Хуавей

Huawei отделилась от Google, а HMS (Huawei Mobile Services) еще не интегрирована в среду Expo. Таким образом, некоторые сервисы, такие как карта, push-уведомления и т. д., нельзя использовать на последней версии Huawei.
Однако это означает значительную долю рынка, когда вы хотите распространять приложение среди широкой публики.

Вот почему мне абсолютно необходимо было найти решение.

Выставочные плагины

Теперь можно создавать плагины Expo для изменения определенных ресурсов перед фазой предварительной сборки Expo, т. е. создавать файлы конфигурации, относящиеся к Android и iOS.
Поэтому я начал с этого принципа, чтобы добавить все, что нужно HMS Core для работы.

Шаги

  1. Учетная запись разработчика Huawei
    Начните с создания учетной записи в AppGallery
    Если вы представляете компанию, вам нужно будет заполнить форму, чтобы Huawei могла проверить вашу информацию и предоставить или отказать вам в доступе к своей платформе. Процесс проверки может занять 1-2 дня.
  2. Плагины
    Я создал 3 плагина, которые используют хуки из @expo/config-plugins и позволяют добавлять разные зависимости и разрешения в project.gradle, app.gradle и AndroidManifest. файлы.
  • Проект Gradle
    Собственная зависимость от Huawei
  • App Gradle
    Импорт подключаемого модуля конфигурации Huawei
  • Манифест
    Добавить разрешение AppGallery

3. Составьте список своих плагинов.

Не забудьте указать ссылки на свои плагины в app.config.js или app.json, чтобы они применялись.

"plugins": [
         "./android-custom-permissions-plugin",
         "./custom-project-gradle-plugin",
         "./custom-app-gradle-plugin",
         ...

4. Добавить файл сервисов Huawei.

Как и в случае с Google, при настройке вашего приложения в AppGallery будет создан файл сервисов для включения в ваш проект.
С той разницей, что для Google Expo управляет процессом, и поэтому вам нужно только указать его в файле app.config. js или app.json и вставьте файл в корень вашего проекта.

Здесь вам нужно будет поместить его в /android/app, который создается только после этапа предварительной сборки.

Поэтому я решил создать сценарий после установки (после этапа предварительной сборки установки зависимостей), чтобы переместить файл в нужную папку.
Если у вас есть лучшее решение, свяжитесь со мной!

В моем package.json:

"scripts":{
…
"eas-build-post-install": "mv agconnect-services.json android/app/agconnect-services.json"

Примечание:
Если вы используете разные профили сборки eas с другим именем пакета и, следовательно, разные файлы конфигурации, вы можете использовать здесь переменные env и проверить, существует ли этот файл, а также папка android, которой нет в iOS:

[[ -f agconnect-services-${EAS_BUILD_PROFILE}.json ]] && [[ -d android ]] && mv agconnect-services-${EAS_BUILD_PROFILE}.json android/app/agconnect-services.json  || echo 'No huawei services files or no android folder'

5. Библиотеки HMS

Наконец, установите необходимые библиотеки HMS здесь
https://github.com/HMS-Core/hms-react-native-plugin

Обратите внимание, что для некоторых библиотек могут потребоваться дополнительные действия, для своих тестов я использовал MapKit

6. Создать

Наконец, создайте новую сборку с помощью ea build, загрузите APK-файл на свое устройство Huawei и вуаля!

Примечания

Управляйте своим файлом хранилища ключей
Как и в случае со службами Google, вам нужен файл хранилища ключей, сгенерированный с помощью keytool.
Либо создайте его вручную, либо позвольте Expo справиться с этим процессом, но вам потребуется загрузить его в AppGallery.

Обфускация
Будьте осторожны, если вы обфускируете свой код через proguard, вам придется добавить исключение в файл proguard-rules.pro или использовать Expo BuildProperties

https://docs.expo.dev/versions/v45.0.0/sdk/build-properties/
https://developer.huawei.com/consumer/en/doc/HMS-Plugin-Guides /config-obfuscation-0000001061770075-V1

Заключение

Expo остается мощным и практичным фреймворком, но такого рода проблемы могут обескуражить не одного, и я очень надеюсь, что в будущем будет проще интегрировать нативные библиотеки и документация станет понятнее.

Я никогда не писал статьи, но обнаружил, что документация настолько скудна, и никто, похоже, не интересовался этой проблемой (или не делился своими решениями), что мне захотелось поделиться ею со всеми.
Надеюсь, я смог помогите некоторым людям, потому что мне действительно было трудно найти информацию о плагинах expo, и мне пришлось сделать много попыток, прежде чем я туда попал.