在 Deezer iOS SDK 中恢复会话
Restoring sessions in Deezer iOS SDK
我正在使用 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.")
}
}
所有代表都没有开火 deezerDidLogout
deezerDidNotLogin
deezerDidLogin
SDK提供DeezerSessionDelegate
。根据文档,当用户成功登录时调用 deezerDidLogin
。
因此,您可以从 DeezerConnect
实例中检索令牌、到期日期和用户标识符。您可以将它们保存到钥匙串中。
下次用户启动应用程序时,您可以在 DeezerConnect
实例上重新设置这些值(从钥匙串中检索它们)并通过发送 -[DeezerConnect isSessionValid]
消息来测试它们的有效性这个相同的对象。如果会话仍然有效,则不要要求用户再次登录。
显然,Keychain 是用于存储令牌和到期日期的建议位置。
更新
您能否修改创建单例实例的方式?
代替此代码
//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
。
我正在使用 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.")
}
}
所有代表都没有开火 deezerDidLogout
deezerDidNotLogin
deezerDidLogin
SDK提供DeezerSessionDelegate
。根据文档,当用户成功登录时调用 deezerDidLogin
。
因此,您可以从 DeezerConnect
实例中检索令牌、到期日期和用户标识符。您可以将它们保存到钥匙串中。
下次用户启动应用程序时,您可以在 DeezerConnect
实例上重新设置这些值(从钥匙串中检索它们)并通过发送 -[DeezerConnect isSessionValid]
消息来测试它们的有效性这个相同的对象。如果会话仍然有效,则不要要求用户再次登录。
显然,Keychain 是用于存储令牌和到期日期的建议位置。
更新
您能否修改创建单例实例的方式?
代替此代码
//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
。