40

アプリの新規ユーザー用にサーバー上にユーザーアカウントを作成したいのですが、ユーザーに何も入力しないようにしたいのです。理想的には、Game Centerのように、これを自動化したいと思います。

しかし、それが可能かどうか疑問に思っています。ユーザーを一意に識別するために使用できるものはありますか?ユーザーのAppleIDを見つけることができる可能性はほとんどありません。また、デバイスIDはユーザーではなくデバイスを一意に識別するため、ユーザーがより多くのデバイスを持っている場合は役に立ちません...

他に使えるものはありますか?

プライバシーについて-私はユーザーの背後にあるものを知りたくありません。ユーザーに情報へのアクセスを要求することにまったく問題はありません(この情報を許可するAPIがある場合は、APIがそれ自体を要求するのは素晴らしいことです)。Steve Jobs自身が言ったように、これがプライバシーのすべてです。アプリは、個人データを処理する前に、ユーザーに許可を求めるように強制します。

4

10 に答える 10

31

正しい解決策は、iCloud Key-Valueストアを使用することです。このストアでは、認証や電子メールアドレスなどのユーザー情報を必要とせずに、一意のユーザーIDを保存できます。

最終結果はランダムなUUID(実際にユーザーを識別するものではありません)です。これはユーザーごとに異なりますが、同じiCloudアカウントに登録されている複数のデバイス間で存続します。

iCloudKVストアでフィールドを定義します。これをuserIDと呼びましょう。アプリを起動すると、まずuserIDを確認します。そこにある場合は、すべてユーザーの一意のIDで設定されています。そうでない場合は、このユーザーに対して実行するのはこれが初めてです。ランダムなUUIDを生成し、userIDでKVストアに保存します。これですべてです。

私たちの経験によると、このUUIDはiTunesアカウントごとに一意です。エンドユーザーが家族共有を使用している場合、それらのアカウントには異なるUUIDが割り当てられます(これは望ましい場合と望ましくない場合がありますが、それについてできることは何もありません)。同じiTunesアカウントで起動する任意の数のデバイスに同じUUIDが表示されます。

このアプローチは完全に合法であり、問​​題なくAppleによって承認される必要があります。

明らかに、Xcodeの[機能]でiCloudKey-Valueストアを有効にする必要があります。iCloudスイッチをオンにするだけです。

これは、Objective-Cでこの概念を実装する単純なクラスです。

@implementation EEUserID

+ (NSUUID *) getUUID
{
    NSUUID *uuid = nil;
    NSString *uuidString = [[NSUbiquitousKeyValueStore defaultStore] stringForKey: @"EEUserID"];
    if (uuidString == nil)
    {
        // This is our first launch for this iTunes account, so we generate random UUID and store it in iCloud:
        uuid = [NSUUID UUID];
        [[NSUbiquitousKeyValueStore defaultStore] setString: uuid.UUIDString forKey: @"EEUserID"];
        [[NSUbiquitousKeyValueStore defaultStore] synchronize];
    }
    else
    {
        uuid = [[NSUUID alloc] initWithUUIDString: uuidString];
    }
    
    return uuid;
}

+ (NSString *) getUUIDString
{
    NSUUID *uuid = [self getUUID];
    if (uuid != nil)
        return uuid.UUIDString;
    else
        return nil;
}

+ (void) load
{
    // get changes that might have happened while this
    // instance of your app wasn't running
    [[NSUbiquitousKeyValueStore defaultStore] synchronize];
}

@end

そしてヘッダーファイルの場合:

#import <Foundation/Foundation.h>

@interface EEUserID : NSObject

+ (NSUUID *) getUUID;
+ (NSString *) getUUIDString;

@end

使用するには、次を呼び出すだけです。

NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];

楽しみ。

于 2015-12-27T19:39:05.363 に答える
21

これを使用してUUIDを生成します。

NSString *UUID() {
    CFUUIDRef cfuuid = CFUUIDCreate(NULL); 
    NSString *uuid =  (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); 
    CFRelease(cfuuid);
    return uuid;
}

ここにあるものは、Appleによって非推奨になったり、嫌われたりすることはありません。実際、それは彼らがあなたにそうすることを提案する方法です。生成されたUUIDをキーチェーンに保存すると、ユーザーがアプリをアンインストールして再インストールした場合でも、そこに保存されます。UUIDは、デバイスとそれが生成された時刻に対して一意です。

次に、さまざまなスキームを使用して、ユーザーにデバイスをグループ化させることができます。iCloud、またはサーバーから提供するある種のキーです。

幸運を!

添加:

uuidをユーザー名として使用し、ランダムなパスワードを生成して、キーチェーンに保存する方法は次のとおりです。

uuid = UUID();
[keychainItemWrapper setObject:uuid forKey:(__bridge_transfer id)kSecAttrAccount];
NSString *pass_token = randomString(10);
[keychainItemWrapper setObject:pass_token forKey:(__bridge_transfer id)kSecValueData];

これはすべて、ユーザーからの入力なしで実行できることに注意してください。

アップデート:

MCSMKeychainItemには、を使用したUUIDの生成と保存に対する優れたソリューションがあります[MCSMApplicationUUIDKeychainItem applicationUUID]。ライブラリにはもあります[MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password]。一緒に、これらの機能は上記のすべてを処理します。CocoaPodsでも簡単にインストールできます。

于 2012-07-22T02:08:19.383 に答える
3

