2017-05-30 15 views
1

Ich baue eine Shopify App, sondern in erster Linie dies ist kein Shopify SDK Frage, es ist in Bezug auf einen Kunden Token in userDefaults oder Schlüsselanhänger zu speichern. Ich habe versucht, aber die meisten Schlüsselanhänger-Bibliotheken Ich habe versucht, nur mit Streichern arbeiten und ich brauche das Token als Ganzes zu retten, die wie folgt aussieht:Wie Objekt in UserDefaults oder am Schlüsselbund speichern - Swift 3

BUYCustomerToken(customerID: NSNumber!, accessToken: String!, expiry: Date!) 

Der gemeinsame Client der App das Token zuzugreifen aussieht dies:

BUYClient.sharedClient.customerToken 

Während der Anmeldung wird Benutzer erfolgreich mit Token erstellt. Sobald ich in die App verlassen und zurück die

BUYClient.sharedClient.customerToken = "" 

Also meine Frage ist, wie speichere ich diese Aufgabe in Verzug oder Keychain später zu erinnern, als App eingeben. Ich kann nicht nur einen Teil des Tokens speichern, wie den accessToken, der nur ein String ist, ich brauche die ganze Sache. Danke im Voraus!

Antwort

0

Sie können mehr als String-Typen in UserDefaults speichern, müssen Sie Ihren Token in mehr Schlüsseln speichern.

https://developer.apple.com/reference/foundation/userdefaults

Die NSUserDefaults Klasse Komfortmethoden bietet gängige Typen wie Schwimmer für den Zugriff auf verdoppelt, ganze Zahlen, Boolesche Werte und URLs. Ein Standardobjekt muss eine Eigenschaftsliste sein, dh eine Instanz von (oder für Sammlungen, eine Kombination von Instanzen von): NSData, NSString, NSNumber, NSDate, NSArray oder NSDictionary.

wenn Sie das Verfallsdatum speichern möchten

let expiry = UserDefaults.standard.object(forKey: "expiry") as? Date 
UserDefaults.standard.set(Date(), forKey: "expiry") 

CustomerID

let customerID = UserDefaults.standard.object(forKey: "customerID") as? NSNumber 
UserDefaults.standard.set(1234, forKey: "customerID") 

Und für das Token gleich.

NSUserDefaults.standardUserDefaults().setObject("YourAccessToken", forKey: "accessToken") 

let accessToken = NSUserDefaults.standardUserDefaults().stringForKey("accessToken") 

Auf diese Weise müssen Sie sie nur eins nach dem anderen holen, aber Sie haben alle gespeichert. Ich hoffe es hilft dir!

+0

Vielen Dank gute Antwort! Ich habe es genau herausgefunden, bevor ich das gesehen habe, und habe deine Methode ziemlich oft benutzt! Danke für die klare Antwort! –

0

Sie definitiv können das ganze Objekt in Ihrem UserDefaults oder einem Schlüsselbund speichern, kein Problem. Der Trick besteht darin, es dem NSCoding Protokoll anzupassen, dann NSKeyedArchiver und NSKeyedUnarchiver zu verwenden, um es zu und von einem Data Objekt zu konvertieren, das gespeichert werden kann. Mach dir keine Sorgen, es klingt komplizierter als es ist.

Konform zu NSCoding

Vermutlich Ihre BUYCustomerToken Klasse ist bereits ein Nachkomme von NSObject, so sind Sie auf halbem Wege. Sie brauchen nur ein paar Methoden um Ihre eigene Klasse zu ermöglichen, codiert werden (in Data gedreht) und decodiert automatisch von einem NSCoder. Insbesondere sind dies: encode(with coder: NSCoder) und init(coder aDecoder:NSCoder). Sie verwenden dann die verschiedenen Funktionen encode() und decode() des Coders, um diese zu arbeiten.encode() und decode() arbeiten an jedem Objekt, das NSCoding unterstützt, einschließlich NSNumber, String und Date, so dass Ihre Arbeit hier ziemlich einfach ist. Eine fertige codierbare Klasse wird wie folgt aussehen:

class BUYCustomerToken : NSObject, NSCoding { 

