当前位置:

Android - 在 react-native 解决海内外的推送

访客 2024-04-22 1255 0

一直都是在海外做react-native的项目。但是最近项目要兼容国内。因此需要在推送方面进行修改(海外使用firebase,国内使用友盟)。

网络检测法

检测手机能不能访问谷歌就选择不同的方案,但是后来发现这样做太耗时了,而且受到网络影响很大。因此对它进行改造。但是也有好处,就是不用动原生代码,直接在javascript端搞就完事了。

谷歌-services检测法

第一次改造的时候,想到的是我们直接检测手机上是否有谷歌-services。有的话就直接使用firebase。

  1. 在build.gradle下添加谷歌-servicesdependencies{classpath"com.android.tools.build:gradle:4.2.1"classpath'com.谷歌.gms:谷歌-services:4.3.8'}
  2. 在app/build.gradle下添加谷歌-services的一些基础库dependencies{implementation'com.谷歌.android.gms:play-services-base:17.6.0'implementation'com.谷歌.android.gms:play-services-maps:17.0.1'implementation'com.谷歌.android.gms:play-services-analytics:17.0.0'}
  3. 代码中导出结果给javascriptintres=GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);if(res==ConnectionResult.SUCCESS){//支持}else{//不支持}

这个方案只是做了一半,就不做下去了。因为发现在代码中判断还是太麻烦了。还不如针对供给应用市场的不同的包来达到目的。这样连判断都不需要了。

渠道法

该法应该是最优解了,但是步骤繁琐。

  1. 在app/build.gradle下添加

    android{defaultConfig{manifestPlaceholders=[appStoreName:"china"]}flavorDimensions"version"productFlavors{china{}谷歌{}}productFlavors.all{flavor->flavor.manifestPlaceholders=[appStoreName:name]}}

    修改完这里之后,打包命令就变成了./gradlewassemble${productFlavorName}Release,按照例子来说,我们的打包命令就有两个了:./gradlewassembleChinaRelease&./gradlewassembleGoogleRelease

  2. package.json

    "scripts":{"android-谷歌":"react-nativerun-android--variant=谷歌Debug","android-china":"react-nativerun-android--variant=chinaDebug",},
  3. 在AndroidManifest添加

    <meta-dataandroid:name="appStoreName"android:value="${appStoreName}"/>
  4. 这时候使用react-native-android-meta-data就直接在javascript中读取appStoreName就知道用户在哪里下载的APP,如果是谷歌play就直接使用firebase推送即可。

    importAndroidMetaDatafrom'react-native-android-meta-data'constres=awaitAndroidMetaData.getKey('appStoreName')if(res==='谷歌'){}else{}

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~