ラドゥ

すばらしい質問です。あなたが説明する問題は、Urban Airship(urbanairship.com)をアプリに統合することで解決しました。アーバンエアシップは、アプリ内購入、レシート検証、サブスクリプションリカバリ、コンテンツ配信、およびAppleプッシュ通知をサポートする機能のグラブバッグを提供します。

アーバンエアシップの優れた点の1つは、デバイスではなく「ユーザー」を電子メールアドレスで識別できることです。それは実際には宣伝されている「機能」ではありません...意図された機能の副産物です。

これが私たちが見つけたものであり、UrbanAirshipを活用してあなたが抱えている問題を解決する方法です。

ユーザーがUrbanAirshipが統合されたアプリをインストールすると、UAはどういうわけかUDIDのような番号を生成します。この番号は、現時点では単にデバイスを識別します。

ただし、Urban Airshipのサブスクリプションリカバリコンポーネントを利用する場合は、ユーザーに電子メールアドレスを入力させることができます。ユーザーが最初のデバイスで自分のメールアドレスを入力すると...その生成されたIDがユーザー識別の主な方法になり、そのメールアドレスに関連付けられます。後続のデバイスでメールアドレスを入力すると、UrbanAirshipはメール検証プロセスをトリガーします。ユーザーが検証プロセスを完了すると、新しいデバイスのIDが最初のデバイスのIDと同じになるように更新されます。それの最良の部分は...それはすべて自動魔法です!コンポーネントを統合し、ユーザーにメールアドレスを入力させるだけです。1時間以内にすべてを稼働させることができるはずです。

また、ユーザーがすべてのデバイスに関連付けられている電子メールアドレスを変更できるようにする機能も提供します。

私たちは実際に実装しました、そしてそれは非常にうまくいきます!

注:2013年7月1日の時点で、UrbanAirshipはサブスクリプションとリカバリ機能を廃止しています

于 2012-07-25T20:26:23.147 に答える
1

Erikが提案したようなUUIDを生成することは、間違いなく固溶体です。唯一の(小さな)注意点は、iDeviceが完全に復元された場合、キーチェーンもワイプされることです。このシナリオでは、アプリケーションは新しいUUIDを生成し、iDeviceを既存のユーザーに関連付けることはできなくなります。

iDeviceを一意に識別する別のアプローチは、ネットワークインターフェイスのMACアドレスに基づいて一意のIDを生成し、それをアプリバンドルIDと組み合わせることです。このメソッドは、アプリケーション固有で耐久性のある一意のIDを生成します。iDeviceをワイプ、復元した場合、またはアプリを削除して再インストールした場合でも、変更はありません。このため、このIDをキーチェーンに保存する必要はありません。

幸いなことに、これを実現するために小さなライブラリを作成した人はすでにいます。コードはGitHubにあります:

https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5

于 2012-07-27T12:02:26.283 に答える
1

Swift3 / 4 +

iCloudレコードID(CKRecordID)を使用します。このIDはiTunesアカウントに固有のものになります。

let container = CKContainer.default()
container.fetchUserRecordID() {
    recordID, error in

    if let err = error {
        print(err.localizedDescription)
    }
    else if recID = recordID {
        print("fetched ID \(recID.recordName ?? "NA")")
    }
}

自動的に作成されたレコードの場合、ID名の文字列はUUIDに基づいているため、一意であることが保証されます。

デバイスにiCloudアカウントがない場合、またはアクセスが制限されているiCloudアカウントがある場合は、CKError.Code.notAuthenticatedエラーが返されることに注意してください。

于 2019-04-09T13:51:36.887 に答える
0

SECUREUDIDのようなサードパーティのソリューションを使用することもできますこれもチェックしてください

于 2012-08-01T10:32:09.790 に答える
0

Erikの提案に代わるものは、OpenUDIDと呼ばれるサードパーティのライブラリです。デバイスごとに一意の識別子を生成できますが、これは非常に簡単です。

#include "OpenUDID.h"
NSString* openUDID = [OpenUDID value];
于 2012-07-30T20:30:40.503 に答える
0

ゲームセンターとiCloudを一緒に使ってユーザーを特定するのはどうですか?

ユーザーがゲームをプレイせず、データを同期しない可能性は低くなります。

于 2012-08-01T03:36:01.870 に答える
0

これは絶対的な解決策ではありませんが(iCloudが有効になっている場合にのみ機能します)、実装は非常に簡単です。一意のIDを一度生成して(UUIDなど)、iCloudのkey-value-storageに保存します。

唯一の問題は、上級ユーザーがiCloudからコンテンツを削除する方法を知っていることです。

ユーザーがiCloudに保存されている一意のIDを他の誰かのIDに編集するのを防ぐために、ある種の秘密を追加することができます。

于 2012-08-01T10:37:06.177 に答える
0

今日、Game CenterのユーザーIDが原因で、APPは拒否されました。これは、App Storeガイドラインにあります:https ://developer.apple.com/appstore/resources/approval/guidelines.html 。

uniqe Game Center IDをG:形式で使用することはできません。

私たちにとって今の唯一の方法は、iOS6Facebook統合を使用することです。

更新:自動FBログオンを備えた新しいバージョンはレビュープロセスに合格し、App Store(Slovni Duel)で入手できます。FBプロファイルにリンクされたinAppサブスクリプションも使用します。

于 2013-02-25T21:37:20.880 に答える