2015-03-30 5 views
1

Прямо сейчас я получаю токен устройства через didRegisterForRemoteNotificationsWithDeviceToken. Тем не менее, мне нужно использовать токен устройства позже в моем приложении после моего входа в систему.Где я могу хранить токен устройства iOS для последующего использования?

Как я могу получить доступ к устройству Token из другого места в приложении позже, и если я не могу, как/где я могу его сохранить в didRegisterForRemoteNotificationsWithDeviceToken, так что я могу получить его позже?

ответ

2

Самый простой способ заключается в использовании NSUserDefaults

Экономия:

NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; 
[ud setObject:myPushToken forKey:@"currentPushToken"]; 
[ud synchronize]; 

Восстановление:

NSString * currentPushToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentPushToken"]; 
2

Его лучше использовать keychain для таких данных.

Добавить этот класс funcs к вашему проекту

import UIKit 
import Security 
class Keychain { 

    class func save(key: String, data: NSData) -> Bool { 
    let query = [ 
     kSecClass as String  : kSecClassGenericPassword as String, 
     kSecAttrAccount as String : key, 
     kSecValueData as String : data ] 

    SecItemDelete(query as CFDictionaryRef) 

    let status: OSStatus = SecItemAdd(query as CFDictionaryRef, nil) 

    return status == noErr 
    } 

    class func load(key: String) -> NSData? { 
    let query = [ 
     kSecClass as String  : kSecClassGenericPassword, 
     kSecAttrAccount as String : key, 
     kSecReturnData as String : kCFBooleanTrue, 
     kSecMatchLimit as String : kSecMatchLimitOne ] 

    var dataTypeRef :Unmanaged<AnyObject>? 

    let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef) 

    if status == noErr { 
     return (dataTypeRef!.takeRetainedValue() as NSData) 
    } else { 
     return nil 
    } 
    } 

    class func delete(key: String) -> Bool { 
    let query = [ 
     kSecClass as String  : kSecClassGenericPassword, 
     kSecAttrAccount as String : key ] 

    let status: OSStatus = SecItemDelete(query as CFDictionaryRef) 
    return status == noErr 
    } 

    class func clear() -> Bool { 
    let query = [ kSecClass as String : kSecClassGenericPassword ] 
    let status: OSStatus = SecItemDelete(query as CFDictionaryRef) 
    return status == noErr 
    } 
} 

И вы используете его как этот

Для хранения (пропуск строки в вашем случае, маркер)

if let data = pass.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: false) { 
    let saveSuccess = Keychain.save("Password", data: data) 
} 

Для загрузки

data = Keychain.load("Password") 
var pass =NSString(data: data, encoding: UInt())