APP推送和APP换起技术方案探讨

2020-08-04

APP推送和APP换起技术方案探讨

目标:

尽量将APP两端设计成统一的方案,减少服务器适配工作量,最好可扩展,能复用。

方案说明:

我们知道APP推送目的是将对用户有用的信息,主动推给APP,作为通知信息展示,用户通过点击通知进入APP相关页面。

这里只要涉及服务器端和APP端两个技术点:服务器推送什么样的信息过来,APP这边如何解析接收到的信息,打开相应的界面和解析数据。

服务器只有一个,所以尽量让服务器发送给两端的数据较为一致,这需要一开始就应该想好整个系统的设计方案。

安卓和iOS是两个完全不同的平台,相关技术栈也不一样。不过基本都要依赖厂商的通讯通道来个APP发通知:苹果有自己的APN通道,Google也有自己的通道,当然在中国,各个厂商有自己的通道。有很多第三方SDK都整合多家厂商的通道。我们使用了信鸽(腾讯云移动推送)的SDK。之所以选他家,主要是他们集成了主流的厂商,文档也还可以(以前他们有免费版)。

为了能拉起APP不同的界面,我们需要定义一套规则。iOS的方案比较固定,只能通过json参数,这是它系统框架决定的。而安卓就不太一样,不同的厂商支持不同的方式,APP存活状态和未启动状态也不太一样。不过有一个方案是所有情形都适用的:就是通过定义Activity的scheme方式。

scheme方式是一种URI,我们经常用的URL地址也是一种URI。URI在iOS或者安卓都经常使用来拉起页面。例如我们的APP主页可以定义URI为: wegene://com.wegene.app/main。这里wegene为schema,host为com.wegene.app,path为/main,还可以携带参数。wegene://com.wegene.app/main?index=1表示首页的第二个tab(index从0开始算)。

这样的话,服务器要推送信息的时候,只需设置path和相关参数就行了。iOS端和安卓端专门弄一个组装函数来组装path和参数:安卓端拼凑URI,设置为action;iOS端将path和参数组成json就行。

安卓端需要通过intentFilter设置好action,然后在activity中获取参数。这里需要注意的是如果APP是未启动的状态,那么这个activity将是第一个被启动的页面,越过了你的启动屏甚至首页,所以要考虑是否要登陆鉴权,必要数据是否已经获取到等问题。iOS端则需要从通知回调里拿到数据,解析出来path和参数信息。这里面要考虑冷启动的时候,根据path来跳转相关界面时,首页是否已经初始化完成。不然可能会出问题,例如要获取NavigationController来push操作,但是NavigationController还未初始化完成。

安卓端每个页面都要设置intentFilter和定义path,而且越过了主界面。当用户看完推送界面并关闭了那个页面,很多APP都会进而打开APP主页。安卓其实也可以统一先打开主页,然后再由主页打开相关页面。这里需要服务器通知配置URI为首页的URI,然后将要跳转的path作为参数附在URI后面。当然这里的path值需要URL编码,跟其他参数一样都要编码。然后在主页通过intent的data里解析出来path和其他参数,进而打开相关页面。

通过设置特殊scheme的方式来进行推送跳转有很多好处。例如iOS和安卓两端通用;不但支持推送拉起,也支持其他APP或者网页拉起(当然网页还有更好的方式)。如果path设置的跟网页的路由一直,那就更容易三端保持一致性了。

APP唤起

我们经常希望自己的APP能被其他应用唤起,进而提高活跃度。APP唤起主要有三种情形:

  • 由系统唤起,例如收到推送通知
  • 有第三方APP唤起,例如有合作APP唤起
  • 通过网页端直接唤起

通过推送唤起上面已经说了,通过第三方APP唤起其实也基本一样,主要通过预定义的scheme唤起。安卓端是跟推送完全一致的,iOS端推送是系统自动唤起的,第三方APP是通过scheme来唤起通信的。网页端其实也可以通过scheme方式来唤起,只是网页端多了些限制(会先弹出一个系统确认框)。

