UNPKG

mtl-js-sdk

Version:

ynf-fw-mtl-api

157 lines (147 loc) 5.57 kB
import {localizedString} from './localization'; import {invokeSuccess, invokeFail} from './callback' let permissionMap = { camera:'permissionCamera', contacts:'permissionContacts', 'contacts-r':'permissionContacts', 'contacts-r':'permissionContacts', microphone:'permissionMicrophone', photos:'permissionPhotos', 'photos-w':'permissionPhotos', location:'permissionLocation', locationAlways:'permissionLocation', notification:'permissionNotification', calendar:'permissionCalendar', 'calendar-r':'permissionCalendar', 'calendar-w':'permissionCalendar', phone:'permissionPhone', 'phone-call':'permissionPhone', 'phone-r':'permissionPhone', 'phone-r-log':'permissionPhone', 'phone-w-log':'permissionPhone', sensor:'permissionSensor', sms:'permissionSms', 'sms-s':'permissionSms', 'sms-r':'permissionSms', storage:'permissionStorage', 'storage-r':'permissionStorage', 'storage-w':'permissionStorage' }; let requestPermissionAlertFlagMap = {}; let requestPermissionHandlerMap = {}; function getPermissionDesc(name) { let key = permissionMap[name]; let desc = localizedString(key); return desc || ''; } function registerPermissionHandle(name, callback) { let list = requestPermissionHandlerMap[name]; if (list) { list.push(callback); } else { requestPermissionHandlerMap[name] = [callback]; } } function invokePermissionHandle(name, granted) { let list = requestPermissionHandlerMap[name]; if (list) { list.forEach(function(callback) { callback(granted); }); requestPermissionHandlerMap[name] = []; } } export function requestPermission(param) { let resultList = api.hasPermission({list:param.list}); let failedList = resultList.filter(function(item){ return !item.granted; }); if (failedList.length > 0) { if (failedList.length == 1) { // 只处理申请一个权限的情形 let name = failedList[0].name; if (requestPermissionAlertFlagMap[name]) { registerPermissionHandle(name, function(granted){ if (granted) { invokeSuccess(param, {}); } else { invokeFail(param, {code: '-10007', msg:'permission denied'}); } }); return; } else { requestPermissionAlertFlagMap[name] = true; } } let list = []; let undeterminedList = []; let desc = ''; failedList.forEach(function(item) { list.push(item.name); if (item.undetermined) { undeterminedList.push(item.name); } if (desc.length > 0) { desc += ', ' + getPermissionDesc(item.name); } else { desc += getPermissionDesc(item.name); } }); if (undeterminedList.length == list.length && api.systemType == 'ios') { api.requestPermission({ list: list, rationaleDefault: true }, function(res) { let failedList1 = res.list.filter(function(item){ return !item.granted; }); if (failedList1.length > 0) { invokeFail(param, {code: '-10007', msg:'permission denied'}); } else { invokeSuccess(param); } if (failedList.length == 1) { let name = failedList[0].name; requestPermissionAlertFlagMap[name] = false; invokePermissionHandle(name, res.list[0].granted); } }); } else { api.confirm({ title: localizedString('noAccessTitle'), msg: localizedString('noAccessMsgPart1') + desc + localizedString('noAccessMsgPart2'), buttons: [localizedString('cancel'), localizedString('goSetting')] }, function(ret) { if (ret.buttonIndex == 2) { api.requestPermission({ list: list, rationaleDefault: true }, function(res) { let failedList1 = res.list.filter(function(item){ return !item.granted; }); if (failedList1.length > 0) { invokeFail(param, {code: '-10007', msg:'permission denied'}); } else { invokeSuccess(param); } if (failedList.length == 1) { let name = failedList[0].name; requestPermissionAlertFlagMap[name] = false; invokePermissionHandle(name, res.list[0].granted); } }); } else { invokeFail(param, {code: '-10007', msg:'permission denied'}); if (failedList.length == 1) { let name = failedList[0].name; requestPermissionAlertFlagMap[name] = false; invokePermissionHandle(name, false); } } }); } } else { invokeSuccess(param); } }