V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
jayzjj000
V2EX  ›  iDev

关于微信红包,开发者们来讨论点干货把(动态黑科技相关)

  •  1
     
  •   jayzjj000 · 2016-01-28 14:13:42 +08:00 · 7047 次点击
    这是一个创建于 3008 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前天,微信发布了红包照片,反响还是挺强烈的,不过看到论坛里大多数都是在讨论果照和抓包,并没有人关注到微信这个功能具体的实现方式。今天这阵子热潮也已经过去了,不如我们就来聊聊这个功能的技术干货。

    其实微信这个功能在 iOS 上的实现方式无外乎下面两种:
    1. 计划中的功能需求,客户端提前完成功能,提前上架,等待服务端下发数据展现。
    2. 临时功能需求,客户端完全不知情,但是拥有线上修改 UI 和逻辑的能力,可以通过服务端下发数据和代码来完成新功能。

    上面第一种应该是最常见的,但是对于第二种实现方式,是否有可能已经微信这次的这样做的可能性有多少,大家不妨来说说自己的想法。

    楼主的想法比较多,一会就更新,先听听大家的意见~

    第 1 条附言  ·  2016-01-28 15:04:28 +08:00
    其实当时微信红包出来的时候,我就跟同事在讨论微信这个需求的实现方式,本来也有意在论坛发帖讨论,无奈事情比较多就搁置了。直到今天 @yxjxx 来问我微信这个功能的具体实现方式,又一次提起了我的兴趣,所以就来坛子里发帖大家讨论讨论。

    ---

    *我这里主要针对我上述的第二种情况(动态黑科技)来讨论 iOS 的实现方式。*

    ## 技术可行性(可行性来源)
    - Objc 自带的 Runtime 机制
    - JSPatch + Javascript
    - wax + Lua
    - JavaScriptCore (未接触)

    相信 Runtime 这种小黑科技对于很多开发者都已经不陌生了,它提供的动态生成类、对象、方法,动态性简直屌的一笔,但是我玩了挺久,也只能实现布局的动态性,逻辑的动态性下发依赖客户端的框架搭建,其实主要就是无法完成一个 IMP 的下发。
    自然而然, Runtime 的缺陷引出了后面几个框架: JSPatch+JavaScript , Wax+Lua 。这两个框架都可以通过脚本语言,动态下发逻辑,与 Runtime 的结合更是发生了许多奇妙的变化,相信许多用 JSPatch 搭建 JSBridge 联通 H5 与 Native 的人都与我有着同样的感受:这特么实在是叼。至于 Wax+Lua 可能认识的人稍微少了点,但是同样具有超屌的动态性。

    ## 具体实现方式的剖析

    首先,单单从微信这个应用来看,我刚开始的直觉是它肯定不会用这样的黑科技。理由太简单了,像微信这么一个谨慎的不能更谨慎的应用,发布任何一个需求都是考虑再考虑,怎么会突然出现这么大的一个临时需求,还这么紧急要线上发布,想想都不可能。更不用说无论哪个动态化实现方案都存在缺陷和漏洞,不稳定性比 Native 高太多。

    然而后来微信红包出现的一系列 Bug 戳瞎了我的狗眼。。。

    ### Bug 列表
    1. 请求图片没有使用 HTTPS ,并且图片也没有加密
    2. 低端机型上( iPhone4 ),滤镜蒙层会出现加载缓慢导致可以直接查看图片的 Bug
    3. 点击进入个人页面,选择某一条红包照片,在出现的照片状态页面可以点击下面的 TextField 直接评论(虽然也会弹出浮层说要付钱才能评论,但是键盘可以弹出来,可以打字可以发送成功)
    4. 如果按照第三点做,原照片主人如果回复你,在消息界面可以直接打开红包照片,并且没有滤镜蒙层
    5. 红包数额每次点击都不一样(不知道算不算 Bug ,反正我觉得是)

    我觉得上述 Bug 都是正常测试流程和回归流程可以发现的 Bug ,难道微信在发布一个新版本的时候都不会对新功能进行系统回归测试么,这个真的是太捉急了。

    ### 私以为评判技术方向决定性的一点
    一个非常关键的 Bug :上述第三条,微信应该都已经发现这个 Bug 了,因为在点击 TextField 的时候,可以看到有弹层,但是没有把键盘响应事件给去掉!!!这个实在是太关键了,这个 Bug 没发现我打死都不信,微信开发者我不打你你过来跟我说这个弹层是怎么回事。所以我认为,并不是微信不知道这个 Bug ,而是**知道了没办法!**,*因为微信在用动态化方案对这个点击事件进行 Hook 并替换方法的时候,没有办法替换完全,点击事件仍然传递到了系统 TextField 上,导致键盘被响应打开!*,这个是我认为微信使用动态化方案的非常重要的一点!有兴趣的同学可以跟我一起深挖通过 JSPatch 或者 Wax 来 Hook 方法时产生的不可抗后果。
    其实其他 Bug 也有佐证微信使用动态化方案的例子(比如:不使用 HTTPS 是因为涉及到网络库,对于微信的架构伤害太大,不敢用脚本语言完成),但是上述这个,真的是一个致命的因素。

    装逼装的好累,每次都写这么多,反正根据微信的这些 Bug ,以及 Bug 产生的原因,我认为微信这次功能使用的是动态化方案,感谢看完全文。
    第 2 条附言  ·  2016-01-29 10:52:48 +08:00
    经朋友提醒,那天红包照片下午和晚上的功能实现有差异:

    晚上加上了“中奖”功能,多点击照片几次可以中奖,不用付钱就可以看照片。

    这个功能不仅要在服务端做改动,客户端我认为是需要相应改动的。而且我觉得这个改动非常大可能是临时需求(配合某官微说微信涉黄),客户端预埋的可能性真不太大。

    ---

    抛开是否是热更新完成的功能不说,微信如此高效的完成新需求的迭代发布上线,需求的上线时间维度从月级到了小时级,对于 iOS 和 Android 的开发者来说,有没有点细思极恐的味道
    34 条回复    2016-02-17 16:37:25 +08:00
    bullettrain1433
        1
    bullettrain1433  
       2016-01-28 14:18:45 +08:00
    第二种应该就是 JSPatcher 吧
    Ison
        2
    Ison  
       2016-01-28 14:20:50 +08:00
    这个问题之前也有考虑过
    个人觉得可行方案是微信采用了单元化的 UI 设计模式(暂且这么叫吧)
    把 UI 最基本要素都模块化了
    然后通过后台传的参数对模块进行拼凑
    然后就实现了动态更新界面的效果了
    个人愚见。。。
    pljhonglu
        3
    pljhonglu  
       2016-01-28 14:37:42 +08:00
    应该是模块化+后台配置
    像春节红包这种功能应该是预先开发的
    SourceMan
        4
    SourceMan  
       2016-01-28 14:44:14 +08:00
    已有的功能隐藏 + 服务器功能开关
    上次是限时公测,各数据获取完成,下线
    发现 bug (可抓包等等),修复,发布 6.3.10 版本
    jayzjj000
        5
    jayzjj000  
    OP
       2016-01-28 15:05:09 +08:00
    妈蛋 APPEND 的内容竟然不能使用 Markdown
    jayzjj000
        6
    jayzjj000  
    OP
       2016-01-28 15:05:20 +08:00
    jayzjj000
        7
    jayzjj000  
    OP
       2016-01-28 15:06:17 +08:00
    @bullettrain1433 没错,类似于 JSPatch 的实现方式,但是这个风险偏高,微信应该不会用才对。。。。结果他竟然用了。。。然后出了一堆 Bug
    jayzjj000
        8
    jayzjj000  
    OP
       2016-01-28 15:08:03 +08:00
    @Ison UI 可以模块化来通过服务端下发,但是逻辑无法服务端下发,比如说点击评论被屏蔽,出来一个要付钱才能评论的弹层。
    jayzjj000
        9
    jayzjj000  
    OP
       2016-01-28 15:09:11 +08:00
    @pljhonglu 但是 Bug 真的多,真的多。。。从来没见过微信有这么多 Bug ,都可以算得上是故障了吧。。。感觉按微信这种谨慎的态度来说,太奇怪
    yemenchun1
        10
    yemenchun1  
       2016-01-28 15:09:52 +08:00 via iPhone
    if time > someTime {
    function( )
    }
    难道不是这样吗……
    jayzjj000
        11
    jayzjj000  
    OP
       2016-01-28 15:10:05 +08:00
    @SourceMan 我刚开始也非常同意这个观点,我觉得微信干事差不多就是这样,但是这 Bug 数。。。
    jayzjj000
        12
    jayzjj000  
    OP
       2016-01-28 15:10:51 +08:00
    @yemenchun1 也有其他方法可以实现
    jayzjj000
        13
    jayzjj000  
    OP
       2016-01-28 15:16:09 +08:00
    😂好不容易装个逼,一下子就沉底了,不嗨森
    yuchting
        14
    yuchting  
       2016-01-28 15:18:32 +08:00
    感觉,这次红包图片的活动策划加技术功能都很渣渣,都已经涉黄了。微信变成基础服务后,任何细微的功能的调整和新活动的放出,恐怕都会招致负面效果吧。
    dapang1221
        15
    dapang1221  
       2016-01-28 15:23:10 +08:00 via Android
    我觉得应该是预先开发,从低版本用不了这个功能这一点就能看出来。。。
    dai269619118
        16
    dai269619118  
       2016-01-28 15:27:59 +08:00
    黑科技是指远超越现今人类科技或知识所能及的范畴,缺乏目前科学根据并且违反自然原理的科学技术或者产品。
    lz 不要知道了一个装逼的词汇 使劲用
    jayzjj000
        17
    jayzjj000  
    OP
       2016-01-28 15:28:41 +08:00
    @dapang1221

    同感,没有进行过部分人群的定投测试功能,就直接全量推送新功能了,感觉微信这次毁坏了我心里它一直谨慎小心的形象

    @yuchting

    动态下发支持多版本的开发量非常大,而且微信低版本的使用率应该不是非常高,抛弃低版本应该还是比较正常的
    sxyclint
        18
    sxyclint  
       2016-01-28 15:29:43 +08:00
    应该是预先开发的,然后在上一个版本预埋,之后通过云指令开启,这么做出错率低。另外 JSPatch 下发临时应付也是可以的,不过也只是临时用,下个版本更新就会替换掉,微信用 JSPatch 很正常吧,作者本身就在微信工作
    jayzjj000
        19
    jayzjj000  
    OP
       2016-01-28 15:30:18 +08:00
    qinxi
        20
    qinxi  
       2016-01-28 15:30:30 +08:00
    我也想过怎么实现来着 但是我太菜 而且是后端的...唯一想到的就是脚本语言或者预先就有的功能被暂时关闭
    yiciyuansky
        21
    yiciyuansky  
       2016-01-28 15:36:11 +08:00
    不是说好的热更新 SDK 么。。。
    jayzjj000
        22
    jayzjj000  
    OP
       2016-01-28 15:40:30 +08:00
    @yiciyuansky
    难道被我猜对了,微信内部已经开始使用热更新 SDK 了么
    hekunhotmail
        23
    hekunhotmail  
       2016-01-28 16:33:53 +08:00   ❤️ 1
    预先开发的,整那么多没用的
    yseternal
        24
    yseternal  
       2016-01-28 17:25:45 +08:00
    然而微信的这个功能是 11 月份开发完成的
    xi_lin
        25
    xi_lin  
       2016-01-28 22:49:04 +08:00
    肯定不是动态更新的
    cassiuschen
        26
    cassiuschen  
       2016-01-28 23:58:57 +08:00
    说起来, JSPatch 不是被苹果审核给封了么……检查出来有 JSPatch 的不予通过
    zhongdong
        27
    zhongdong  
       2016-01-29 09:16:33 +08:00
    预开发的吧 老版本看不到的
    pljhonglu
        28
    pljhonglu  
       2016-01-29 10:15:50 +08:00
    应该是从产品到开发到测试的一次重大失误,所以才提前下线了。
    图片不上 HTTPS 实在不应该。。。
    jayzjj000
        29
    jayzjj000  
    OP
       2016-01-29 10:46:30 +08:00
    @pljhonglu
    这个失误真是 666 ,感觉整个需求开发测试回归的流程都没完全跑通,就直接全量用户了,太捉急了


    @cassiuschen
    JSPatch 应该有好些上线的应用还在用,感觉是有些应用把 JSPatch 当做核心来用,所有页面都用 H5 下发, JSPatch 来搭建 Native 和 JS 的通道,所以才被苹果干死了

    @xi_lin
    求理由!!到现在还没个定论,感觉大牛们没有动起来啊
    xi_lin
        30
    xi_lin  
       2016-01-29 14:13:31 +08:00
    @cassiuschen 实践证明并没有被封
    newbieo0O
        31
    newbieo0O  
       2016-01-29 15:03:47 +08:00
    5 怎么是 BUG 呢,产生随机金额的啊。
    hqs123
        32
    hqs123  
       2016-01-30 09:31:02 +08:00
    技术贴,收藏学习下
    yiplee
        33
    yiplee  
       2016-01-30 14:02:03 +08:00
    微信用的 JSPatch , JSPatch 的作者就在微信。
    xiangheka
        34
    xiangheka  
       2016-02-17 16:37:25 +08:00
    如果是 react-native 完全可以热更新, jsPatch 临时改 bug 还可以,开发功能就不太好。当时没有抓包,要不然可以看看他是否有离线包更新
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   971 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 21:45 · PVG 05:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.