即在一个应用中,同一个用户只能在线登陆一个,一个用户登陆,在其他设施上会被即时挤下线,确认后清空登陆该设施上的登陆装填并退回到登陆界面。
uni-app是现在能通过用vue.js框架仅需撰写一套代码同时打包Android,IOS,小程序,头条支付宝微信小程序和H5,通过用HBuilder工具便捷调试与云打包,关于苹果证书,推荐CW.PUB
用HBuilder打越狱包通过那个网站签名就能在正常苹果手机安装,不过网上还有其他些办法这里就不列举了。
一般APP做单用户登陆会用第三方消息推送平台,虽然uni-app虽然也可以对接友盟,极光等推送平台。但还是由于时间,对接平台审核等步骤时间不允许。之前用gatewayworkman和websocket做了即时聊天,所以单用户登陆也用websocket达成。
uni-app socket单用户登陆例1.uni-app前端在初始化socke时发送目前设施的唯一标识,然后实时接收一个强制退出种类的消息,一下只不过简单示例。
//初始化socket.on(init,()={//连接初始化socket.send({type:login,token:uni.getStorageSync(access_token),device_no:plus.device.uuid,//手机设施唯一编号});}).on(quit_push,(res)={if(res){uni.showModal({title:退出公告,content:你的账号在其他设施上登录!,showCancel:true,cancelText:取消,/confirm/iText:确定,success:res={if(res./confirm/i){uni.clearStorageSync()store.commit(chat/clear)uni.reLaunch({url:../../pages/login/index})}elseif(res.cancel){uni.clearStorageSync()store.commit(chat/clear)uni.reLaunch({url:../../pages/login/index})}}});}});
2.后端接收设施唯一标识参数,先查找缓存是不是存在,没有记录设施标识和socket的clientid。
3.登陆接口接收设施标识,缓存或库里取出标识记录与目前接收的设施标识判断是不是一致,不同则依据缓存中的clientid发送消息。
$is_online=Db::name(UserLoginClient)-gt;where(user_id,$user[id])-gt;order(iddesc)-gt;find();if(isset($device_no)amp;amp;$device_noamp;amp;$is_online[device_no]!=$device_noamp;amp;!empty($is_online[device_no])){Tools::sendToClient($is_online[client_id],json_encode([type=gt;quit_push,data=gt;ip,message=gt;强制下线]));}
4.工具类sendToClient办法部分
publicstaticfunctionsendToClient($client_id,$message){Gateway::sendToClient($client_id,$message);}推送单用户登陆例
1.第一对接了友盟,包含前端后端都加了SDK和用上了他们的办法。
2.消息推送有一个唯一值token,这里简称pushtoken,由推广客户端生成,可以标识一个唯一的设施。
3.后端登陆时,接收pushtoken,同样判断该pushtoken是不是存在,没有就以用户ID为键存储。
4.存在时再判断与缓存是不是一致,一致则加长缓存时间,不同则给旧的pushtoken(缓存中的)推送一条消息,并缓存新的pushtoken。
if(self::$headTokenCache::has(self::$prefix.self::$userId)){if(self::$headToken==Cache::get(self::$prefix.self::$userId)){Cache::set(self::$prefix.self::$userId,self::$headToken,self::$timeOut);}else{//换了手机,推广客户端重新发送pushtoken到服务端,服务端与缓存中的pushtoken比较,不同则给原来pushtoken手机推送一条并重新缓存新的token//modifybywensenon20180816//$addr=getCity();$addr=getMobCity();$ip=request()-ip();if($addr){$addr[province]=empty($addr[province])?:$addr[province];$addr[city]=empty($addr[city])?:$addr[city];//$address=/t.$addr[country].-.$addr[region].-.$addr[city].(IP:.$ip.)/t;$address=/t.$addr[country].-.$addr[province].-.$addr[city].(IP:.$ip.)/t;}else{$address=IP:.$ip.;}$OldToken=Cache::get(self::$prefix.self::$userId);if(strlen($OldToken)==64){$content=array(title=APP紧急公告,body=你的账号于:.date(Y-m-dH:i:s).在.$address.处登录,若不为你本人登录,请你立即修改密码!,pull_service=login);/umeng/Push::send($OldToken,unicast,$content,message,true);}elseif(strlen($OldToken)==44){$content=array(pull_service=login,msg=你的账号于:.date(Y-m-dH:i:s).在.$address.处登录,若不为你本人登录,请你立即修改密码!);/umeng/Push::send($OldToken,unicast,$content,message,true);}Cache::set(self::$prefix.self::$userId,self::$headToken,self::$timeOut);}}else{Cache::set(self::$prefix.self::$userId,self::$headToken,self::$timeOut);}
5.APP推广客户端接收推送进行弹窗提示和退出处置。
6.以上是依据友盟的SDK封装的推送办法,其中包含单播,广播,跳应用activity,跳网页连接等等。






