美文网首页iOS开发常用方法
iOS开发:不同手机设备登陆同一账号,实现踢人掉线功能

iOS开发:不同手机设备登陆同一账号,实现踢人掉线功能

作者: First灬DKS | 来源:发表于2016-12-02 12:57 被阅读467次

    开发中,我们一般是不允许两个或者多个手机登陆同一个账号的,如果有别的手机登陆了这个账号,那么其它在登陆这个账号的手机就要被踢掉线;

    踢人

    如何实现这一功能呢,其实大部分的工作都是后台的;我们在登陆注册的时候,云端会给我们生成一个cookie(我们不需要关心cookie是什么,里面可能包含了userId和deviceId),我的做法是把cookie存在本地;

    我们一般都有自己的网络请求类,一般都是对AFNetworking的封装,如果有别的手机B登陆了A这个账号,此时A这个手机再进行网络请求时,我们在封装的请求类里面截取每次的请求结果,后台会给一个错误的请求结果(如请求的result=-62),我们根据这个请求作出操作,以上是开发思路,代码过程如下:

    .h代码(此处我只写了Get请求,Post请求一样需要处理,限于篇幅长度...)

    #import <Foundation/Foundation.h>
    
    typedef void (^SuccessBlock)(NSDictionary *data);
    typedef void (^FailureBlock)(NSError *error);
    
    @interface SYNetworkingManager : NSObject
    
    @property (nonatomic, copy) SuccessBlock successBlock;
    @property (nonatomic, copy) FailureBlock failureBlock;
    
    /**
     *  发送get请求
     *
     *  @param URLString  请求的网址字符串
     *  @param parameters 请求的参数
     *  @param success    请求成功的回调
     *  @param failure    请求失败的回调
     */
    + (void)getWithURLString:(NSString *)urlString
                  parameters:(id)parameters
                     success:(SuccessBlock)successBlock
                     failure:(FailureBlock)failureBlock;
    
    @end
    
    

    .m代码(关键是截取请求结果)

    + (void)getWithURLString:(NSString *)urlString
                  parameters:(id)parameters
                     success:(SuccessBlock)successBlock
                     failure:(FailureBlock)failureBlock
    {
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        manager.requestSerializer.timeoutInterval = 5;
        [manager GET:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            if (successBlock) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
                //每次请求到数据之后,都去分析这个数据是否是后台返回的被踢掉的信息
                [SYNetworkingManager kickPlayer:dic];
                successBlock(dic);
            }
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            if (failureBlock) {
                failureBlock(error);
                NSLog(@"网络异常 - T_T%@", error);
            }
        }];
    }
    
    + (void)kickPlayer:(NSDictionary *)dataDic
    {
         //如果是后台返回的被踢掉的信息
        if ([dataDic[@"result"] integerValue] == -62) {
              //则发送一个通知
            [[NSNotificationCenter defaultCenter] postNotificationName:@"kickPlayer" object:dataDic];
        }
    }
    
    

    我们只需要在AppDelegate中注册通知,执行想要执行的方法操作

    //APP在活跃状态
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        //注册通知,不同手机登陆同一账号,踢人
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(kickPlayer:) name:@"kickPlayer" object:nil];
    }
    
    //APP在非活跃状态
    - (void)applicationWillResignActive:(UIApplication *)application {
        //移除踢人的监听
        [[NSNotificationCenter defaultCenter] removeObserver:@"kickPlayer"];
    }
    
    //收到通知的处理
    - (void)kickPlayer:(NSNotification *)notification
    {
         //如果本地存储的cookie存在
        if ([K_UserDefaults objectForKey:K_User_Cookie]) {
              //删除cookie,并弹出提示框
            [K_UserDefaults removeObjectForKey:K_User_Cookie];
            NSDictionary *dic = notification.object;
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:dic[@"message"] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
            alertView.tag = 100;
            [alertView show];
        }
    }
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (alertView.tag == 100) { //踢人
            //这个主要是更换window的根视图控制器,弹出登陆界面
            self.window.rootViewController = self.loginVC;
        }
    }
    

    如果哪位大神觉得写得不好的话,轻喷(毕竟,我还只是个孩子😁),如果有好的想法,希望留言,我好借鉴;

    相关文章

      网友评论

      • 追沐:我们是用推送,A帐号在别手机一登录,然后又在手机二登录后,给手机一推送一条消息,但是这种有坑,就是推送延迟或者推送不稳定就实现不了了。不知道还有没有其他更好的方法,微信、QQ是怎么做的他们都做的很好。
        First灬DKS:@handone 使用极光的自定义消息也是可以的吧;
        handone:如果用户不接受推送呢?
        First灬DKS:通过推送也是很好的方法,不过听说安卓那边有些类型的手机是不能收到极光推送的!至于QQ、微信,我也很想知道实现原理,不过有一点是,他们使用了长链接!
      • 跳跳虾:重新登录后 是怎么处理的??回到被挤掉线的页面吗?还是回到首页?
        First灬DKS:一般的APP都是登陆完在首页吧,我也是这么实现;
      • 闲云悠鹤蝶恋舞:你好,这样如果A手机打开APP一直放在那不操作的话,这时B手机登录了此账号,此时A手机岂不是没有下线的提醒吗,这样就做不到实时了吧
        First灬DKS:这样确实做不到及时退出登录,如果想要做到及时退出,貌似需要用到长链接,不过我对这块儿不熟,如果有好的方法,也希望分享一下!:smile:

      本文标题:iOS开发:不同手机设备登陆同一账号,实现踢人掉线功能

      本文链接:https://www.haomeiwen.com/subject/lwzfmttx.html