- updateManager 强制更新无效?
我们的机制是这样,app onLaunch初始化代码,当小程序发送某几个请求的时候,去调用updateManager检查更新,模拟器测试没有问题,但是线上不生效,通过log看,显示updateManage.onCheckForUpdate未检查到更新 代码如下: const STATUS_MAP = { [代码] [代码][代码]NOTBEGIN: 0,[代码][代码] [代码][代码]PENDING: 1,[代码][代码] [代码][代码]SUCCESS: 2,[代码][代码] [代码][代码]FAILD: 3,[代码][代码]}[代码][代码]const MAX_FAIL_TIMES = 3; [代码][代码]// 运行期间超过三次失败就不再尝试[代码][代码]let infos = {};[代码][代码]let updateManager;[代码][代码]let inited = [代码][代码]false[代码][代码];[代码][代码]let status = STATUS_MAP.NOTBEGIN;[代码][代码]let failCount = 0;[代码] [代码]const RULES = [[代码]{[代码] [代码][代码]name: [代码][代码]'x-system'[代码][代码],[代码][代码] [代码][代码]rule: system => infos.system.toLowerCase().indexOf(system.toLowerCase()) > -1,[代码][代码]}, {[代码][代码] [代码][代码]name: [代码][代码]'x-uid'[代码][代码],[代码][代码] [代码][代码]rule: uids => {[代码][代码] [代码][代码]const app = getApp();[代码][代码] [代码][代码]const user = app.$user.userId;[代码][代码] [代码][代码]if[代码] [代码](user && uids.split([代码][代码]','[代码][代码]).indexOf(user.toString()) > -1) {[代码][代码] [代码][代码]return[代码] [代码]true[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]return[代码] [代码]false[代码][代码];[代码][代码] [代码][代码]},[代码][代码]}];[代码] [代码]function[代码] [代码]collectInfo() {[代码][代码] [代码][代码]return[代码] [代码]{[代码][代码] [代码][代码]inited,[代码][代码] [代码][代码]infos,[代码][代码] [代码][代码]status,[代码][代码] [代码][代码]failCount,[代码][代码] [代码][代码]lastUpdate: wx.getStorageSync([代码][代码]'lastUpdate'[代码][代码]),[代码][代码] [代码][代码]};[代码][代码]}[代码] [代码]function[代码] [代码]logError(err) {[代码][代码] [代码][代码]const pages = getCurrentPages();[代码][代码] [代码][代码]const len = pages.length;[代码][代码] [代码][代码]if[代码] [代码](!len) [代码][代码]return[代码][代码];[代码][代码] [代码][代码]err.info = collectInfo();[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]typeof[代码] [代码]wx.getRealtimeLogManager === [代码][代码]'function'[代码][代码]) {[代码][代码] [代码][代码]const logger = wx.getRealtimeLogManager();[代码][代码] [代码][代码]logger.error(err.message, err);[代码][代码] [代码][代码]}[代码][代码]}[代码] [代码]function[代码] [代码]log(message) {[代码][代码] [代码][代码]const args = collectInfo();[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]typeof[代码] [代码]wx.getRealtimeLogManager === [代码][代码]'function'[代码][代码]) {[代码][代码] [代码][代码]const logger = wx.getRealtimeLogManager();[代码][代码] [代码][代码]logger.info(message, args);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]console.log(`-------${message}-------`, args);[代码][代码]}[代码] [代码]function[代码] [代码]checkRules(headers = {}) {[代码][代码] [代码][代码]const app = getApp();[代码][代码] [代码][代码]const lastUpdate = headers[[代码][代码]'x-update'[代码][代码]];[代码][代码] [代码][代码]if[代码] [代码](!lastUpdate || app.lastUpdate >= lastUpdate) {[代码][代码] [代码][代码]return[代码] [代码]false[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]for[代码] [代码](let i = 0; i < RULES.length; i++) {[代码][代码] [代码][代码]const item = RULES[i];[代码][代码] [代码][代码]const header = headers[item.name];[代码][代码] [代码][代码]if[代码] [代码](!header) {[代码][代码] [代码][代码]continue[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]if[代码] [代码](header [代码][代码]instanceof[代码] [代码]Array && header.length === 0) {[代码][代码] [代码][代码]continue[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]if[代码] [代码]([代码][代码]typeof[代码] [代码]header === [代码][代码]'object'[代码] [代码]&& Object.keys(header).length === 0) {[代码][代码] [代码][代码]continue[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]if[代码] [代码](!item.rule(headers[item.name])) {[代码][代码] [代码][代码]return[代码] [代码]false[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]}[代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]}[代码] [代码]function[代码] [代码]checkForUpdate(timestamp) {[代码][代码] [代码][代码]const app = getApp();[代码][代码] [代码][代码]if[代码] [代码](status === STATUS_MAP.PENDING) [代码][代码]return[代码][代码];[代码][代码] [代码][代码]status = STATUS_MAP.PENDING;[代码][代码] [代码][代码]updateManager = wx.getUpdateManager();[代码][代码] [代码][代码]updateManager.onCheckForUpdate(res => {[代码][代码] [代码][代码]if[代码] [代码](res && res.hasUpdate) {[代码][代码] [代码][代码]updateManager.onUpdateReady(() => {[代码][代码] [代码][代码]wx.showModal({[代码][代码] [代码][代码]title: [代码][代码]'更新提示'[代码][代码],[代码][代码] [代码][代码]content: [代码][代码]'系统升级,请重启获取最新版本'[代码][代码],[代码][代码] [代码][代码]showCancel: [代码][代码]false[代码][代码],[代码][代码] [代码][代码]success(modalRes) {[代码][代码] [代码][代码]if[代码] [代码](modalRes.confirm) {[代码][代码] [代码][代码]app.lastUpdate = timestamp;[代码][代码] [代码][代码]wx.setStorageSync([代码][代码]'lastUpdate'[代码][代码], timestamp);[代码][代码] [代码][代码]// status = STATUS_MAP.SUCCESS; 不能改变状态,否则会再次检查强制更新逻辑[代码][代码] [代码][代码]log([代码][代码]'force-update update success'[代码][代码]);[代码][代码] [代码][代码]setTimeout(() => {[代码][代码] [代码][代码]updateManager.applyUpdate();[代码][代码] [代码][代码]}, 2000);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]})[代码][代码] [代码][代码]});[代码][代码] [代码][代码]updateManager.onUpdateFailed(() => {[代码][代码] [代码][代码]status = STATUS_MAP.FAILD;[代码][代码] [代码][代码]failCount += 1;[代码][代码] [代码][代码]logError({[代码][代码] [代码][代码]message: [代码][代码]'force-update update fail'[代码][代码],[代码][代码] [代码][代码]});[代码][代码] [代码][代码]});[代码][代码] [代码][代码]} [代码][代码]else[代码] [代码]{[代码][代码] [代码][代码]status = STATUS_MAP.SUCCESS;[代码][代码] [代码][代码]app.lastUpdate = timestamp;[代码][代码] [代码][代码]wx.setStorageSync([代码][代码]'lastUpdate'[代码][代码], timestamp);[代码][代码] [代码][代码]log([代码][代码]'force-update check for no update'[代码][代码]);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码]}[代码] [代码]module.exports = {[代码][代码] [代码][代码]init(ctx) {[代码][代码] [代码][代码]if[代码] [代码](inited) [代码][代码]return[代码][代码];[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]ctx.lastUpdate = ctx.store.get([代码][代码]'lastUpdate'[代码][代码]) || 0;[代码][代码] [代码][代码]status = STATUS_MAP.NOTBEGIN;[代码][代码] [代码][代码]const { system, version: wechat, SDKVersion: lib } = ctx.system();[代码][代码] [代码][代码]infos = {[代码][代码] [代码][代码]system,[代码][代码] [代码][代码]wechat,[代码][代码] [代码][代码]lib,[代码][代码] [代码][代码]};[代码][代码] [代码][代码]inited = [代码][代码]true[代码][代码];[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](error) {[代码][代码] [代码][代码]setTimeout(() => {[代码][代码] [代码][代码]logError({[代码][代码] [代码][代码]message: [代码][代码]'force-update init fail'[代码][代码],[代码][代码] [代码][代码]error,[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}, 2000);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码] [代码][代码]checkForceUpdate(headers) {[代码][代码] [代码][代码]try[代码] [代码]{[代码][代码] [代码][代码]if[代码] [代码](status === STATUS_MAP.PENDING) {[代码][代码] [代码][代码]return[代码][代码];[代码][代码] [代码][代码]}[代码][代码] [代码][代码]if[代码] [代码](inited && failCount < MAX_FAIL_TIMES && headers[[代码][代码]'x-update'[代码][代码]] && checkRules(headers)) {[代码][代码] [代码][代码]// 必须有更新时间,必须已经初始化过,失败次数未超过三次[代码][代码] [代码][代码]checkForUpdate(headers[[代码][代码]'x-update'[代码][代码]]);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]} [代码][代码]catch[代码] [代码](error) {[代码][代码] [代码][代码]if[代码] [代码](status === STATUS_MAP.PENDING) {[代码][代码] [代码][代码]failCount += 1;[代码][代码] [代码][代码]status = STATUS_MAP.FAILD;[代码][代码] [代码][代码]}[代码][代码] [代码][代码]logError({[代码][代码] [代码][代码]message: [代码][代码]'force-update check for update exception'[代码][代码],[代码][代码] [代码][代码]error,[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码][代码] [代码][代码]},[代码][代码]}[代码]
2019-12-11 - 小程序发版后回滚,调用wx.getUpdateManager(),能否检查到更新?
两种情况: 发版后没有使用新版的用户,在回滚后打开小程序,能否检查到更新? 发版后有使用新版的用户,在回滚后打开小程序,能否检查到更新?
2019-11-07 - 小程序开发者工具编辑配置部分选项可否支持在project.config.json里配置?
这个配置可否放在project.config.json里?团队希望能统一配置,检测不规范配置,目前没有办法获取到当前的配置是什么 [图片]
2019-11-04 - 小程序是否有强制更新机制?希望在下次冷启动之前能主动检查更新
现状 目前从文档获取到的信息来看,小程序冷启动的时候会检查更新,然后提供UpdateManager去主动应用更新 背景 很多时候,如果我们发版了,正在使用小程序的用户,是不知道有版本更新的。只有下次冷启动的时候,才有机会检查更新,然后确认使用新版。如果目前线上正在发生事故,RD做了bugfix并发布,仍然需要用户冷启动才能检查更新,修复比较慢 诉求 小程序是否有办法可以主动检查更新而非下次冷启动的时候检查,确实有很多情况,我们需要快速更替版本
2019-10-28 - 小程序wx.hideHomeButton 不生效
page3展示了返回首页按钮,但是onShow方法里有调wx.hideHomeButton()。未生效。 [图片] 代码片段:https://developers.weixin.qq.com/s/x6UQo3ml7McW
2019-10-12 - rpx在flex布局下,精度不准的问题
如图所示,第一行方块为flex布局,第二行方块为absolute布局,方块宽度100,间距10,容器宽度都是660,使用rpx为布局单位的时候,两行的方块位置慢慢出现差异,黄线为一个参考线。单位全改成px,两行方块是完全对齐的。无论模拟器还是真机,iphone6P和iphone7P均有问题,安卓未测试 [图片]
2019-04-03 - setStorageSync AppServiceSDKKnownError
- 当前 Bug 的表现:安卓下setStorage报错 报错代码只是 try { wx.setStorageSync(k, v); } catch (error) { console.log('------------', k, '@@@@@@@@@@@@', v) console.error('storage', JSON.stringify(error)); } k,v都是有效的值 截图: [图片]
2019-02-25 - 在scroll-view中设置子元素背景图在某些场景不展示,滚动一下就展示
- 当前 Bug 的表现(可附上截图) 在ios上运行,点击第一行第三个图片,界面被放大,再次点击该图片,图片未发生变化,轻微滚动scroll-view,图片展示了出来 - 预期表现 反复点击后图片应该正常展示隐藏,而不是还要拖动 - 提供一个最简复现 Demo 视频链接:https://pan.baidu.com/s/1P-FaSbrUBLhiRjH6_YZjrw
2019-02-19 - 开发者工具不能登录
- 当前 Bug 的表现(可附上截图) [图片] - 预期表现 登录成功 - 复现路径 - 提供一个最简复现 Demo
2018-12-17 - app.json声明了自定义组件,为什么页面还必须要有一个空json文件
app.json声明: [代码]"usingComponents"[代码][代码]: {[代码][代码] [代码][代码]"navBar"[代码][代码]: [代码][代码]"./components/nav-bar/nav-bar"[代码][代码] [代码][代码]}[代码] 页面没有对应的json文件时,dom树结构: [图片] 页面有对应的json文件时,dom树结构 [图片] 。添加的json文件里只有一个{},别的内容没有。这是bug????
2018-11-19