Восстановление сессий в Deezer iOS SDK

Я использую Deezer iOS SDK, в Swift пока все идет хорошо, кроме сессии, в Android SDK существует метод .restoreSession(), чтобы каждый раз избегать входа пользователя в систему из всплывающего окна, но я не вижу его в iOS SDK, поэтому каждый раз, когда срок действия сеанса истекает, пользователи получают всплывающее окно для повторного входа в систему с учетной записью Deezer привет, в любом случае, чтобы сохранить или восстановить сеанс в SDK для iOS?

Это код сеанса восстановления 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.")
    }

}

все Делегаты не стреляют deezerDidLogout deezerDidNotLogin deezerDidLogin


person Khodour.F    schedule 07.09.2017    source источник


Ответы (1)


SDK предоставляет DeezerSessionDelegate. Согласно документации, deezerDidLogin вызывается, когда пользователь успешно вошел в систему.

Следовательно, вы можете получить из экземпляра DeezerConnect токен, дату истечения срока действия и идентификатор пользователя. Вы можете сохранить их в связке ключей.

В следующий раз, когда пользователь запустит приложение, вы можете снова установить эти значения в экземпляре DeezerConnect (получив их из цепочки для ключей) и проверить их достоверность, отправив сообщение -[DeezerConnect isSessionValid] этому же объекту. Если сеанс все еще действителен, не просите пользователя снова войти в систему.

Очевидно, что связка ключей является рекомендуемым местом для хранения токена и даты истечения срока действия.

Для получения дополнительной информации: Управление сеансами iOS

Обновить

Можете ли вы изменить способ создания экземпляра синглтона?

Вместо этого кода

//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.

Я думаю, вам также не нужен override в методе init.

person Lorenzo B    schedule 12.09.2017
comment
он не работает на swift , только на target-c, попробуйте, чтобы делегат не срабатывал при входе/выходе пользователя - person Khodour.F; 12.09.2017
comment
@ Джек, можешь уточнить? Я не могу понять ваш вопрос. - person Lorenzo B; 12.09.2017
comment
Я преобразовал их SDK из target-c в Swift, делегат userDidLogin не работает с быстрым кодом :) давай, братан? - person Khodour.F; 12.09.2017
comment
Зачем вам нужно конвертировать библиотеку в Swift? Можете ли вы подключить библиотеку как есть? - person Lorenzo B; 12.09.2017
comment
@Jack В любом случае, вам следует улучшить свой вопрос, поскольку невозможно понять, чего вы от него хотите. - person Lorenzo B; 12.09.2017
comment
Вы правы, я подключил SDK к моему быстрому коду, и теперь сеанс работает нормально, но когда пользователь вошел в систему с помощью deezer, делегат userDidLogin() не запускается из Deezer SDK, это единственная проблема. - person Khodour.F; 13.09.2017
comment
@Jack Вы правильно установили делегата? Можете ли вы показать код? - person Lorenzo B; 13.09.2017
comment
Давайте продолжим обсуждение в чате. - person Lorenzo B; 13.09.2017