关于uniapp唤起用户授权之前新增权限说明弹窗解决方法

2 篇文章 0 订阅

使用背景

在国内应用市场审核标准更新之后,部分厂商需要在用户授权之前添加权限说明

这里先附上uniapp官网关于国内应用市场相关注意事项文档

代码实现

话不多说,直接上代码, 对于ios系统,这里不做处理

/**
 * 是否为ios
 * @returns {Promise<unknown>}
 */
const checkIsIos = async () => {
  return new Promise((resolve => {
    uni.getSystemInfo({
      success: function (res) {
        resolve(res.osName === "ios")
      }
    });
  }))
}
const contentData = {
  ['android.permission.BLUETOOTH_CONNECT']: {
    title: "蓝牙权限:",
    describe: "授权应用程序连接到蓝牙设备,实现数据传输或其他蓝牙功能。\n"
  },
  ['android.permission.BLUETOOTH_ADMIN']: {
    title: "蓝牙权限:",
    describe: "授权应用程序连接到蓝牙设备,实现数据传输或其他蓝牙功能。\n"
  },
  ['android.permission.ACCESS_FINE_LOCATION']: {
    title: "定位权限:",
    describe: "获取您的当前位置信息,用于提供定位服务。\n"
  },
  ['android.permission.ACCESS_COARSE_LOCATION']: {
    title: "定位权限:",
    describe: "获取您的当前位置信息,用于提供定位服务。\n"
  },
  ["android.permission.READ_EXTERNAL_STORAGE"]: {
    title: "存储权限:",
    describe: "允许访问您的存储空间,用于发送或保存照片、文件和日志。\n"
  },
  ["android.permission.CAMERA"]: {
    title: "摄像头权限:",
    describe: "用于访问您的设备摄像头,以便拍摄照片,提供实时图像功能。 \n"
  },
  ["android.permission.CALL_PHONE"]: {
    title: "拨打电话权限:",
    describe: "用于应用程序唤起手机电话,拨打电话。\n"
  },
}
export default class authorizeUtils {
  /**
   * 授权前告知用户使用意图
   * @param content
   * @returns
   */
  static checkAuth = async (authorize, callBack) => {
    // ios端在manifest.json配置权限使用说明,以下权限判断仅在安卓端可用
    let isIos = await checkIsIos()
    if (isIos) callBack()
    let desc = ''
    let compat = plus.android.importClass('androidx.core.content.ContextCompat')
    let context = plus.android.runtimeMainActivity()
    let authFlag = true
    let res = compat.checkSelfPermission(context, authorize)
    if (res !== 0) {
      authFlag = false
      desc = contentData[authorize].title + contentData[authorize].describe
    }
    if (!authFlag) {
      uni.showModal({
        title: '获取权限说明',
        content: desc,
        success: (res) => {
          console.log(res)
          if (!!res.confirm) {
            plus.android.requestPermissions([authorize], (res) => {
              if (res.granted.length > 0) {
                callBack()
              } else {
                this.showManualAuth(authorize)
              }
            })
          }
        },
        fail: () => {
        }
      })
    } else {
      callBack()
    }
  }
  /**
   * 用户拒绝授权提示手动授权
   * @param authorize
   * @returns {Promise<boolean>}
   */
  static showManualAuth = async (authorize) => {
    let isIos = await checkIsIos()
    if (isIos) return true
    const contentData = {
      ['android.permission.BLUETOOTH']: {
        title: "蓝牙权限:",
        describe: "授权应用程序连接到蓝牙设备,实现数据传输或其他蓝牙功能。\n"
      },
      ['android.permission.BLUETOOTH_CONNECT']: {
        title: "蓝牙权限:",
        describe: "授权应用程序连接到蓝牙设备,实现数据传输或其他蓝牙功能。\n"
      },
      ['android.permission.BLUETOOTH_ADMIN']: {
        title: "蓝牙权限:",
        describe: "授权应用程序连接到蓝牙设备,实现数据传输或其他蓝牙功能。\n"
      },
      ['android.permission.ACCESS_FINE_LOCATION']: {
        title: "定位权限:",
        describe: "获取您的当前位置信息,用于提供定位服务。\n"
      },
      ['android.permission.ACCESS_COARSE_LOCATION']: {
        title: "定位权限:",
        describe: "获取您的当前位置信息,用于提供定位服务。\n"
      },
      ["android.permission.READ_EXTERNAL_STORAGE"]: {
        title: "存储权限:",
        describe: "允许访问您的存储空间,用于发送或保存照片、文件和日志。\n"
      },
      ["android.permission.CAMERA"]: {
        title: "摄像头权限:",
        describe: "用于访问您的设备摄像头,以便拍摄照片,提供实时图像功能。 \n"
      },
      ["android.permission.CALL_PHONE"]: {
        title: "拨打电话权限:",
        describe: "用于应用程序唤起手机电话,拨打电话。\n"
      },
    }
    uni.showModal({
      title: '提示',
      content: contentData[authorize].title + contentData[authorize].describe,
      confirmText: "去设置",
      success: (res) => {
        if (res.confirm) {
          uni.openAppAuthorizeSetting({
            success(res) {
              console.log(res);
            }
          });
        }
        if (res.cancel) {
          console.log('用户点击取消');
        }
      }
    });
  }
}

使用方式

在需要唤起授权的实践中直接调用authorizeUtils.checkAuth(permissonCode, callback),permissionCode为andriod权限code, callback为授权成功之后的回调函数
举例如下:

<template>
  <view class="uni-btn-v">
    <button @click="makeCall">拨打电话</button>
  </view>
</template>

<script setup>
import authorizeUtils from "@/utils/authorizeUtils.ts"

const makeCall = () => {
  authorizeUtils.checkAuth('android.permission.CALL_PHONE', () => {
    // ...这里添加拨打电话的逻辑
  })
}
 
</script>
uni-app可以通过尝试唤起app来实现与原生app的交互。具体的实现方式取决于不同的平台和环境。 在iOS平台上,需要在Xcode中进行配置,添加一个白名单,以允许其他应用程序通过URL Scheme来唤起你的uni-app。这样,当其他应用程序尝试通过URL Scheme打开你的uni-app时,系统会自动将控制权转移到你的应用程序。 在Android平台上,可以使用intent来唤起其他应用程序。你可以使用uni-app提供的API uni.navigateToMiniProgram() 或 uni.navigateTo() 来实现跳转到其他应用程序。 需要注意的是,由于微信屏蔽了schema协议,所以在微信内部无法直接通过URL Scheme来唤起其他应用程序。在这种情况下,可以通过引导用户点击按钮或链接,然后跳转到应用商店下载你的app。 以下是一个示例代码,演示如何在uni-app中尝试唤起app: ```javascript // 尝试唤起app function openApp() { // 判断是否在微信内部 if (isWechat()) { // 在微信内部,引导用户下载app window.location.href = 'https://your-app-download-url'; } else { // 不在微信内部,尝试唤起app // 在这里根据不同的平台和环境使用不同的方法唤起app // 例如,在iOS上可以使用window.location.href = 'your-app-url-scheme'; // 在Android上可以使用window.location.href = 'intent://your-app-url#Intent;scheme=your-app-scheme;package=your-app-package;end'; } } // 判断是否在微信内部 function isWechat() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger") { return true; } else { return false; } } // 调用唤起app的函数 openApp(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值