【问题标题】:Restoring sessions in Deezer iOS SDK在 Deezer iOS SDK 中恢复会话
【发布时间】:2018-02-15 18:38:55
【问题描述】:

我正在使用Deezer iOS SDK,到目前为止,在 Swift 中,除了会话之外,一切都很顺利,在 Android SDK 中,存在一个方法 .restoreSession() 可以避免每次弹出用户登录,但我在 iOS SDK 中看不到它,所以每次会话过期时,用户都会弹出使用 hi 的 Deezer 帐户再次登录,无论如何要在 iOS SDK 中保存或恢复会话?

这是 Android 恢复会话代码:

// restore any saved session
SessionStore sessionStore = new SessionStore();
if (sessionStore.restore(deezerConnect, context)) {
    // The restored session is valid, navigate to the Home Activity
    Intent intent = new Intent(context, HomeActivity.class);
    startActivity(intent); 
}

在 iOS SDK 中也可以这样做吗?

因为当用户使用 Deezer SDK 登录时,我没有收到委托的通知

class DeezerSession : NSObject, DeezerSessionDelegate
{


    var DZRReqManager:DZRRequestManager = DZRRequestManager()
    var deezerConnect:DeezerConnect!

    let defaults = UserDefaults.standard
    var callbackLogin : (()->())? = nil

    //SHARED INSTANCE
    static var instance: DeezerSession!
    class func sharedInstance() -> DeezerSession {
        if self.instance == nil
        {
            self.instance  = DeezerSession();
        }
        return self.instance
    }

    override init()
    {
        super.init()
        self.deezerConnect                  = DeezerConnect(appId: "***" , andDelegate: self )
        self.DZRReqManager.dzrConnect       = self.deezerConnect
        self.deezerConnect.sessionDelegate  = self

        self.retrieveTokenAndExpirationDate()
    }

    // See http://www.deezer.com/fr/developers/simpleapi/permissions
    // for a description of the permissions
    func connectToDeezerWithPermissions()
    {
        print("[DeezerSession] connectToDeezerWithPermissions.")

        //Check if Session still valid update it
        self.deezerConnect.authorize([DeezerConnectPermissionBasicAccess,
                                      DeezerConnectPermissionManageLibrary,
                                      DeezerConnectPermissionOfflineAccess
                                      ])
    }

    func saveToken(token:String,expirationDate:Date,userId:String)
    {
        print("[DeezerSession] Token. \(token) : Saved ")
        print("[DeezerSession] Expire Date after. \(expirationDate) : Saved ")
        print("[DeezerSession] User ID . \(userId) : Saved ")

        defaults.setValue(token, forKey: "DEEZER_TOKEN_KEY")
        defaults.setValue(expirationDate, forKey: "DEEZER_EXPIRATION_DATE_KEY")
        defaults.setValue(userId, forKey: "DEEZER_USER_ID_KEY")
    }

    func deezerSessionDidConnect()
    {


    }

    func retrieveTokenAndExpirationDate()
    {
        self.deezerConnect.accessToken      = defaults.string(forKey: "DEEZER_TOKEN_KEY")
        self.deezerConnect.expirationDate   = defaults.object(forKey: "DEEZER_EXPIRATION_DATE_KEY") as? Date ?? Date()
        self.deezerConnect.userId           = defaults.string(forKey: "DEEZER_USER_ID_KEY")

        print("[DeezerSession] Token. \(self.deezerConnect.accessToken) : Restored ")
        print("[DeezerSession] Expire Date. \(self.deezerConnect.expirationDate) : Restored ")
        print("[DeezerSession] User ID . \(self.deezerConnect.userId) : Restored ")
    }

    func isSessionValid()-> Bool
    {
        print("[DeezerSession] isSessionValid . \(self.deezerConnect.isSessionValid()) ")
        return self.deezerConnect.isSessionValid()
    }


    func deezerDidLogin()
    {
        print("[DeezerSession] deezerDidLogin.")
        self.saveToken(token : self.deezerConnect.accessToken,
                       expirationDate : self.deezerConnect.expirationDate  ,
                       userId : self.deezerConnect.userId)

        if  self.callbackLogin != nil
        {
            self.callbackLogin!()
        }
    }

     func deezerDidNotLogin()-> Bool
    {
        print("[DeezerSession] deezerDidNotLogin.")
        return true
    }

     func deezerDidLogout()
    {
        print("[DeezerSession] deezerDidLogout.")
    }

}

所有代表都没有解雇deezerDidLogoutdeezerDidNotLogindeezerDidLogin

【问题讨论】:

    标签: ios swift sdk deezer


    【解决方案1】:

    SDK 提供DeezerSessionDelegate。根据文档,当用户成功登录时会调用deezerDidLogin

    因此,您可以从DeezerConnect 实例中检索令牌、到期日期和用户标识符。您可以将它们保存到钥匙串中。

    下次用户启动应用程序时,您可以在DeezerConnect 实例上重新设置这些值(从钥匙串中检索它们)并通过向同一对象发送 -[DeezerConnect isSessionValid] 消息来测试它们的有效性。如果会话仍然有效,则不要要求用户再次登录。

    显然,钥匙串是存储令牌和到期日期的建议位置。

    更多信息:iOS Session Management

    更新

    您能否修改创建单例实例的方式?

    代替这段代码

    //SHARED INSTANCE
    static var instance: DeezerSession!
    class func sharedInstance() -> DeezerSession {
        if self.instance == nil
        {
            self.instance  = DeezerSession();
        }
        return self.instance
    }
    

    随便用

    static let shared = DeezerSession()
    

    事实上,这是在 Swift 中使用单例的推荐方式。

    我认为您也不需要 init 方法中的 override

    【讨论】:

    • 它不能在 swift 上运行,仅在 Objective-c 上,请尝试在用户登录/注销时不触发代理
    • @Jack 你能详细说明一下吗?我无法理解你的问题。
    • 我已经将他们的 SDK 从 objective-c 转换为 Swift,userDidLogin 的代表没有处理 swift 代码:) 兄弟?
    • 为什么需要在 Swift 中转换库?你能按原样桥接图书馆吗?
    • @Jack 无论如何,你应该改进你的问题,因为你无法理解你想要从中得到什么。
    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-05-21
    相关资源
    最近更新 更多