V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
easychen
V2EX  ›  程序员

分享下最近做推送工具用到的开源项目、云服务和遇到的坑

  •  
  •   easychen ·
    easychen · 2015-09-09 15:56:38 +08:00 · 4062 次点击
    这是一个创建于 3363 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做了一个推送工具( https://www.v2ex.com/t/218958#reply37 ),这里分享下用到的云服务和开源项目吧。

    对于绝大部分移动客户端而言,推送功能是非常重要的用户到达和唤醒工具。但在 Hybrid APP 的解决方案里边, Cordova 一直没有国内能用的推送插件。之前 JobDeer 做 APP 时,我们是自己用 Parse 的 SDK 改了一个 LeanCloud 的插件出来用,本来正考虑要不要改改开源了,发现已经有同学做的挺不错了,于是就直接用了。
    https://github.com/BenBBear/cordova-plugin-leanpush

    这个插件的说明已经写的挺细致了,按部就班来就可以。温馨提示三点:

    • Android 打包失败时记得回来看页面最下边的 Fix 。
    • 安装插件之前尽量先把包名确定好再装,因为你再修改包名后,它不会同步修改代码。如果你遇到推送点击后呼叫不出来应用,记得去检查下 Java 文件里边的包名。
    • iOS 上如果取不到 InstallationID ,也没有任何错误提示,那么去检查下你的证书和包名的权限是否对应。

    推送云服务

    这次客户端推送主要用的是 LeanCloud ,因为个人感觉比较成熟,文档也写得比较细。 LeanCloud 采用 InstallationID 来代表一个安装,对 iOS 来说,这个 ID 是唯一的,把应用卸了再装还是一样的。但对 Android 来说,貌似每次安装一遍应用就会有一个新的值。只要知道 InstallationID ,就可以向手机推送消息了。 对 Android 而言,是不需要证书的。哦,不对,其实 Google 的服务是需要证书的,但国内的手机很多都没有 Google 的服务,所以国外的推送云服务,在国内往往没法用。 但 iOS 服务是需要证书的,配置证书可以参考 LeanCloud 的说明:https://leancloud.cn/docs/ios_push_cert.html#配置和下载证书

    需要说明的是,如果你用的是测试证书,在 LeanCloud 页面上进行发送测试时,记得要点「 iOS 」,然后才会出来证书类型选项,选择「测试证书」。 LeanCloud 的消息发送文档里边有一个 Channel 的概念,就是可以给一组人推送消息的容器。但我找遍了文档中心也没找到怎么创建。最后发现这货不需要创建,直接写就好了 T__T 所有东西都配置好以后,就可以推送消息了。

    用 ionic 做产品界面和本地功能

    ionic最近成长了不少,已经可以非常方便的完成漂亮的产品界面的。

    • 有几个非常不错的功能:实时真机调试:在命令行下: ionic run android -live 当你修改代码后,自动把修改部署到测试机,好用。
    • 热部署。这是 ionic 推出的新服务,还在内测。可以不用重新安装就升级应用内容,我还没试,但用在 iOS 上会很赞,不信的你多等几次审核就会信了。这个服务是收费的,现在可以免费使用,不过好像不会太贵。

    用下来有几个地方需要注意:

    • 如果 ajax 请求发不出去,记得安装 whitelist 插件。
    • 修改 android 的启动画面,需要安装 splash 插件。
    • iOS8 下的 IndexedDB 是残缺的。
    • ionic 的 list 控件已经自带了下拉刷新,不用自己做: http://ionicframework.com/docs/api/directive/ionRefresher

    SinaAppEngine 和微信推送

    由于 LeanCloud 不支持 PHP ,我也不喜欢文档式数据库,做微信推送时还是在 SAE 上完成了。 推荐一个 PHP 的微信 SDK : https://github.com/dodgepudding/wechat-php-sdk 

    在 SAE 可以很好的运行。顺便说一个坑:一定要先 $we->getRev ()以后,再执行$we->text ('答复文字')->replay 等操作。不然会没有任何错误提示的不返回内容。

    在推送服务里边推送队列是很重要的,虽然 LeanCloud 这边自己会排队,但 API 调用时应该及时返回,所以我们应该把发送行为做成异步的,让请求尽快返回以避免阻塞。 所以这里用了 SAE 的 TaskQueue 来存放要发送的信息。 SAE 的队列最高可以并发 16 ,各长度 1024 ,算算怎么都够用了。 Screen Shot 2015-09-09 at 2.19.19 PM

    在调试 TaskQueue 请求时,是没有办法看到页面吐出的数据的。于是我直接把数据在输出前通过 Server 酱发送到了手机上。终于在开发 Server 酱的时候用到了 Server 酱,这算自举么 ^_^

    最后还有一个技巧就是用到了 SAE 的 MC 来做 API 配额控制。 比如一个用户每 10 秒只能发送一条消息,只需要在 MC 里边建立一个以用户 UID 为 Key , 10 秒钟过期的记录就好了。当下次发送时,只要检查这个 key 是否存在即可,用起来各种方便。 关于微信消息下行,也挺多同学问的。用的是微信的「模板通知」接口,这个接口可以不受时间限制的给关注了公众账号用户通过 openID 发送通知,每天上限 10 万条。申请要求必须是「微信认证服务号」,发送消息时,有固定的模板,只能修改关键字。

    用 Electron 开发桌面应用

    这个我没做,但其实做起来非常简单,把 ionic 直接封进去,然后修改 Cordova 的接口为 Electron 的就好。详细的方法推荐阅读这篇文章:http://get.jobdeer.com/7870.get

    到这里,你会发现其实用 ionic 可以把几乎所有平台的应用都做了。 ionic 的代码还可以直接放到微信浏览器里边,作为 H5 版本。真正的一次编写,到处(修改后可以)运行。 如果你在给创业项目做早期产品的话,非常建议用这个方案来试试水。

    至于 ionic 现在的性能表现,信息不多时还是可以接受的,想亲身体会的同学可以下载个「 Server 酱」客户端

    13 条回复    2015-09-10 10:37:20 +08:00
    janxin
        1
    janxin  
       2015-09-09 18:32:43 +08:00 via Android
    ionic 目前虽然也在用,但是 web 下库的大小绝对坑……
    youxiachai
        2
    youxiachai  
       2015-09-09 22:48:44 +08:00
    @janxin 你这个问题。。。用 ionic 一般都是做客户端吧。。。
    easychen
        3
    easychen  
    OP
       2015-09-09 23:05:00 +08:00
    @janxin 可以永久缓存上… 然后就快了
    airyland
        4
    airyland  
       2015-09-09 23:38:42 +08:00
    赞 正准备折腾 ionic
    teannnn
        5
    teannnn  
       2015-09-09 23:43:11 +08:00
    楼主,你是我的偶像
    oojiayu
        6
    oojiayu  
       2015-09-10 00:23:35 +08:00   ❤️ 1
    @teannnn 偶像~ 楼主是一个做事情有规划也有很强的执行力的人~ 你也可以做到~
    janxin
        7
    janxin  
       2015-09-10 07:56:05 +08:00
    @youxiachai 因为 lz 提到了 web 开发....
    janxin
        8
    janxin  
       2015-09-10 07:56:30 +08:00
    @easychen 第一次会很坑,缓存肯定要加
    hantsy
        9
    hantsy  
       2015-09-10 08:23:37 +08:00
    一般推送直接用 WebSocket 就行了。
    hantsy
        10
    hantsy  
       2015-09-10 08:26:52 +08:00
    ionic 现在很成熟了。大约一年前我们在项目中使用了,感觉必须是新机最新系统才比较流畅,也会遇到一些诡异的 Web 问题。
    easychen
        11
    easychen  
    OP
       2015-09-10 09:18:05 +08:00
    @hantsy
    Websocket 也没法推 iOS 的 push 啊,还不能常驻后台。
    ionic 毕竟依赖于浏览器,性能始终不会到 90 分以上,再往上就看 react native 的成长了。
    hantsy
        12
    hantsy  
       2015-09-10 10:06:54 +08:00
    @easychen React native 有 Android 支持了吗?最初好像只有 IOS 支持。如果它 IOS 和 Android 是分开的 API 有什么意义,它做工作也就翻译成原生 API ,还不如直接用原生方式开发。
    easychen
        13
    easychen  
    OP
       2015-09-10 10:37:20 +08:00
    @hantsy 如果按时间表是 10 月发布。如果你考虑到 React 本身可以做 Web APP 的话。 React Native 就只是换掉个模板而已。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:37 · PVG 02:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.