唯一标识一个iOS用户

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

但是我想知道是否可能。 有什么我可以用来唯一标识用户? 我很难find用户的Apple ID。 此外,设备ID唯一标识设备,而不是用户,所以如果用户拥有更多的设备,这将是无用的。

还有什么我可以使用?

关于隐私 – 我不想在用户背后find任何东西。 我绝对没有要求用户访问他们的信息的问题(如果有一个API授予我这个信息,这将是非常好的,如果API本身)。 正如史蒂夫·乔布斯(Steve Jobs)自己所说的那样,这就是隐私的全部内容 – 迫使应用程序在对其私人数据做任何事情之前先征求用户的许可。

用这个生成一个UUID:

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

这里没有任何东西被苹果公司所弃用或皱起眉头 – 事实上,这是他们build议你这样做的方式。 将生成的UUID存储在钥匙串中,即使用户卸载并重新安装应用程序,它也会在那里。 UUID对于设备和生成的时间是唯一的。

然后,您可以使用各种scheme让用户将他们的设备组合在一起–iCloud或从服务器提供的某种types的密钥。

祝你好运!

加成:

以下是我如何将它存储在钥匙串中,使用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]; 

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

更新:

MCSMKeychainItem有一个很好的解决scheme,用[MCSMApplicationUUIDKeychainItem applicationUUID]生成和存储UUID。 该库也有[MCSMGenericKeychainItem genericKeychainItemWithService:service username:username password:password] 。 这些function一起照顾上面提到的一切。 易于与CocoaPods安装。

我对这个问题的年龄有多大感到惊讶,以及没有一个答案明确地提供答案(尽pipe有一些提示)。

简单的解决scheme是使用iCloud Key-Value Store ,您可以在其中存储唯一的用户ID,而不需要任何forms的身份validation或用户信息,例如电子邮件地址。

最终的结果是一个随机的UUID(没有任何实际的IDENTIFIES用户),这是不同的每个用户,但将有多个设备注册到同一个iTunes帐户相同的值。

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

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

这种做法是完全合法的,应该由苹果公司批准,没有问题。

很明显,您必须在function下的Xcode上启用iCloud Key-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]; 

请享用。

拉杜

很好的问题。 我们通过将Urban Airship(urbanairship.com)集成到我们的应用程序中来解决您所描述的问题。 Urban Airship提供了一系列function来支持应用程序内购买,收据validation,订阅恢复,内容传送和Apple推送通知。

关于城市飞艇的一个伟大的事情是它能够通过电子邮件地址识别“用户”而不是设备,而是“用户”。 这不是一个真正的广告“function”…更多的是其预期function的副产品。

以下是我们发现的以及如何利用城市飞艇解决您的问题。

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

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

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

我们实际上已经实施了,它运作得非常好!

注:截至2013年7月1日,Urban Airship不赞成订阅和恢复function

像Erik生成一个UUIDbuild议绝对是一个可靠的解决scheme。 唯一(小)的警告可能是,如果一个完整的iDevice恢复,钥匙链也将被擦除。 在这种情况下,应用程序将生成新的UUID,并且iDevice不能再与现有的用户相关联。

唯一识别iDevice的另一种方法是根据networking接口的MAC地址生成唯一的ID,并将其与应用程序包ID进行组合。 这个方法产生一个独特的id,它是特定于应用程序的并且是持久的 当iDevice被擦除,恢复或应用程序被删除并重新安装时,它不会改变。 因此,不需要将此ID存储在钥匙串中。

幸运的是,已经有一些人创造了一个小库来实现这一目标。 代码可以在GitHub上find:

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

Erikbuild议的替代scheme是名为OpenUDID的第三方库。 您可以在每台设备上生成一个唯一的标识符,这很简单:

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

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

用户不太可能玩游戏,也不会同步数据。

您可以使用像SECUREUDID这样的第三方解决scheme也检查这一点

这不是绝对的解决scheme(只有在启用iCloud的情况下才有效),但实现起来非常简单:生成一次唯一的ID(如UUID)并将其存储在iCloud的key-value-storage中。

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

为了防止用户只编辑存储在iCloud中的唯一ID给其他人的ID,你可以添加一些秘密。

今天我们的APP被拒绝了,因为Game Center的用户标识。 这是在App Store指南: https : //developer.apple.com/appstore/resources/approval/guidelines.html 。

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

现在唯一的办法是使用iOS6的Facebook集成。

更新:我们的新版本与自动FBlogin通过审查过程,并可在App Store(Slovni决斗)。 也使用inApp订阅链接到FBconfiguration文件。