微信小程序wx.opensetting废弃之后的二次授权

最近要写小程序,发现很多api废弃不能使用的情况。如现在模拟一个需求,获取地理位置授权,用户首次进入获取其地理位置信息要先经过授权,如果用户同意那么将成功获取到其地理位置,然后页面显示一个‘获取位置信息’按钮,点击后跳到地图并标识其当前所在位置,如果开始授权时用户拒绝了,那么页面会显示一个‘授权并获取位置信息’按钮,用户点击后会跳到授权设置页面,需要用户手动设置,设置后根据设置结果,如果设置了同意那么返回后显示地图上的其所在位置,如果没有设置同意返回后还是显示‘授权并获取位置信息’按钮。



注意这里有个问题要注意,用户第一次拒绝授权弹框后短期内微信会认为用户拒绝该授权意愿并且不会再次吊起授权弹框,目前发现能够吊起授权弹框的有wx.getLocation、 wx.authorize但是用户拒绝后短期内调用这些api也不会出现授权弹框了,这里我们需要让用户二次授权,而二次授权就需要用户主动设置勾选(上图)‘使用我的地理位置’,这是这个问题的解决思路。那么看一下应该怎么写,调用这个“二次授权”设置页之前使用的api是wx.opensetting,即打开设置,这里引用别人的一段代码:

//index.js
//获取应用实例
Page({
  data: { location: {} },
  onLoad: function () {
    var that = this
    wx.getLocation({//弹出授权用户确认后获取其地理位置
      type: 'wgs84',
      success: function (res) {
        that.setData({
          location: {
            longitude: res.longitude,
            latitude: res.latitude
          }
        })
      }
    })
    //判断是否获得了用户地理位置授权
    wx.getSetting({
      success: (res) => {
        if (!res.authSetting['scope.userLocation'])
          that.openConfirm()
      }
    })
  },

  openConfirm: function () {
    wx.showModal({
      content: '检测到您没打开美团外卖的定位权限,是否去设置打开?',
      confirmText: "确认",
      cancelText: "取消",
      success: function (res) {
        console.log(res);
        //点击“确认”时打开设置页面
        if (res.confirm) {
          console.log('用户点击确认')
          wx.openSetting({
            success: (res) => { }
          })
        } else {
          console.log('用户点击取消')
        }
      }
    });
  },
})

当然这段细节的需求跟我一开始写的自己的需求有些不一样,这段代码要做的是进页面时获取地理授权位置信息,然后判断是否获取了授权,如果没有那么弹出一个提示框主动引导授权,这里认为如果是应用是获取地理位置是必须的如外卖小程序,那么引导用户二次授权是必须的,如果本应用对用户的位置可需可不需那么可以做成我一开始描述的那种需求。这里需注意到的是两个API wx.getSetting和wx.openSetting,分别是用户做了哪些授权设置和打开设置页面(我放的第一张图)。注意现在由于1.wx.openSetting已经废弃,要用button去主动触发授权(这里可以去搜小程序文档wx.openSetting),2.wx.getSetting也将要废弃所以我修改后的代码如下(根据我自己一开始的需求)

<button wx:if="{{ldata}}" bindtap='btnTap'>获取位置信息</button>
<button wx:else open-type="openSetting" bindopensetting='handler'>点击授权并获取位置信息</button>

//index.js
//获取应用实例
const app = getApp()
Page({
  data: {
    ldata:false
  },
  onLoad: function () {
// 获取位置
var that=this;
    wx.getLocation({
      type: 'gcj02',
      success: function (res) {
        var latitude = res.latitude
        var longitude = res.longitude
        that.setData({
          ldata:true,
          latitude: latitude,
          longitude: longitude
        })
      },
      fail:function(res){
        console.log('拒绝授权')
        that.setData({
          ldata:false
        })
      }
    }) 
  },
  btnTap(e){
    wx.openLocation({
      latitude: this.data.latitude,
      longitude: this.data.longitude,
      scale: 28
    })
  },
  handler:function(e){
    var that = this;
    if (!e.detail.authSetting['scope.userLocation']){
      that.setData({
        ldata:false
      })
       }else{
          that.setData({
            ldata: true,
          })
          wx.getLocation({
            type: 'gcj02',
            success: function (res) {
              var latitude = res.latitude
              var longitude = res.longitude

              that.setData({
                latitude: latitude,
                longitude: longitude
              })
              wx.openLocation({
                latitude: latitude,
                longitude: longitude,
                scale: 28
              })
            }
          })
    }
    // wx.getSetting({
    //   success(res) {
    //     console.log('获取已授权列表', res);
    //     if (!res.authSetting['scope.userLocation']) {
    //       console.log('无位置授权')
    //       that.setData({
    //         ldata: false
    //       })
    //     }
    //     else {
    //       console.log('有位置授权')
    //       that.setData({
    //         ldata: true,
    //       })
    //       wx.getLocation({
    //         type: 'gcj02',
    //         success: function (res) {
    //           var latitude = res.latitude
    //           var longitude = res.longitude
    //           that.setData({
    //             latitude: latitude,
    //             longitude: longitude
    //           })
    //           wx.openLocation({
    //             latitude: latitude,
    //             longitude: longitude,
    //             scale: 28
    //           })
    //         }
    //       })
    //     }
    //   }
    // })
  }
})

注意的地方就是页面根据授权情况显示不同的按钮,由页面ldata参数控制,用户首次进入通过onload 中的 wx.getLocation弹框授权,如果同意ldata设置为true并保存位置信息,这时页面直接显示“获取位置信息”按钮,点击后通过btnTap事件直接打开地图,通过开始同意授权后保存的经纬度显示当前位置。 当我们再次进入后已经。
如果用户第一次拒绝了授权那么ldata设置为false,显示的是“点击授权并获取位置信息”按钮,注意这个button按钮的设置方式open-type=”openSetting” bindopensetting=’handler’,用按钮的open-type发起打开授权设置页,bindopensetting是设置用户设置授权之后的回调,我们可在回调里判断用户勾没勾选同意授权,如果判断同意了那么ldata设置为true,之后显示的都是“获取位置信息”,不必授权直接显示地图。如果没有勾选同意那么ldata当然设置是false,之后再经过这个页面还是显示“点击授权并获取位置信息”。
最后注意的是在回调里我一开始用wx.getSetting判断用户在设置页设置的授权结果,以为即将废弃我们可以用回调函数的参数来判断e.detail.authSetting,还有别的参数可以打印出来看一下。
感触:刚接触查到很多资料也是废弃之前的东西,路漫漫其修远兮,吾将上下而求索。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 给提问的开发者的建议:提问之前先查询 文档、通过社区右上角搜索搜索已经存在的问题。 写一个简明扼要的标题,并且...
    极乐叔阅读 13,386评论 0 3
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,968评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,510评论 25 707
  • 工作日 1)面试 2)年中总结 3)盯微服务项目测试的进度 4)解决nexus无法上传docker镜像问题。 晚上...
    灼灼2015阅读 197评论 0 0
  • 前几天我骑着摩拜晃晃悠悠路过沈北的天桥,边听着歌边思考着过几天去成都的行程安排。想到成都的大熊猫、据说辣到...
    JIAHUIG阅读 466评论 0 1