【Swift / iOSアプリ開発】UUID / KeyChain でid管理します

iOS

課金状況の確認にユーザーを管理するものがないので UUIDとKeychainでidを管理してみます。

storekit2で購入する際に app account token というのがあるのですがそこにも利用します。
すると 通知にも app account tokenが入り、ユーザーごとの管理もできます。

基本的に keychainを利用したら端末を跨いで管理できるので◎

注意点

  • iCloud同期とプライバシー:
    KeychainはiCloudと同期されるため、ユーザーが複数のデバイスで同じApple IDを使用している場合、そのデバイス間でデータが同期されます。もしiCloud同期を利用する場合、ユーザーのプライバシーを保護するため、どのデータが同期されるかを明示することが重要です。
  • App Storeのガイドラインに準拠:
    Keychainに保存する情報が広告目的やトラッキング目的に使用される場合、AppleのApp Storeのガイドラインに従う必要があります。個人データやプライバシーに関する取り決めは、必ずポリシーとして明示し、ユーザーの同意を得ることが求められます。

uuidを生成してstringで保存

 let newUUID = UUID()
newUUID.uuidString

保存した文字列 uuidStringをUUIDに

UUID(uuidString: uuidString)

keychainに保存、読み出し

import Security

let query: [CFString: Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrAccount: uuidKey,
            kSecValueData: uuid.data(using: .utf8)!,
            kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked
        ]
        
        // KeychainにUUIDを保存
        let status = SecItemAdd(query as CFDictionary, nil)

status == errSecDuplicateItemですでにある場合は更新する。(基本更新はしない。

kSecClassGenericPasswordなのでパスワードと同列、macのkeychainなどで確認すると

load

let query: [CFString: Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrAccount: uuidKey,
            kSecReturnData: true,
            kSecMatchLimit: kSecMatchLimitOne
        ]
        
        var result: AnyObject?
        let status = SecItemCopyMatching(query as CFDictionary, &result)
if status == errSecSuccess, let data = result as? Data, let uuid = String(data: data, encoding: .utf8) {
dataはuuid stringで読めればOK

uuidのtransaction適用などはこちら↓

【StoreKit2 / Swift / iOSアプリ開発】StoreKit 2 で月額サブスクリプションを実装するぅ!!!サーバー通知も実装!
ちょっとサブスクリプションを確認したら、サーバーを通すチェックが必要とかfirebase使えるけどユーザーが増えると高額になるとか...vpsで自前で用意するのも止まると困るので。。。と考えていたら!?StoreKit2 は、アプ...

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました