react-native-app-upgrade
是一個(gè)reactnative版本升級的方案履磨,弄得時(shí)候遇到了很多的問題啥供,因?yàn)閍ndroid不會遇到了很多問題,最后終于是打包出來了展氓,現(xiàn)在記錄一下
GitHub地址
方案的作者是使用原生的方法來實(shí)現(xiàn)的兔综,具體的配置大概如下(我的項(xiàng)目名為App):
android 配置
1.將【 android_upgrade 】包拷貝到你的Android項(xiàng)目包名目錄下(app/src/main/com.xxx)
2.在 app / src / main / res /目錄下創(chuàng)建xml資源文件夾,并創(chuàng)建名稱為【 update_file_provider 】名稱的xml文件只泼,在文件中添加如下代碼:
<paths>
<external-cache-path
name="update_external_cache"
path="." />
<cache-path
name="update_cache"
path="." />
</paths>
注:如果引用了react-native-image-crop-picker
組件,就需要合并了一下react-native-image-crop-picker
組件的xml剖笙,合并后的文件如下:
<paths>
<!--升級-->
<external-cache-path
name="update_external_cache"
path="." />
<cache-path
name="update_cache"
path="." />
<!--image-crop-picker中的不重復(fù)的-->
<external-path name="external_files" path="."/>
</paths>
3.在AndroidMainfest.xml文件下添加權(quán)限和服務(wù)配置
<uses-permission android:name="android.permission.INTERNET" />
<!--8.0安裝需要的權(quán)限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:name=".MainApplication"
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme">
// 添加fileProvider配置代碼
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.updateFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/update_file_provider" />
</provider>
// 添加Service代碼
<service
android:name=".android_upgrade.DownloadService"
android:exported="true" />
// 省略其他代碼...
</application>
如果使用了react-native-image-crop-picker
組件就需要按以下配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
<!--8.0安裝需要的權(quán)限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:allowBackup="true"
android:theme="@style/AppTheme">
<!--// 添加fileProvider配置代碼-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.updateFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/update_file_provider" />
</provider>
<!--// 添加Service代碼-->
<service
android:name=".android_upgrade.DownloadService"
android:exported="true" />
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
</manifest>
4.打開android/app/build.gradle文件,修改 compileSdkVersion 26 buildToolsVersion "26.0.3"请唱,版本指定為26以上即可弥咪。
5.在你的工程目錄中,打開android/app/src/main/res/values/strings.xml文件十绑,添加如下代碼:
<string name="android_auto_update_download_progress">正在下載:%1$d%%</string>
6.在MainApplication.java文件下的getPackages方法中添加如下代碼:[首先要將UpgradePackage導(dǎo)入]
import 項(xiàng)目工程包名.UpgradePackage;
new UpgradePackage()
7.android_upgrade包下的
DownloadService.java 需要將作者的改成自己的包名
UpgradePackage.java如果報(bào)錯(cuò)就是把
@Override
刪了8.如果裝了組件react-native-image-crop-picker
還需要去組件/node_modules/react-native-image-crop-picker/文件夾中修改文件
修改/node_modules/react-native-image-crop-picker/android/src/main/java/com.reactnative/ivpusic/imagepicker/PickerModule.java
文件
1)添加如下代碼:
private String fileProviderAuthorities = "provider";
(2)添加如下方法:
@ReactMethod
public void setFileProviderAuthorities(String fileProviderAuthorities) {
this.fileProviderAuthorities = fileProviderAuthorities;
}
(3) 修改303行代碼聚至,替換成如下方法:
mCameraCaptureURI = FileProvider.getUriForFile(activity,
activity.getApplicationContext().getPackageName() + "." + this.fileProviderAuthorities,
imageFile);
注釋node_modules/react-native-image-crop-picker/android/src/main/AndroidManifest.xml
文件
之后在使用ImagePicker前,先調(diào)用setFileProviderAuthorities方法即可本橙。Android是自己寫的判斷是否安卓
這里有個(gè)要提一下setFileProviderAuthorities
方法應(yīng)該在react_native_image_crop_picker/index.d.ts
進(jìn)行添加
//頁面中調(diào)用
if(Android) {
ImagePicker.setFileProviderAuthorities('updateFileProvider');
}
ImagePicker.openPicker({...})
IOS配置
將ios_upgrade里面的文件拷貝到項(xiàng)目目錄下
使用
1.Android
if(Android) {
this.setState({
apkUrl:'http://XXXXX'
})
Alert.alert('發(fā)現(xiàn)新版本','是否下載',
[
{text:"確定", onPress:() => {
//apkUrl為app下載連接地址
NativeModules.upgrade.upgrade(this.state.apkUrl);
}},
// {text:"取消", onPress:this.opntion2Selected}
{text:"取消"}
]
);
}
DeviceEventEmitter.addListener('LOAD_PROGRESS',(msg)=>{
// let title = "當(dāng)前下載進(jìn)度:" + msg
// if(Android)ToastAndroid.show(title, ToastAndroid.SHORT);
});
2.IOS
//AppId為上架后的應(yīng)用的AppId可以到開發(fā)者中心中查看
if(iOS) {
NativeModules.upgrade.upgrade('AppId',(msg) =>{
if('YES' == msg) {
Alert.alert('發(fā)現(xiàn)新版本','是否下載',
[
{text:"確定", onPress:() => {
//跳轉(zhuǎn)到APP Stroe
NativeModules.upgrade.openAPPStore('AppId');
}},
{text:"取消"}
]
);
} else {
// this.toast('當(dāng)前為最新版本');
}
})
}
注:
react-native使用RNFetchBlob 更新安卓包 http://www.reibang.com/p/0a5af0d60aba