不过网页端有更好的实现方式:直接通过URL来唤起APP相应界面。安卓端这种技术叫APP Link,iOS端叫 Universal Link。其实安卓的APP Link应该是参考iOS的UniversalLink来做的,所以他们的技术基本一致,都要要服务器验证。这里不讲具体的实现细节了。

微信唤起APP,hybrid APP,推送

这里特别说一下微信唤起APP。以前要在微信里拉起自己的APP,很困难,会因为他限制了scheme方式和UniversalLink(AppLink)方式。不过最近微信开放了他的一些能力。例如APP里可以直接拉起微信小程序不受数量限制,微信里可以拉起第三个APP了。这些都是通过微信SDK实现的。

这跟hybrid APP,推送有什么关系呢?其实没太大关系。但是如果你的APP是hybrid APP,有内嵌网页,经常要拦截URL跳转原生界面,也经常要推送消息跳转原生界面,就可以将他们都联系起来。

微信唤起APP可以传入一些参数,这个参数如果是当前网页URL就好了。然后APP里内嵌网页经常要拦截网页URL,然后推送信息里也可以专门定义一个URL参数来指定要跳转的页面。这里就可能专门建立一个类来处理URL的跳转了,因为他们的跳转逻辑是一致的。这样就可以做到最大的逻辑复用,减少bug。


如果你觉得这篇文章有用,请打赏小钱喝杯咖啡^_^ 打赏

Category: 技术 Tagged: 推送 唤起 拉起

comments


《深度学习入门》读后感

2020-05-05

《深度学习入门:基于Python的理论与实现》读后感

最近因为做一个功能要用到深度学习相关知识和TensorFlowLite,我决定认真的学一下深度学习的知识。以前总觉得AI太高大上,怕自己看不懂。但是这次做这个功能让我意识到,如果自己再不学习,过几年可能就太晚了。我估计三五年之后,AI会渗透到各行各业,连APP开发也需要掌握一些深度学习的知识。

先说一下我们APP做的这个功能:用相机扫描检验单(体检单),将检验单截图上传到服务器,服务器进行OCR识别,并将数据结构化,用于生成用户的基因报告。这里涉及到APP开发的部分是将相机中的检验单检测并裁剪出来,上传到服务器识别。这里识别和裁剪部分很重要。将检验单准确的裁剪出来,可以提升OCR准确率。如果随意拍了一张图片,除了检验单部分,可能还包含了其他杂乱的背景,甚至其他不相关的文字内容。所以只将检验单部分裁剪出来是很重要的。

如果采用传统的OpenCV边缘检测方法来在图片中来找检验单,效果不尽人意。但是如果采用深度学习的方式来找检验单,那就可以得到很好的效果。当然这也是我们从fengjian大神博客学到的。我们采用他的方法,自己准备了一批数据训练,得到一个模型。而我们APP的任务就是在手机上采用TensorFlowLite运行我们的模型来推断得到相关结果。

因为做这个功能,我了解了下TensorFlowlite,但是我们深度学习却是了解不多。所以我决定找本书来学习一下。网上查了下,《深度学习入门:基于Python的理论与实现》这本书挺受好评,问了下我同事,他也看过这书,说写得不错 ...

Category: 技术 Tagged: 深度学习 人工智能 读后感

comments

Read More

探讨从H5页面拉起APP的技术方案和问题

2020-03-07

探讨从H5页面拉起APP的技术方案和问题

从H5页面里拉起或叫唤起APP(APP需已经安装在手机上),有两种技术方案,一种通过HTTP链接(iOS叫 Universal Link,安卓叫APP Links技术)拉起技术,一种是通过自定义scheme拉起技术(也有叫深度链接deeplink的)。这两个技术适用不同的场景,也有不同的局限性。

一、通过HTTP链接拉起

要想通过HTTP(s)链接直接拉起APP,需要APP本身做一些配置和写一些代码实现,还需要在你网站服务器配置相关的json文件。例如配置服务器host,能打开页面的path等。有些了这些配置,苹果服务器或者谷歌的服务器验证了这些配置,就可以通过相关的HTTP链接来打开APP了

