唯一标识iOS用户

rid*_*rid 37 authentication ios

我想在服务器上为应用的新用户创建一个用户帐户,但我也不想让用户输入任何内容.理想情况下,我希望这是自动的,就像Game Center一样.

但我想知道是否有可能.有什么我可以用来唯一识别用户吗?我不太可能找到用户的Apple ID.此外,设备ID唯一地标识设备,而不是用户,因此如果用户有更多设备,它将是无用的......

还有什么我可以使用的吗?

关于隐私 - 我不想找到用户背后的任何内容.我要求用户访问他们的信息绝对没有问题(如果有一个API授予我这些信息,那么如果API问这个问题就会很棒).正如史蒂夫乔布斯自己所说,这就是隐私的全部 - 强迫应用程序在对私人数据做任何事情之前要求用户许可.

ldo*_*ogy 26

正确的解决方案是使用iCloud Key-Value Store,您可以在其中存储唯一的用户ID,而无需任何类型的身份验证或用户信息(如电子邮件地址).

最终结果是一个随机的UUID(实际上并不识别用户),对于每个用户来说都是不同的,但对于注册到同一个iTunes帐户的多个设备,它们具有相同的值.

我们在iCloud KV商店中定义一个字段,我们称之为userID.启动应用程序时,我们首先检查用户ID.如果它在那里,那么我们都设置了我们用户的唯一ID.如果没有,那么这是我们第一次为这个用户运行.我们生成一个随机UUID并将其存储在userID下的KV Store中.这里的所有都是它的.

我们的经验表明,这个UUID对于每个iTunes帐户都是唯一的.如果您的最终用户正在使用家庭共享,那么这些帐户将被分配不同的UUID(这可能是也可能不是,但您无能为力).在同一iTunes帐户下启动的任意数量的设备都将看到相同的UUID.

这种方法是完全合法的,应该由Apple批准,没有任何问题.

显然你必须在功能下的Xcode上启用iCloud Key-Value存储,只需打开iCloud Switch即可.

这是一个在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
Run Code Online (Sandbox Code Playgroud)

对于头文件:

#import <Foundation/Foundation.h>

@interface EEUserID : NSObject

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

@end
Run Code Online (Sandbox Code Playgroud)

要使用,您所要做的就是调用:

NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];
Run Code Online (Sandbox Code Playgroud)

请享用.


Eri*_*rik 22

使用以下方法生成UUID:

NSString *UUID() {
    CFUUIDRef cfuuid = CFUUIDCreate(NULL); 
    NSString *uuid =  (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfuuid); 
    CFRelease(cfuuid);
    return uuid;
}
Run Code Online (Sandbox Code Playgroud)

这里没有任何东西被苹果公司弃用或不赞成 - 实际上,这是他们建议你这样做的方式.将生成的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];
Run Code Online (Sandbox Code Playgroud)

请注意,所有这些都可以在没有用户输入的情况下完成.

更新:

MCSMKeychainItem有一个很好的UUID生成和存储解决方案[MCSMApplicationUUIDKeychainItem applicationUUID].图书馆也有[MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password].这些功能共同照顾上面提到的一切.使用CocoaPods也很容易安装.

  • 您是否错过了我用"您可以使用各种方案让用户将他们的设备组合在一起的部分 - iCloud,或者您从服务器提供的某种密钥?"的部分. (15认同)
  • 两种可能的方式1)在iCloud中收集UUID.让iCloud告诉您哪些设备(uuids)与用户相关联(正是iCloud的用途).2)在一台设备上向用户发送一个短密钥,让用户在其他设备上输入该密钥.1)无需用户参与即可工作.2)需要一些用户参与. (3认同)
  • 那些确实可行.也许混合会更好,因为我认为服务器不关心使用哪个设备.将第一个UUID备份到iCloud并使用它来登录(如果它不存在则创建它,如果它存在则使用它).我只是担心同步问题(如果在用户尝试访问服务器之前iCloud尚未同步,该怎么办?).但是,我已经看到了光明,并意识到你的答案不值得我的上述评论. (2认同)