2017-05-30 48 views
1

我正在構建Shopify應用程序,但首先並非Shopify SDK問題,它是關於將客戶令牌保存到userDefaults或Keychain中的。我試過,但最鑰匙扣庫我只試過用字符串的工作,我需要令牌保存爲一個整體,看起來像這樣:如何將對象保存到UserDefaults或鑰匙串中 - Swift 3

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

應用的共享客戶端訪問令牌的樣子這個:

BUYClient.sharedClient.customerToken 

註冊過程中,用戶通過令牌成功創建。有一次,我退出並返回到應用程序的

BUYClient.sharedClient.customerToken = "" 

所以我的問題是,我怎麼這個對象保存到默認設置或鑰匙扣進入應用程序時,後來回憶。我不能保存部分令牌,就像accessToken,它只是一個字符串,我需要整個事情。提前致謝!

回答

0

您可以在UserDefaults中保存多個String類型,您必須將令牌存儲在多個鍵中。

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

的類NSUserDefaults的提供用於訪問 常見類型如浮標方便的方法,雙打,整數,布爾值,和URL。 A 默認對象必須是一個屬性列表 - 也就是,一個實例(或對於集合的一個實例,組合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。

,如果你想存儲的到期日

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

在客戶

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

而對於令牌相同。

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

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

用這種方法,你只需要一一得到它們,但你已經全部存儲了它們。我希望它能幫助你!

+0

謝謝你很好的答案!在我看到這個之前就想出了它,並且非常使用你的方法!感謝您的明確答案! –

0

你肯定是可以存儲整個對象在你的UserDefaults或一個鑰匙串,沒問題。訣竅是使其符合NSCoding協議,然後使用NSKeyedArchiverNSKeyedUnarchiver將其轉換爲可存儲的對象Data。別擔心,這聽起來比現在更復雜。

順應NSCoding

想必你BUYCustomerToken類已經是NSObject後代,所以你已經完成一半了。你只需要添加幾個方法來允許你的自定義類被編碼(變成Data)並從NSCoder自動解碼。具體來說,這些是:encode(with coder: NSCoder)init(coder aDecoder:NSCoder)。然後使用編碼器的各種encode()和decode()函數來使這些工作成爲可能。encode()和decode()可以在任何支持NSCoding的對象上工作,其中包括NSNumberStringDate,這樣可以使您的工作變得非常簡單。完成的可編碼類將如下所示:

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!)" 
    } 
} 

當然,您可以添加自己的自定義方法。 description不是絕對必要的,但方便測試。

存儲和UserDefaults

檢索現在,您的類支持NSCoding,你可以歸檔並保存,然後進行檢索。

要存儲它,你需要使用NSKeyedArchiver.archivedData(withRootObject)來啓動存檔它(將其轉換爲Data對象)。這是有效的,因爲你的課程符合NSCoding。獲得Data對象後,可以使用set(value, forKey)將其存儲在UserDefaults中。

當你想找回它,你做它的其他方式:先取從UserDefaults使用data(forKey)一個Data對象,然後將其放回使用NSKeyedUnarchiver.unarchiveObject(with)的對象,並最終將其轉換爲您的自定義類。

這裏有一段代碼試圖從UserDefaults加載BUYCustomerToken。如果成功,則打印描述;如果失敗,它會創建一個新的令牌並存儲它。把這個代碼在初始UIViewControllerviewDidLoad()看到它在行動:

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") 
} 

你運行它第一次沒有保持令牌,所以輸出:

存儲無令牌。再次啓動以查看令牌。

第二時間時,會發現所存儲的令牌,並且輸出它的描述:

ID:999,令牌: 「一些令牌」,過期日期:2017年5月31日二十一點27分25秒+0000

+0

感謝您的詳細解答,我使用了以前的答案,但肯定會給這個鏡頭,看看它是如何工作的。 –

+0

@ManuelAlonzo如果你需要做的只是保存一些字符串,那就太過分了。如果您有更復雜的對象,或者如果您保存多個對象或將它們保存到多個位置,這很有用。 – Robert

+0

是的,我想Shopify只會要求我保存包含這3項內容的令牌。但是我還沒有進入購物車的結構,如果你想回憶保存的購物車,它也有代幣,所以這仍然可能是有用的! –

相關問題