|
|
@@ -0,0 +1,241 @@
|
|
|
+import { permission } from '@/js_sdk/wa-permission/permission.js'
|
|
|
+
|
|
|
+function isAppPlus() {
|
|
|
+ return typeof plus !== 'undefined' && !!plus?.os?.name
|
|
|
+}
|
|
|
+
|
|
|
+export function isIosApp() {
|
|
|
+ if (!isAppPlus()) return false
|
|
|
+ const name = String(plus.os.name || '')
|
|
|
+ return name === 'iOS' || name.includes('iPhone')
|
|
|
+}
|
|
|
+
|
|
|
+function normalizeIosStatus(status) {
|
|
|
+ if (status === null || status === undefined) return -1
|
|
|
+ const num = Number(status)
|
|
|
+ return Number.isNaN(num) ? -1 : num
|
|
|
+}
|
|
|
+
|
|
|
+function getUniAuthorizeSetting() {
|
|
|
+ try {
|
|
|
+ if (typeof uni.getAppAuthorizeSetting === 'function') {
|
|
|
+ return uni.getAppAuthorizeSetting()
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('getUniAuthorizeSetting error', e)
|
|
|
+ }
|
|
|
+ return null
|
|
|
+}
|
|
|
+
|
|
|
+function getUniCameraAuth() {
|
|
|
+ const setting = getUniAuthorizeSetting()
|
|
|
+ return setting?.cameraAuthorized || null
|
|
|
+}
|
|
|
+
|
|
|
+function getUniAlbumAuth() {
|
|
|
+ const setting = getUniAuthorizeSetting()
|
|
|
+ return setting?.albumAuthorized || null
|
|
|
+}
|
|
|
+
|
|
|
+function getIosAuthStatus(type) {
|
|
|
+ if (!isIosApp()) return -1
|
|
|
+ try {
|
|
|
+ if (type === 'camera') {
|
|
|
+ const AVCaptureDevice = plus.ios.importClass('AVCaptureDevice')
|
|
|
+ const status = AVCaptureDevice.authorizationStatusForMediaType('video')
|
|
|
+ return normalizeIosStatus(status)
|
|
|
+ }
|
|
|
+ if (type === 'album') {
|
|
|
+ const PHPhotoLibrary = plus.ios.importClass('PHPhotoLibrary')
|
|
|
+ const status = PHPhotoLibrary.authorizationStatus()
|
|
|
+ return normalizeIosStatus(status)
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('getIosAuthStatus error', e)
|
|
|
+ }
|
|
|
+ return -1
|
|
|
+}
|
|
|
+
|
|
|
+function isIosCameraGranted() {
|
|
|
+ const uniAuth = getUniCameraAuth()
|
|
|
+ if (uniAuth === 'authorized') return true
|
|
|
+ if (uniAuth === 'denied' || uniAuth === 'config error') return false
|
|
|
+
|
|
|
+ const status = getIosAuthStatus('camera')
|
|
|
+ if (status === 3) return true
|
|
|
+ try {
|
|
|
+ return permission.judgeIosPermission('camera') === true
|
|
|
+ } catch {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function isIosAlbumGranted() {
|
|
|
+ const uniAuth = getUniAlbumAuth()
|
|
|
+ if (uniAuth === 'authorized' || uniAuth === 'limited') return true
|
|
|
+ if (uniAuth === 'denied' || uniAuth === 'config error') return false
|
|
|
+
|
|
|
+ const status = getIosAuthStatus('album')
|
|
|
+ return status === 3 || status === 4
|
|
|
+}
|
|
|
+
|
|
|
+function isIosCameraDenied() {
|
|
|
+ const uniAuth = getUniCameraAuth()
|
|
|
+ if (uniAuth === 'denied' || uniAuth === 'config error') return true
|
|
|
+
|
|
|
+ const status = getIosAuthStatus('camera')
|
|
|
+ return status === 1 || status === 2
|
|
|
+}
|
|
|
+
|
|
|
+function isIosAlbumDenied() {
|
|
|
+ const uniAuth = getUniAlbumAuth()
|
|
|
+ if (uniAuth === 'denied' || uniAuth === 'config error') return true
|
|
|
+
|
|
|
+ const status = getIosAuthStatus('album')
|
|
|
+ return status === 1 || status === 2
|
|
|
+}
|
|
|
+
|
|
|
+function requestIosCameraPermission() {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ let settled = false
|
|
|
+ const done = (granted) => {
|
|
|
+ if (settled) return
|
|
|
+ settled = true
|
|
|
+ resolve(!!granted)
|
|
|
+ }
|
|
|
+
|
|
|
+ setTimeout(() => done(false), 15000)
|
|
|
+
|
|
|
+ try {
|
|
|
+ const AVCaptureDevice = plus.ios.importClass('AVCaptureDevice')
|
|
|
+ AVCaptureDevice.requestAccessForMediaTypecompletionHandler('video', (granted) => {
|
|
|
+ done(granted)
|
|
|
+ })
|
|
|
+ } catch (e) {
|
|
|
+ console.error('requestIosCameraPermission error', e)
|
|
|
+ done(false)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function requestIosAlbumPermission() {
|
|
|
+ return new Promise((resolve) => {
|
|
|
+ let settled = false
|
|
|
+ const done = (status) => {
|
|
|
+ if (settled) return
|
|
|
+ settled = true
|
|
|
+ resolve(normalizeIosStatus(status))
|
|
|
+ }
|
|
|
+
|
|
|
+ setTimeout(() => done(-1), 15000)
|
|
|
+
|
|
|
+ try {
|
|
|
+ const PHPhotoLibrary = plus.ios.importClass('PHPhotoLibrary')
|
|
|
+ PHPhotoLibrary.requestAuthorization((status) => {
|
|
|
+ done(status)
|
|
|
+ })
|
|
|
+ } catch (e) {
|
|
|
+ console.error('requestIosAlbumPermission error', e)
|
|
|
+ done(-1)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+async function ensureIosCameraPermission() {
|
|
|
+ if (isIosCameraGranted()) {
|
|
|
+ return 'granted'
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isIosCameraDenied()) {
|
|
|
+ return 'denied'
|
|
|
+ }
|
|
|
+
|
|
|
+ const granted = await requestIosCameraPermission()
|
|
|
+ if (granted || isIosCameraGranted()) {
|
|
|
+ return 'granted'
|
|
|
+ }
|
|
|
+
|
|
|
+ return 'denied'
|
|
|
+}
|
|
|
+
|
|
|
+async function ensureIosAlbumPermission() {
|
|
|
+ if (isIosAlbumGranted()) {
|
|
|
+ return 'granted'
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isIosAlbumDenied()) {
|
|
|
+ return 'denied'
|
|
|
+ }
|
|
|
+
|
|
|
+ const status = await requestIosAlbumPermission()
|
|
|
+ if (status === 3 || status === 4 || isIosAlbumGranted()) {
|
|
|
+ return 'granted'
|
|
|
+ }
|
|
|
+
|
|
|
+ return 'denied'
|
|
|
+}
|
|
|
+
|
|
|
+function getAndroidAlbumPermission() {
|
|
|
+ const Build = plus.android.importClass('android.os.Build')
|
|
|
+ return Build.VERSION.SDK_INT >= 33
|
|
|
+ ? 'android.permission.READ_MEDIA_IMAGES'
|
|
|
+ : 'android.permission.READ_EXTERNAL_STORAGE'
|
|
|
+}
|
|
|
+
|
|
|
+async function ensureAndroidPermission(permissionID) {
|
|
|
+ const granted = await permission.checkAndroidPermission(permissionID)
|
|
|
+ if (granted === 1) return 'granted'
|
|
|
+
|
|
|
+ const result = await permission.requestAndroidPermission(permissionID)
|
|
|
+ if (result === 1) return 'granted'
|
|
|
+ if (result === -1) return 'denied_always'
|
|
|
+ return 'denied'
|
|
|
+}
|
|
|
+
|
|
|
+export async function ensureScanCameraPermission() {
|
|
|
+ if (!isAppPlus()) return 'granted'
|
|
|
+ if (isIosApp()) return ensureIosCameraPermission()
|
|
|
+ return ensureAndroidPermission('android.permission.CAMERA')
|
|
|
+}
|
|
|
+
|
|
|
+export async function ensureScanAlbumPermission() {
|
|
|
+ if (!isAppPlus()) return 'granted'
|
|
|
+ if (isIosApp()) return ensureIosAlbumPermission()
|
|
|
+ return ensureAndroidPermission(getAndroidAlbumPermission())
|
|
|
+}
|
|
|
+
|
|
|
+export function isIosPermissionDenied(type) {
|
|
|
+ if (!isIosApp()) return false
|
|
|
+ return type === 'camera' ? isIosCameraDenied() : isIosAlbumDenied()
|
|
|
+}
|
|
|
+
|
|
|
+export function isPermissionError(error) {
|
|
|
+ const msg = String(error?.errMsg || error?.message || error).toLowerCase()
|
|
|
+ return (
|
|
|
+ error?._permissionDenied === true
|
|
|
+ || msg.includes('permission')
|
|
|
+ || msg.includes('authorize')
|
|
|
+ || msg.includes('auth deny')
|
|
|
+ || msg.includes('auth')
|
|
|
+ || msg.includes('权限')
|
|
|
+ || msg.includes('no permission')
|
|
|
+ || msg.includes('denied')
|
|
|
+ || msg.includes('拒绝')
|
|
|
+ || msg.includes('未授权')
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+export function shouldGuideToSettings(state) {
|
|
|
+ if (state === 'denied_always') return true
|
|
|
+ if (state === 'denied' && isIosApp()) return true
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+export function openAppPermissionSetting() {
|
|
|
+ if (!isAppPlus()) return
|
|
|
+ if (typeof uni.openAppAuthorizeSetting === 'function') {
|
|
|
+ uni.openAppAuthorizeSetting({})
|
|
|
+ return
|
|
|
+ }
|
|
|
+ permission.gotoAppPermissionSetting()
|
|
|
+}
|