如何使用解析终止重复的用户会话?

时间:2015-08-26 03:24:24

标签: ios xcode swift parse-platform usersession

我希望我的PFSession是独占的,这意味着,如果用户已经在特定位置的某个设备上登录,如果另一个设备使用相同的凭据登录,我希望先前的会话终止,当然是警报视图的消息。有点像旧的AOL即时消息格式。那么有谁知道我会如何快速地这样做?它需要CoreLocation吗?

我在当前用户位置找到了这篇文章,如何将其作为我问题解决方案的一部分?

https://www.veasoftware.com/tutorials/2014/10/18/xcode-6-tutorial-ios-8-current-location-in-swift

更新

所以我刚刚阅读了关于其可撤销会话设置的解析文章

http://blog.parse.com/announcements/announcing-new-enhanced-sessions/

但是,当我使用其他设备登录同一帐户时,会话被允许相应地生活,这是我不想要的。我如何解决我的困境?

更新

我已经详细描述了如何实现我想要实现的整体方法:

enter image description here

但是,我对云代码的实现并不十分精通,有人可以非常简单地描绘一段类似于他试图转发给我的代码吗?

更新

所以我做了一些更多的研究,并且在我关于如何在解析中使用云代码调用方面被告知,并且我想要销毁currentUser的先前会话,我在我的代码中编写了以下代码登录“成功”逻辑:

            PFUser.logInWithUsernameInBackground(userName, password: passWord) {
        (user, error: NSError?) -> Void in
        if user != nil || error == nil {
            dispatch_async(dispatch_get_main_queue()) {
                self.performSegueWithIdentifier("loginSuccess", sender: self)

                 PFCloud.callFunctionInBackground("currentUser", withParameters: ["PFUser":"currentUser"])
                    //..... Get other currentUser session tokens and destroy them

            }

        } else {

如果那是正确的格式或代码,但我确定这是正确的方向吗?任何人都可以编辑或扩展我想要实现的代码吗?

1 个答案:

答案 0 :(得分:2)

您应该首先查看cloud code quick start
然后,您将定义以下云代码功能:

Parse.Cloud.define('destroyUserSessions', function(req, res) {
    //the user that sends the request
    var currentUser = req.user;
    //send from client 
    var currentUserInstallationId = req.param.installationId;
    var Session = Parse.Object.extend('Session');
    var userSessionQuery = new Parse.Query(Session);
    //all sessions of this user
    userSessionQuery.equalTo('user', currentUser);
    //except the session for this installation -> to not log the request performing user out
    userSessionQuery.notEqualTo('installationId', currentUserInstallationId);

    userSessionQuery.find({
        success: function(userSessionsToBeRevoked) {
            Parse.Object.destroyAll(userSessionsToBeRevoked, {
                success: function() {
                    //you have deleted all sessions except the one for the current installation
                    var installationIds = userSessionsToBeRevoked.map(function(session) {
                        return session.installationId;
                    }); 
                    //you can use the installation Ids to send push notifications to installations that are now logged out
                },
                error: function(err) {
                    //TODO: Handle error
                }
            });
        }, 
        error: function(err) {
            //TODO: Handle error
        }
    });
});

注意:此代码未经过测试,并进行了一些假设,例如您启用了可撤销会话,并且用户在执行请求时已登录

你可以这样调用这个函数:

let installationId = PFInstallation.currentInstallation().installationId

PFCloud.callFunctionInBackground("destroyUserSessions", withParameters: ["installationId": installationId]) { success, error in 
    //TODO: Handle success or errors
}

希望这可以让你开始。