小程序开发之页面跳转拦截

小程序开发之页面跳转拦截

  • 随着小程序的普及,人们对于小程序这种轻应用的接受度越来越高了,越来越多的APP正在将部分功能小程序化,利用小程序易于传播,且获客成本相比APP更低的特点来获得更多的用户,然后通过后续的运营将小程序的用户转化为APP的用户。提高APP用户数。

  • 其实用的小程序多了,我们不难发现其实我们微信里面小程序的来源差不多就那么几种,扫描二维码,点击别人分享的进入

  • 而当小程序传播出去触达用户之后,我们开发者能做的就是,如何让用户在打开分享出去的小程序之后能够一触即达到我们需要用户进入的页面,完成我们预设的各种行为。

  • 所以分享打开小程序一般就两种要求;

    • 一种是用户打开别人分享的小程序之后直接启动小程序进入首页即可;
    • 一种需要分享特定页面,且需要携带一些特定的参数。当用户打开之后需要将相关数据填充进页面。
  • 两种跳转方式对比分析:

    • 第一种:因为只需打开首页,所以只需按正常新用户进行处理即可;
    • 第二种:携带特定参数打开特定页面,其实是坑比较多的一种吧;
      • 主要需要考虑的就是小程序是否需要登陆(需要获取用户头像昵称或者手机号这种需用户手动授权获取信息的)。
      • 小程序的主页页面结构。如果主页是tabBar的形式,那么跟普通的页面数据传递又是不一样的,需要另外处理了。

一:以打开特定页面为例。实现页面跳转拦截处理

  • 产品需求:用户分享不同页面,其他用户点击之后需要能直接跳转到对应页面,且信息展示需与分享来源用户展示信息一致
    • 如:分享帖子,其他人打开之后需要开到的是同一篇帖子,组队类游戏分享,其他人打开之后需要直接默认进入邀请人所在队伍,然后让用户选择是否修改要加入的队伍。
    • 注册用户才可以进入小程序除注册页面以外的其他页面。所以未在当前设备使用过小程序的用户需要先进行注册,或登录
  • 功能实现分析:
    • 因为小程序中所有的操作都需要用户登录后进行登录,所以对于初次打开的用户需要先进行注册,然后携带对应参数进入相应页面

二:技术实现过程

  • 方案一:直接使用微信的分享功能,将每个页面的分享路径直接设置成当前页面路径。然后用户点击之后直接进入对应页面;
    • 放弃原因:直接设成当前路径会导致跳过注册页,直接进入目标页,但是因为缺少必要请求参数,导致页面展示出现问题;
  • 方案二:将所有分享出去的页面路径统一设置成注册页,然后注册页获取分享数据之后,在注册登录成功将相关数据传递到对应页面。
    • 放弃原因:注册成功之后,跳转到指定页面,这时候小程序的页面栈中只有注册页,和该分享页,导致用户返回之后直接就回到注册页面。 无法进入首页然后进入小程序的其他页面。
  • 方案三:其实就是将方案二进行修正,就是将用户分享出去的路径还是设置成注册页,但是在注册成功之后还是先跳首页,然后首页根据来源是分享还是直接进入,来区分是应该进行页面跳转还是停留在当前页。这时候当用户进入指定页之后,因为页面栈中已经有首页了,所以用户是可以进行返回到首页的。
  • 实现过程遇到的坑:
    • 1.因为主页是tabBar的形式,所以无法通过在地址后拼接参数的形式进行传参了(url: 'test?id=1')。最后选择通过app.js文件定义一个全局变量临时存储页面数据,然后在跳转之后取出数据,并将app.js中的数据清空,以免影响下次跳转。
    • 2.无法在app.js的onLoad方法中进行跳转,因为在onLoad还未执行完,就已经跳转到app.json中注册的首页去了


      login.png

      home.png

三:关键代码如下

  • 以分享帖子为例进行部分参数说明
参数名 必选 类型 说明
ShareType int 分享页面类型-1.帖子,2-活动(主要用来区分要跳转的页面,可根据需要自己添加)
ArticleId String 帖子ID
ArticleType int 帖子类型时,帖子类型不同,页面也不一样
  • 第一步,分享页分享当前页面
//分享页
onShareAppMessage: function () {
    var that = this;
    return {
        title: '帖子',
        path: '/pages/index/index?ShareType=1&' + "ArticleId=" + that.data.id + "&ArticleType=" + that.data.ArticleType
        +'&ContentType'+that.data.ContentType
    }
},
  • 第二步,app.js中定义分享标识,以及定义字段接收分享参数,进行数据的存储。
//app.js
/**
 * 可用来进行全局的数据传递
 */
globalData: {
    isFromShare:false,//是否是分享进入首页
    fromParam:{}//分享携带的参数
}
  • 第三步,注册登录页获取数据,并将数据保存在第二步中定义的字段中。
//index.js//注册登录页,在onLoad中获取启动的参数,且复赋值给app.js中的字段。方便首页获取
onLoad: function (options) {
    getApp().globalData.isFromShare = options.FromShare === 'true';
    getApp().globalData.fromParam = options;
}
  • 第四步,首页从app.js中读取数据,进行页面跳转以及将相关参数传递至对应页面
onLoad: function() {
  let isFromShare = getApp().globalData.isFromShare;
  if (isFromShare) {
    var argument = getApp().globalData.fromParam;
    switch (parseInt(argument.ShareType)) {
      case 1: //分享的是帖子
        wx.navigateTo({
          url: '../imageText/imageText?' + 'ArticleType=' + argument.ArticleType + '&ArticleId=' + argument.ArticleId,
        })
        break;

    }
    getApp().globalData.isFromShare = false;//置为false,以免影响后面页面的跳转
  }
},
  • 第五步,分享页获取参数,进行数据加载显示。
/**
 * 分享来源解析参数,展示页面
 * 生命周期函数--监听页面加载
 */
onLoad: function (options) {
    var that = this;
    let type = options.ArticleType;
    let id = options.ArticleId;
  console.log('ArticleType = ' + type + '---' + 'ArticleId = ' + id);
    that.setData({
        id: id,
        ArticleType: type
    })
    that.getArticleData(id);
    that.getCommentList(id, 1);
},

四:总结

  • 实现该需求主要需要注意到的是两个问题
  • 1.微信的页面栈问题。对于进入非首页的页面,需要先让首页进入微信页面栈,后续用户才可以返回到首页进入其他页面
  • 2.wx.switchTab无法传递参数。只能通过其他方式来进行参数的传递。
  • 其实这个过程跟H5打开Android指定页面后Android端的整体处理逻辑其实是一样。只是Android端和小程序端的坑不一样;Android端还需要考虑在不同APP内打开应用的适配问题,以及打开指定页面后被拉回原始APP的问题。
  • H5打开APP指定页面爬坑记录
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281