在舊版本,要獲取設備權限(如讀寫權限等)直接在項目中配置即可,無需過問app用戶。在新版本的API中,出於安全考慮,要獲取設備的相應權限需要通過權限請求,用戶通過之後纔可以獲取權限,android和ios的獲取權限方式不同。
android權限
官方提供了PermissionsAndroid來獲取權限,以獲取WRITE權限爲例,看如下代碼:
UNSAFE_componentWillMount() {
this.requestReadPermission();
}
async requestReadPermission() {
try {
const os = Platform.OS; // android or ios
if(os === 'android'){
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
{
//第一次請求【拒絕】後提示用戶你爲什麼要這個權限
'title': '我要讀寫權限',
'message': '沒權限我不能工作,同意就好了'
}
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log('你已獲取了讀寫權限');
// 繼續運行其它代碼
} else {
console.log('獲取讀寫權限失敗');
}
}else{
console.log('你已獲取了讀寫權限');
// 繼續運行其它代碼
}
} catch (err) {
console.log(err.toString());
}
}
PermissionsAndroid支持的權限類別可以到官網查看,這樣在用戶首次啓動app時將會收到讀寫權限的請求詢問。除此之外,最好還要在android/app/src/main/AndroidManifest.xml配置上
// 這裏你需要什麼權限就配置什麼權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
ios權限
ios配置權限較複雜,以常用的獲取相冊的讀寫權限爲例,需要鏈接RCTCameraRoll庫(也有部分權限只需配置Info.plist即可,視官方RN庫支持程度而定)。
(1) 進入到工程項目中的 node_module/react-native/Libraries/CameraRoll
(2) 把 RCTCameraRoll.xcodeproj 添加到在項目工程的 Liberaries 文件夾下
(3) 在 Build Phases -> Link Binary With Libraries 裏添加 libRCTCameraRoll.a
(4) 由於蘋果安全策略更新,還需要在 Info.plist 配置請求照片相的關描述字段(Privacy - Photo Library Usage Description)
這樣,就可以在程序中使用讀寫權限了,以相冊爲例:
CameraRoll.getPhotos(...) // 獲取相冊照片或視頻
CameraRoll.saveToCameraRoll(...) // 保存照片或視頻
關於CameraRoll用法,將在下篇中詳解。