// Taobao scopes are independent: userInfo login does not grant camera/album. var denied = {}; function state(settings, scope) { settings = settings || {}; var key = scope.replace(/^scope\./, ''); return typeof settings[scope] === 'boolean' ? settings[scope] : settings[key]; } function settings() { return new Promise(function (resolve) { if (typeof my.getSetting !== 'function') { resolve({}); return; } my.getSetting({ success: function (res) { resolve(res.authSetting || {}); }, fail: function () { resolve({}); } }); }); } function rejected(scope) { var err = new Error(scope === 'scope.camera' ? '相机权限未开启,可在授权设置中开启,或使用相册' : '相册权限未开启,请在授权设置中开启'); err.permission = scope; return err; } function ensure(scope) { return settings().then(function (current) { if (state(current, scope) === true) { delete denied[scope]; return; } if (state(current, scope) === false || denied[scope]) throw rejected(scope); return new Promise(function (resolve, reject) { if (typeof my.authorize !== 'function') { reject(new Error('当前淘宝版本不支持授权,请升级后重试')); return; } my.authorize({ scopes: scope, success: function () { delete denied[scope]; resolve(); }, fail: function () { denied[scope] = true; reject(rejected(scope)); } }); }); }); } function open() { return new Promise(function (resolve, reject) { if (typeof my.openSetting !== 'function') { reject(new Error('请在小程序右上角的授权设置中开启权限')); return; } my.openSetting({ success: function (res) { var current = res.authSetting || {}; ['scope.camera', 'scope.album'].forEach(function (scope) { if (state(current, scope) === true) delete denied[scope]; }); resolve(current); }, fail: function () { reject(new Error('无法打开授权设置,请从小程序右上角进入')); } }); }); } module.exports = { ensure: ensure, settings: settings, state: state, open: open };