前言:由于我们的项目是一款针对于海外用户的APP,国内的一些第三方SDK
会受到一些限制,项目中要做的一个功能,本来国内使用极光推送就可以完全实现,然后我们就部署了,但是做完之后发现国外的用户有时候会收不到推送信息,这时候联系极光的客服,对方说需要开通海外服务器的权限(其实就是开通VIP),然后给了几天的测试,效果确实不错,然后价格也确实不错,千人日活的年费大概是3万元左右,我们现在应用的总用户达到了600多万(具体日活就不说了),费用可想而知,最后就给PASS掉了,有点说 跑偏了。。。接下来进入正题:
APP运行环境:
机顶盒或电视
实现的功能:
1:用户打开微信登录页面,使用手机微信扫描二维码完成登录功能。
2:用户在设备A登录成功,用同一个微信账号在设备B登录,设备A退出
3:用的打开微信支付页面,用户扫码付款后关闭支付页面并显示到期时间。(和1逻辑一样)
具体实现:
其实Android端要做的事情很少,基本就是一个发送和接收的过程,然后做一个心跳,保证和服务端的长连接不会断掉,能收到服务端发送过来的信息并且处理就可以了。本来这个功能使用轮询也可以做到,功能1和3使用轮询是没有问题的,因为他们只是在一个Activity页面中去做这个事情,大不了给他一个时间,固定的时间内没有完成操作直接把页面和轮询关掉就可以了,这时候对应用本身是没有任何影响的,但是功能2就不一样了,只要是登录状态下,应用就要一直和后台保持连接,如果服务器有信息发送过来就要立马接收并且退出账号(其实也可以把这个功能放到页面间的跳转或者某个事件里面,但是需求如此,没有办法。。。),好了,废话又开始了,直接上代码:
/**
* 心跳检测时间
*/
private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒进行一次对长连接的心跳检测
private static final String WEBSOCKET_HOST_AND_PORT = "ws://ws.*****.net:8090";//替换为自己的主机名和端口号
private WebSocket mWebSocket;
// 初始化socket
private void initSocket() throws UnknownHostException, IOException {
OkHttpClient client = new OkHttpClient.Builder().readTimeout(0, TimeUnit.MILLISECONDS).build();
Request request = new Request.Builder().url(WEBSOCKET_HOST_AND_PORT

本文介绍了在海外环境下,由于第三方SDK限制,选择使用WebSocket实现在Android机顶盒或电视上实现用户登录限制功能。当同一微信账号在不同设备登录时,已登录设备将自动退出。主要工作集中在发送和接收消息,保持长连接。代码实现中,WebSocket被置于Service中,由Activity控制其生命周期。
1987

被折叠的 条评论
为什么被折叠?