这里不管是iOS叫 Universal Link,还是安卓的APP Links,他们的技术方案是基本一样的,只是不同的平台稍微有些不一样的而已。基本规则是:

  • 先按照要求生成一个配置文件,json格式的,里面包括了一些必要的信息,例如安卓的包名,apk签名等,iOS的appID,匹配URL的path
  • 将配置文件放到你的网站根目录下的.wellknown目录下,让苹果或谷歌的服务器能从这里下载这个配置文件。这个文件是关键,因为苹果或谷歌要从你网站里拉取到这个配置文件。由于你的网站只有你自己有权限上传配置文件,从而保证了安全性。
  • 在你的APP里配置相关网站host ...

Category: 技术 Tagged: APP

comments

Read More

AOP在移动开发中的应用

2020-01-21

AOP在移动开发中的应用

下面是我在我们团队上的技术分享内容,从PPT里摘抄出来的,所有很多都是个提纲摘要

AOP简介

  • AOP,Aspect Oriented Programming,面向切面编程
  • 面向切面编程是一种通过横切关注点(Cross-cutting Concerns)分离来增强代码模块性的方法,它能够在不修改业务主体代码的情况下,对它添加额外的行为。
  • 是对OOP的一种补充,是一种解耦的重要手段

AOP常用概念

  • Join point:程序执行期间的一个点,表示方法的执行
  • Pointcut: 切入点实际上也是从所有的连接点(Join point)挑选自己感兴趣的连接点的过程
  • Aspect: 程序横向切割成若干的面,即Aspect.每个面被称为切面
  • Advice: 某个特定连接点的某个方面采取的行动。不同类型的建议包括“周围(Around)”,“之前(Before)”和“之后(After)”建议

AOP实现原理

  • 编译期间的静态织入,又称为编译时增强

  • 运行期间的动态代理,又称为运行时增强

运行时AOP

  • 程序运行时 ...

Category: 技术 Tagged: AOP 移动开发

comments

Read More

记一次WebView填坑过程--由换行符引发的血案

2019-07-27

记一次WebView填坑过程--由换行符引发的血案

最近使用WebView掉坑了,然后艰难爬坑经历感触很深,写出来大家借鉴一下。

需求

我们有个网页需要用到很多js库,这些库比较大,而且基本上是不变的。为了提高性能,将这些网页和JS库放到本地,进行加载。变的数据从服务器获取,然后跟本地的HTML组装后显示。这种需求还是挺普遍的。

实现方式

由web的同事调试好HTML文件,他们把所有的HTML,js,css,image和资源一起打包给我们 我们把这些资源放到assets目录下(也可以专门在assets再建一个子目录来放)

采用Android自带的WebView来加载和显示这些网页。有两个方法loadUrlloadDataWithBaseUrl方法。

1.loadUrl("file:///android_asset/xxxxxx.html")这种方式适合HTML不需要改变的情况,直接加载展示,省时省力

2.loadDataWithBaseUrl方式需要先把HTML内容现在到内存,然后再展示。这种方式可以随意修改HTML里的内容,修改好再交由WebView展示,灵活性强。

遇到的坑

测试的时候,我们遇到同一个HTML文件,通过loadUrl方式加载展示,没有任何问题。但是通过loadDataWithBaseUrl加载展示,HTML的内容死活展示不出来 ...

Category: 技术 Tagged: Android开发 WebView JavaScript

comments

Read More

如何写出不太坏的代码

2019-02-28

如何写出不太坏的代码

本来想把标题定为“如何写出好代码”的,但是转念一想,觉得自己没那么牛逼,就改成了不太坏的代码。只要不要写出太糟糕的代码,不就是好代码了吗?

以下只是个人的一些总结,如有异议,请出门右转。

1.注重命名

包括文件名,变量名,方法名。一般变量名以功能来命名,看它的名字就能知道它的用途是什么 遵循一些命名规范。Java中成员变量名一般以m开头,而OC中的成员变量一般以_开头

