一直都是在海外做react-native的项目。但是最近项目要兼容国内。因此需要在推送方面进行修改(海外使用firebase,国内使用友盟)。
网络检测法检测手机能不能访问谷歌就选择不同的方案,但是后来发现这样做太耗时了,而且受到网络影响很大。因此对它进行改造。但是也有好处,就是不用动原生代码,直接在javascript端搞就完事了。
谷歌-services检测法第一次改造的时候,想到的是我们直接检测手机上是否有谷歌-services。有的话就直接使用firebase。
- 在build.gradle下添加谷歌-services
dependencies{classpath"com.android.tools.build:gradle:4.2.1"classpath'com.谷歌.gms:谷歌-services:4.3.8'}
- 在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'}
- 代码中导出结果给javascript
intres=GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);if(res==ConnectionResult.SUCCESS){//支持}else{//不支持}
这个方案只是做了一半,就不做下去了。因为发现在代码中判断还是太麻烦了。还不如针对供给应用市场的不同的包来达到目的。这样连判断都不需要了。
渠道法该法应该是最优解了,但是步骤繁琐。
在app/build.gradle下添加
android{defaultConfig{manifestPlaceholders=[appStoreName:"china"]}flavorDimensions"version"productFlavors{china{}谷歌{}}productFlavors.all{flavor->flavor.manifestPlaceholders=[appStoreName:name]}}
修改完这里之后,打包命令就变成了
./gradlewassemble${productFlavorName}Release
,按照例子来说,我们的打包命令就有两个了:./gradlewassembleChinaRelease
&./gradlewassembleGoogleRelease
。package.json
"scripts":{"android-谷歌":"react-nativerun-android--variant=谷歌Debug","android-china":"react-nativerun-android--variant=chinaDebug",},
在AndroidManifest添加
<meta-dataandroid:name="appStoreName"android:value="${appStoreName}"/>
这时候使用react-native-android-meta-data就直接在javascript中读取appStoreName就知道用户在哪里下载的APP,如果是谷歌play就直接使用firebase推送即可。
importAndroidMetaDatafrom'react-native-android-meta-data'constres=awaitAndroidMetaData.getKey('appStoreName')if(res==='谷歌'){}else{}