微信、企微小程式使用taro對位置許可權進行處理

story.Write(z)發表於2024-04-23

1.功能

當使用者未授權地理位置許可權時,引導使用者開啟地理位置許可權,區別於之前的uni處理,uni的處理 的處理沒有手機系統關閉位置許可權的處理,但是uni文章中對於開啟位置許可權後重新返回小程式有做許可權重獲取,當前文章未做處理

2.無授權情況分為(截圖示例為iphone手機)

2.1 手機系統未開啟位置授權 無法透過程式碼跳轉到該設定頁面

image

2.2 微信、企微App未授權 可以透過程式碼跳轉設定頁面

image
image

2.3 小程式未授權 可以透過程式碼跳轉設定頁面

image

3.程式碼

其中$dialog為提示框,具有確認取消按鈕,點選後會執行對應邏輯可以換成對應專案的元件

async function checkAndAuthLocationAuth(): Promise<boolean> {
  return new Promise(async (resolve, reject) => {
    const systemRes = await taro.getSystemInfo()
    if (!systemRes.locationEnabled) {
      $dialog({
        title: '提示',
        render: () => '當前系統,未開啟定位許可權,請在設定中開啟系統定位許可權!',
        cancelButton: true,
        confirmButton: true,
        handleConfirm: async () => {
        }
      })
      return reject(false)
    } else {
      const appAuthorizeSetting = await taro.getAppAuthorizeSetting()
      const appAuthObj = {
        title: '提示',
        render: () =>
          '當前App未開啟定位許可權,請在設定中開啟App定位許可權!',
        cancelButton: true,
        confirmButton: true,
        handleConfirm: async () => {
          taro.openAppAuthorizeSetting({})
        }

      }
      switch (appAuthorizeSetting.locationAuthorized) {
        case 'authorized':
          const wxMiniSetting = await taro.getSetting()

          if (wxMiniSetting.authSetting['scope.userLocation']) {
           // 成功獲取後你可以直接根據專案業務需求決定此處是否直接獲取經緯度等

            return resolve(true)
          }else if (wxMiniSetting.authSetting['scope.userLocation'] === undefined) {
              const authRes = await taro.authorize({ scope: 'scope.userLocation' })
              if (authRes.errMsg === 'authorize:ok') {
           // 成功獲取後你可以直接根據專案業務需求決定此處是否直接獲取經緯度等
                resolve(true)
              } else {
			  // 拒絕後這裡可以直接再次提示以及一些業務邏輯處理
              }
            } 
		  else {
            $dialog({
              title: '提示',
              render: () =>
                '您的賬號尚未獲取或已拒絕“獲取位置資訊”,暫時無法使用該功能,是否確認授權?',
              cancelButton: true,
              confirmButton: true,
              handleConfirm: async () => {
                taro.openSetting({})
              },
            })
          }
          return reject(false)
        case 'denied':
          $dialog(appAuthObj)
          return reject(false)
        case 'not determined':
          $dialog(appAuthObj)
          return reject('')
        default:
          break;
      }
    }
  })
}

使用示例

await checkAndAuthLocationAuth()

// 業務邏輯 如果未成功獲取則不會走到業務邏輯程式碼中
...
...

// 業務邏輯結束

相關文章