2.遵循低耦合,高内聚的原则编写代码

具体表现遵循分层分模块原则,底层模块不能依赖上层模块,逻辑层不依赖界面,绝不要把逻辑层代码和界面代码混在一起

3.针对接口编程,而不是实现编程

当一个类要暴露一些方法给外部调用或者通信时,先定义好接口。接口定义应该简单明了,不容易引起歧义,接口尽量少。最后才考虑内部实现,而且尽量不暴露给外部,尽量不需要外部知道内部是如何实现的

4.一个类的代码量尽量不要太大,一个方法只做一件事情

一个类(或者一个方法)的代码越多,出错的概率越大。一个类三到5百行代码最佳。如果一个类的代码太多,就要考虑这个类是不是做的东西太多了 ...

Category: 技术 Tagged: iOS开发 Android开发

comments

Read More

iOS开发如何做外部测试

2019-01-05

iOS开发如何做外部测试

我们做APP开发的,开发出来的APP还未上线,又要想给别人用一下,该怎么做?实际上这是我们每个做APP开发的人都会遇到的,但是并不是每个人都清楚怎么做,有哪些方式。今天我们就来讲一讲。

在将iOS的APP如何给别人使用和测试前,先说一下安卓APP开发是怎么做的。安卓端是很简单的,你只要先生成一个证书文件keystone,然后用这个文件给apk签名,就可以将apk发给任意一个人安装使用了。这很简单,也很方便。可是iOS的就没那么容易了。我们还是从最简单的开发人员如何用真机测试开始说起。

真机调试

我们有了一个想法,并开始写代码,模拟器调试很方便,要在iPhone上看效果怎么办了。你直接将iPhone连上电脑是不行的。现在的情况至少你需要一个Apple ID,在Xcode上登录你的账号,在调试前Xcode会自动帮你初始化一些东西,然后就可以将APP安装到你的iPhone上了。在以前,你这个AppleID不能是普通的账号,必须是付了前的开发者账号才行。现在苹果放宽限制了。

这种方式的做法是你的手机必须连上你的电脑,在Xcode上选择你的iPhone来调试,Xcode会自动帮你注册设备的UDID。如果你没办法把iPhone连接到电脑上呢?或者不方便把iPhone连接到电脑上,毕竟如果是老板的手机的话,不方便那种做的。那我们需要一种把安装包提供给别人安装,或者一个地址给别人安装的方式。

adhoc 方式

我们将项目archive后,在导出(现在Xcode叫distribution)的时候,有个选项是adhoc ...

Category: 技术 Tagged: iOS开发 beta测试 TestFlight 公开链接

comments

Read More

SVG图片在移动端的应用解决方案

2018-11-03

SVG图片在移动端的应用解决方案

近几年来SVG使用得越来越多,就连Android的官方库也加入VectorDrawable的支持。这个类就是用来支持向量图的。SVG图片在web端使用非常广泛,我第一次接触这个也是在做react-native的项目中使用的。当时我们要做一些动画,需要从一个形状变换成另一个形状,这种一般都是用矢量图来做的。当时设计师就给了我一些矢量图,于是我就开始研究这个东西。

在react-native中,有专门一个库叫react-native-svg来处理这个。不过当时要做两个SVG形状的动画变化,并不是任何一个形状都可以的,需要遵循一定的标准。设计师给我的两个SVG文件并不能转换。后来是我自己根据文件里的一些关键参数自己在代码里直接画出来后,再做转换动画。

最近我在做的native项目中,也遇到了要用SVG的图片。我们的项目里要从服务器下载SVG图片来展示。我们要实现的这些文件是需要服务器动态配置的,也就是说我们不能预先打包进我们的APP里。所以我们这里的要提供一个解决方案,跟图片JPG图片一样显示,缓存。

这个需求跟之前我遇到的那个需求是很不一样的,之前的是设计师已经定义好图片,我们工程师直接拿到文件在程序里展示,不需要考虑下载和缓存之类的。这种需求其实很简单,我们实际上大部分的需求就是这种需求,网上有很多库可以完成这种需求。把SVG图片跟JPG等普通图片一样使用,网上的方案还真不多,特别是iOS方面。。。。