    var customerID: NSNumber! 
    var accessToken: String! 
    var expiry: Date! 

    override init() { 
    } 

    convenience init(customerID: NSNumber, accessToken: String, expiry: Date) { 
     self.init() 
     self.customerID = customerID 
     self.accessToken = accessToken 
     self.expiry = expiry 
    } 

    required init(coder aDecoder: NSCoder) { 
     customerID = aDecoder.decodeObject(forKey: "customerID") as! NSNumber 
     accessToken = aDecoder.decodeObject(forKey: "accessToken") as! String 
     expiry = aDecoder.decodeObject(forKey: "expiry") as! Date 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(customerID, forKey: "customerID") 
     aCoder.encode(accessToken, forKey: "accessToken") 
     aCoder.encode(expiry, forKey: "expiry") 
    } 

    override var description: String { 
     return "ID: \(customerID!), Token: \"\(accessToken!)\", Expires: \(expiry!)" 
    } 
} 

Sie können natürlich Ihre eigenen benutzerdefinierten Methoden hinzufügen. Die description ist nicht unbedingt notwendig, aber bequem zum Testen.

Speichern und Abrufen von UserDefaults

Jetzt, wo Sie Ihre Klasse unterstützt NSCoding, können Sie es archivieren und speichern, dann ist es abzurufen.

es zu speichern, starten Sie durch Archivierung es (es zu einem Data Objekt konvertieren) NSKeyedArchiver.archivedData(withRootObject) verwenden. Dies funktioniert, weil Ihre Klasse NSCoding konform ist. Sobald Sie ein Objekt Data erhalten, können Sie das in UserDefaults unter Verwendung set(value, forKey) speichern.

Wenn Sie es abrufen möchten, tun Sie es in die andere Richtung: zuerst holen ein Data Objekt aus UserDefaultsdata(forKey) verwenden, ist es dann in ein Objekt zurückdrehen NSKeyedUnarchiver.unarchiveObject(with) verwenden, und es schließlich zu Ihrer benutzerdefinierten Klasse werfen.

Hier ist ein bisschen Code, der versucht, eine BUYCustomerToken von UserDefaults zu laden. Wenn es gelingt, druckt es die Beschreibung; Wenn dies fehlschlägt, erstellt es ein neues Token und speichert es. Setzen Sie diesen Code in den viewDidLoad() Ihre ersten UIViewController es in Aktion zu sehen:

if let customerTokenData = UserDefaults.standard.data(forKey: "myToken") { 
    let customerToken = NSKeyedUnarchiver.unarchiveObject(with: customerTokenData) as! BUYCustomerToken 
    print(customerToken) 
} else { 
    print("No token stored. Launch again to see token.") 
    let customerToken = BUYCustomerToken(customerID: 999, accessToken: "some token", expiry: Date()) 
    let tokenData = NSKeyedArchiver.archivedData(withRootObject: customerToken) 
    UserDefaults.standard.set(tokenData, forKey: "myToken") 
} 

Das erste Mal, wenn Sie es laufen gibt es keine gespeicherte Token, so dass der Ausgang ist:

Kein Token gespeichert. Starten Sie erneut, um Token zu sehen.

Das zweite Mal, wird die gespeicherte Token und Ausgangs seine Beschreibung finden:

ID: 999, Token: "some Token", Gültig bis: 2017.05.31 21.27.25 +0000

+0

Danke für die ausführliche Antwort, ich habe die vorherige Antwort verwendet, aber ich werde auf jeden Fall eine Chance geben und sehen, wie es funktioniert. –

+0

@ManuelAlonzo Es ist Overkill, wenn Sie nur ein paar Saiten sparen müssen. Dies ist nützlich, wenn Sie komplexere Objekte haben oder wenn Sie mehrere Objekte speichern oder sie an mehreren Orten speichern. – Robert

+0

Ja, ich denke Shopify erfordert nur, dass ich den Token speichere, der diese 3 Gegenstände enthält. Aber ich bin noch nicht in die Warenkorb-Struktur gekommen, die auch Tokens enthält, wenn du gespeicherte Wagen zurückrufen willst, also könnte das immer noch nützlich sein! –

Verwandte Themen