唯一标识iOS用户

时间:2012-07-22 01:18:01

标签: ios authentication

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

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

还有什么我可以用的吗?

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

9 个答案:

答案 0 :(得分:23)

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

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

我们在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

对于头文件:

#import <Foundation/Foundation.h>

@interface EEUserID : NSObject

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

@end

要使用,您只需调用:

NSString *uniqueIDForiTunesAccount = [EEUserID getUUIDString];

享受。

答案 1 :(得分:22)

使用以下方法生成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使用[MCSMApplicationUUIDKeychainItem applicationUUID]为UUID生成和存储提供了很好的解决方案。该库还有[MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password]。这些功能共同照顾上面提到的一切。使用CocoaPods也很容易安装。

答案 2 :(得分:4)

拉​​杜

很好的问题。我们通过将Urban Airship(urbanairship.com)整合到我们的应用程序中解决了您描述的问题。 Urban Airship提供一系列功能,支持应用内购买,收据验证,订阅恢复,内容交付和Apple推送通知。

Urban Airship的一大优点是能够识别“用户”,而不是设备,而是通过电子邮件地址识别“用户”。它并不是一个广告宣传的“功能”......更多的是其预期功能的副产品。

以下是我们发现的以及我们如何利用Urban Airship来解决您所遇到的问题。

当用户安装集成了Urban Airship的应用程序时,UA会以某种方式生成类似UDID的号码,此时此号码只是识别设备。

但是,如果您利用Urban Airship的订阅恢复组件,您可以让用户输入电子邮件地址。一旦用户在第一个设备上输入他们的电子邮件地址......生成的ID就成为他们用户识别的主要方法,并与该电子邮件地址相关联。当他们在后续设备上输入他们的电子邮件地址时,Urban Airship将触发电子邮件验证过程。用户完成验证过程后,它会将新设备上的ID更新为与第一个设备的ID相同,依此类推。它最好的部分是......它都是自动魔术!您只需集成组件并让用户输入他们的电子邮件地址。你应该能够在一小时内完成所有工作。

它还提供允许用户更改与其所有设备关联的电子邮件地址的功能。

我们实际上已经实施,并且非常好用!

注意:截至2013年7月1日,Urban Airship正在弃用订阅&amp;恢复功能

答案 3 :(得分:0)

Erik建议的替代方案是名为OpenUDID的第三方库。您可以基于每个设备生成唯一标识符,这很简单:

#include "OpenUDID.h"
NSString* openUDID = [OpenUDID value];

答案 4 :(得分:0)

如何一起使用游戏中心和iCloud识别用户?

用户不太可能不玩游戏而且不会同步他们的数据。

答案 5 :(得分:0)

您可以使用SECUREUDID等第三方解决方案,也可以查看this

答案 6 :(得分:0)

这不是一个绝对可靠的解决方案(仅在启用iCloud时才有效),但它很容易实现: 生成一次唯一ID(如UUID)并将其存储在iCloud键值存储中。

唯一的问题是高级用户知道如何从iCloud中删除内容。

为了防止用户只是将iCloud中存储的唯一ID编辑为其他ID,您可以添加某种秘密。

答案 7 :(得分:0)

今天我们的APP被拒绝,因为Game Center用户识别。它位于App Store指南中:https://developer.apple.com/appstore/resources/approval/guidelines.html

您不能以G:格式使用uniqe Game Center ID。

现在我们唯一的方法是使用iOS6 Facebook集成。

更新:我们的新版本具有自动FB登录通过审核流程,可在App Store(Slovni Duel)上获得。还使用链接到FB配置文件的inApp订阅。

答案 8 :(得分:0)

Swift3 / 4 +

使用iCloud记录ID(CKRecordID)。此ID对于iTu​​nes帐户将是唯一的。

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,因此保证是唯一的。

相关问题