要像普通图片一样使用,就要考虑下载,本地缓存,内存缓存。像这种需求,我们移动端都会使用专门的图片框架,像安卓端的glide,UIL等,iOS端的SDWebImage等。但是这种库它是默认都不会考虑SVG图片。但是我们最好还是像使用这种框架来处理SVG图片 ...

Category: 技术 Tagged: 算法 SVG androidsvg glide Macaw

comments

Read More

多家公司的人证比对算法体验和开发感想

2018-07-13

多家公司的人证比对算法体验和开发感想

最近在开发一个声纹采集一体机系统,这个系统里用到了人证比对功能,即刷身份证后拍照,然后将身份证里面的照片跟拍照比对,验证是否是同一个人。我们不是做人脸识别的公司,所以人脸识别功能当然是接入别人的SDK,这里我们找了好多家的人脸算法,对接过程中也遇到很多问题。经过这次的开发,我了解到这个行业的一些现状。

我们的系统主要运行在Windows电脑上,而且需要无网络也能使用,所以人脸算法必须是用离线版的。人脸算法厂家一般对外提供两种方式:在线版和离线版。一般在线版都可以提供免费试用,离线版需要授权使用。

云端方案

在线版的人脸识别我试用过依图科技的和中科视拓的SDK。在我们的应用声临其境APP上有个声纹购物的场景,需要人脸验证。这两个厂家提供的API都差不多,依图的API安全性考虑更全面,错误码定义的比较详细。还有他们的API共同点是,图片传输都是将图片数据进行base64编码后传输的。至于准确率,感觉都差不多,没有特别明显的差距。

离线方案

离线版的人脸算法用得比对多。因为它是用在我们要卖的机器上,而在线版的我们只是做试验。离线版的集成和使用要比在线版麻烦很多。由于离线版要给出算法库,处于安全和容易被拷贝的原因,都是要先授权的。授权的方式一般有两种:在设备上接入加密狗USB key或者绑定设备机器码的方式。加密狗方式比较方便,我们一般采用这种方式。

我们接入了很多厂家,有阅面科技,中控,杰锐达,商汤,我还把开源的dlib人脸识别也接入了 ...

Category: 技术 Tagged: 人脸检测 人证比对 dlib electron

comments

Read More

Flutter框架研究和与RN对比

2018-03-16

Flutter是什么

现在技术更新迭代真的很快,每隔几年就会出现一些新的技术。当然,Flutter出现有有一点时间了,只不过还未真是发布,但是已经有一些人在使用了。这篇文章主要内容来自我在公司内部的一次分享会,所以大部分内容都是提炼。

  • Flutter 是由 Google 的工程师团队打造的,用于创建高性能、跨平台的移动应用的框架。
  • Flutter 针对当下以及未来的移动设备进行优化,专注于 Android and iOS 低延迟的输入和高帧率
  • Flutter的设计跟react-native很像,但是比RN进了一步
  • Flutter的开发语言是Dart

移动端跨平台开发技术演进

现在主流的移动开发平台是Android和iOS,之前还有过windows phone,每个平台的开发技术都不太一样。大家都是针对每个平台开发应用。自然有人就会觉得这样效率低下,想进行跨平台开发。从最开始的Hybrid混合开发技术,到RN的桥接技术,到现在新兴的Flutter技术,跨平台开发技术一直在演进。

以往最早的Hybrid开发,主要依赖于WebView。但是WebView是一个很重的控件,很容易产生内存问题,而且复杂的UI在WebView上显示的性能不好。react-native技术抛开了WebView,利用JavaScriptCore来做桥接,将js调用转为native调用,只牺牲了小部分性能获取的跨平台开发,这是一大进步。所以现在react-native很流行的原因。

react-native原理图

上图react-native框架原理

Flutter实现跨平台采用了更为彻底的方案 ...

Category: 技术 Tagged: ReactNative Flutter

comments

Read More
Page 1 of 3

Next »