用到的三方庫:react-native-permissions
import { Platform } from 'react-native'
import { check, checkMultiple, PERMISSIONS, request, requestMultiple, RESULTS } from 'react-native-permissions'
/**
* 單個權限檢查
* @param {object} permission
* {
ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
android: {
type: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
title: '請求獲取模糊的定位權限',
message: '僅用於模糊標識'
}
}
* @returns RESULTS
*/
export const checkPermission = async permission => {
const platform = Platform.select(permission)
if (Platform.OS === 'android') {
const result = await check(platform.type)
if (result === RESULTS.DENIED) {
return await request(platform.type, {
title: platform.title,
message: platform.message,
buttonPositive: '好的',
buttonNegative: '拒絕'
})
}
return result
} else {
if (!platform) return RESULTS.GRANTED
const result = await check(platform)
if (result === RESULTS.DENIED) {
return await request(platform)
}
return result
}
}
/**
* 同時檢查多個權限
* @param {*} permissions
* {
ios: [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE, PERMISSIONS.IOS.CAMERA],
android: {
types: [PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION, PERMISSIONS.ANDROID.CAMERA],
title: 'xxxx',
message: 'xxxxxxxxx'
}
}
*/
export const checkMultiplePermissions = async permissions => {
const platform = Platform.select(permissions)
if (Platform.OS === 'android') {
const permissionTypes = platform.types
const result = await checkMultiple(permissionTypes)
const deniedTypes = []
for (const pt of permissionTypes) {
if (result[pt] === RESULTS.DENIED) {
deniedTypes.push(pt)
}
}
if (!deniedTypes.length) return result
return {
...result,
...(await requestMultiple(deniedTypes, {
title: platform.title,
message: platform.message,
buttonPositive: '好的',
buttonNegative: '拒絕'
}))
}
} else {
const result = await checkMultiple(platform)
const deniedTypes = []
for (const pt of platform) {
if (result[pt] === RESULTS.DENIED) {
deniedTypes.push(pt)
}
}
if (!deniedTypes.length) return result
return {
...result,
...(await requestMultiple(deniedTypes))
}
}
}
/**
* 檢查是否有使用用戶定位的權限
* @returns RESULTS
*/
export const checkLocationPermission = async () =>
checkPermission({
ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
android: {
type: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
title: '請求獲取模糊的定位權限',
message: '僅用於模糊標識'
}
})
/**
* 檢查是否有讀取相冊的權限
* @returns RESULTS
*/
export const checkReadFromLibraryPermission = async title => {
const type =
Platform.Version >= 33 ? PERMISSIONS.ANDROID.READ_MEDIA_IMAGES : PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE
return checkPermission({
ios: PERMISSIONS.IOS.PHOTO_LIBRARY,
android: { type, title: title || '更換頭像/意見反饋等, 需要相冊權限' }
})
}
/**
* 檢查是否有寫入相冊的權限
* @returns RESULTS
*/
export const checkWriteToLibraryPermission = async title =>
await checkMultiplePermissions({
ios: [PERMISSIONS.IOS.PHOTO_LIBRARY],
android: {
types: [PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE],
title: title || '下載推廣資源, 需要相冊的寫入權限'
}
})
/**
* 檢查是否有使用相機權限
* @returns RESULTS
*/
export const checkCameraPermission = async title =>
checkMultiplePermissions({
ios: [PERMISSIONS.IOS.CAMERA],
android: {
types: [PERMISSIONS.ANDROID.CAMERA, PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE],
title: title || '更換頭像/意見反饋等, 需要相機權限'
}
})