今天学习第5章平台功能优化的第14课,绘制微信用户头像。
学习目标
- 了解小游戏的授权范围;
- 使用 UserInfoButton 拉取用户信息;
- 了解为什么使用全等运算符而不是等号运算符;
- 在画布上绘制用户头像;
- 学习使用箭头函数及判定this对象;
- 主动销毁原生按钮;
- 主动查询用户的授权情况;
- 在测试中清理缓存。
主要知识点/技能点
- 当开发者需要获取用户的私隐信息时,例如获取用户头像、昵称、地理位置、手机号、收货地址等,则必须先获得用户的授权。
- 小游戏的授权接口 wx.authorize,可用于向用户发起授权请求,成功调用这个接口后会立刻弹窗,询问用户是否同意授权程序使用某项功能或获取某些数据;如果用户在此之前已经授权,则不会出现弹窗,而是直接返回已有的授权成果。
- 小游戏授权主要有8类:
- scope.userInfo 权限并不能直接通过wx.authorize接口查询,必须在用户与界面有交互行为之后才能拉取。
- 单击UserInfoButton组件返回的对象,与以前直接调用wx.getUserInfo接口返回的对象是相同的(在小程序刚上线时wx.getUserInfo接口是充许直接调用的)。单击UserInfoButton时,我们可以将其理解为是小游戏/小程序环境帮助我们调用了wx.getUserInfo接口,然后将调用结果通过Tap事件的回调函数返回给了我们。
- 小游戏加密信息的解密步骤:(1)开发者在后端拿到加密数据以后,如果想解密数据,需要先获得session_key;(2)取得session_key以后,先以sha1( rawData + session_key)计算出signature1,然后判断signature1是否等于微信服务器传来的signature;(3)如果signature1与signature两者相等,视为签名验证通过,然后再以名称为AES-128-CBC的解密算法,以session_key和微信服务器传来的初始向量iv为条件,将加密的encryptedData最终解密,拿到所有信息。
- userInfo这个对象,它的类型是 UserInfo,包含这些属性:nickName用户昵称、avatarUrl用户头像图片的URL等。
- 示例中使用wx.createUserInfoButton接口创建的UserInfoButton组件是一个文本按钮,是基于文本绘制和带圆角效果的矩形绘制实现的。
- 为什么使用全等运算符而不是等号运算符?全等运算符会同时检查两边表达式的值与类型,只有两项都相同时才返回true,而等于运算符不要求类型相同,只要求值相同;等于运算符可能会伴随着类型的隐式转换,这可能是一个隐患。
- 箭头函数由3部分组成:参数、箭头符号(=>)和函数体,它没有原型(prototype),没有自己的this,也没有arguments参数。
- 箭头函数内部的 this 关键字所指向的对象是由箭头函数所在的父作用域决定的,并不是箭头函数本身,这是箭头函数除了格式简洁之外最大的用途之一。
- 箭头函数没有自己的this,箭头函数中的this指向运行时父级作用域下的this对象。考察代码中的this具体指向哪个对象,我们要看三个问题,而这其中又涉及三条规则:
(1)是不是顶级函数?这要看函数是不是全局作用域下的顶级函数,如果是,this等于全局对象;
(2)是不是箭头函数?这要看是不是箭头函数,如果是,将箭头函数看成lamda表达式,以其父函数重新作为考察对象,回到第1条规则继续;
(3)有没有执行者?如果不是箭头函数,看被执行的函数有没有执行者,如果有,this等于执行者;如果没有执行者,this等于全局对象。
- 箭头函数与普通函数的4个区别:
- (1)箭头函数中没有 arguments 对象;(2)箭头函数不能用作构造器,不能使用 new 关键字实例化;(3)使用 call或 apply调用时,对 this 没有影响;(4)没有 prototype 原型。
- 使用wx.createUserInfoButton创建的UserInfoButton对象,有一个方法 destroy,可用于销毁按钮。
实践疑难点
- 在调用接口时注意进行结果合法性的判断。例如当使用UserInfoButton获取用户信息时,只有在接口调用成功时,才会返回UserInfo对象,因此我们在第2行将res.errMsg与"getUserInfo:ok"进行判断,如果相等,代表接口调用成功。
- 第一次重新编译后,单击“拉取用户信息”,头像却不显示的原因是:头像在绘制过后,马上被擦除了。我们必须将图像绘制放在 render 函数内部,且每次渲染都要让其参与绘制。
- 左挡板为什么默认没有显示?leftPanelY本应该是一个变量,代表左挡板的绘制起点Y坐标,但我们在代码中却将它声明为了一个对象,直到有鼠标移动事件后,才将它修改为了合法的值。这是由于JS的弱类型特征造成的,在开发中值得注意。
小结
在这一课中,关于this对象的判定是重点。