2017-05-30 8 views
1

私はShopifyアプリケーションを構築していますが、まずShopify SDKの質問ではなく、カスタマートークンをuserDefaultsまたはKeychainに保存することに関するものです。トークンにアクセスするためのアプリの共有クライアントがどのように見えるUserDefaultsまたはkeychainにオブジェクトを保存する方法 - Swift 3

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

:私が試したが、私は文字列だけで動作し、私はこのようになり、全体としてトークンを保存する必要が試したほとんどのキーホルダーライブラリましたこれは:

BUYClient.sharedClient.customerToken 

トークンを使用すると、ユーザーは正常に作成されます。私は終了し、

BUYClient.sharedClient.customerToken = "" 

は、だから私の質問があるアプリに戻ったら、どのように私はアプリを入力するときに、後でリコールするデフォルトやキーホルダーにこのオブジェクトを保存します。私はトークンの一部を保存するだけでは、accessTokenのように文字列ではありません。すべてが必要です。前もって感謝します!

答えて

0

複数の文字列をUserDefaultsに保存することができます。複数のキーにトークンを格納する必要があります。

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

NSUserDefaultsクラスは、浮動小数点数、倍精度、整数、ブール値、およびURLなど 一般的な種類にアクセスするための便利な方法を提供します。 デフォルトのオブジェクトは、プロパティリスト(つまり、 コレクションの場合、インスタンスの組み合わせ)のインスタンス(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") 

このようにすれば、1つずつ取得するだけで済みますが、すべて保存しておく必要があります。それがあなたを助けることを願っています

+0

ありがとうございました。私はこれを見て、かなりあなたの方法を使用する前に、それを直視しました!明確な答えをありがとう! –

0

あなたは間違いなくすることができますあなたのUserDefaultsまたはキーチェーンにオブジェクト全体を保存しても問題はありません。トリックはNSCodingプロトコルに準拠させてから、NSKeyedArchiverNSKeyedUnarchiverを使用して、格納できるDataオブジェクトとの間で変換します。心配しないでください、それはそれよりも複雑に聞こえます。 NSCoding

に準拠

は、おそらくあなたのBUYCustomerTokenクラスはすでにNSObjectの子孫であるので、あなたは途中でそこにいます。カスタムクラスをエンコードして(Dataに変換)、NSCoderから自動的にデコードできるようにするには、いくつかのメソッドを追加するだけです。具体的には、encode(with coder: NSCoder)init(coder aDecoder:NSCoder)です。次に、コーダーのさまざまなencode()関数とdecode()関数を使用して、これらの処理を行います。encode()とdecode()はNSCodingをサポートするオブジェクト(NSNumberString、およびDateを含む)で動作するため、ここでの作業が簡単になります。完成したコーディング可能クラスは次のようになります。

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は厳密には必要ではありませんが、テストには便利です。

保存と今、あなたのクラスはNSCodingをサポートしていることを、あなたはそれを取得し、それをアーカイブし、それを保存することができUserDefaults

から取得します。

は、それを格納するために、あなたはそれがNSKeyedArchiver.archivedData(withRootObject)を使用して(Dataオブジェクトに変換)アーカイブことから始めます。これはあなたのクラスがNSCodingに準拠しているためです。 Dataオブジェクトを取得したら、set(value, forKey)を使用してUserDefaultsに保存できます。

あなたはそれを取得したい場合は、あなたがそれを他の方法で行います。まずNSKeyedUnarchiver.unarchiveObject(with)を使用してオブジェクトに戻すそれを回す、data(forKey)を使用してUserDefaultsからDataオブジェクトを取得し、最終的にあなたのカスタムクラスにキャストします。

BUYCustomerTokenをロードしようとするコードは、UserDefaultsです。成功した場合は、説明を出力します。失敗した場合は、新しいトークンを作成して格納します。アクションでそれを見るためにあなたの最初の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日午前21時27分25秒を+0000

+0

詳細な回答をいただきありがとうございます。以前の回答を使用しましたが、間違いなくこのショットを与えて、その動作を確認します。 –

+0

@ManuelAlonzoあなたがする必要があるのは、いくつかの文字列を保存することです。より複雑なオブジェクトがある場合や、複数のオブジェクトを保存する場合や複数の場所に保存する場合に便利です。 – Robert

+0

ええ、私はShopifyは、私はこれらの3つの項目を含むトークンを保存する必要があると思う。しかし、私はまだカートの構造に慣れていないが、それはまた、保存されたカートを思い出したい場合にはトークンを持っているので、これはまだ役に立つかもしれない! –

関連する問題