在iOS中唯一标识设备

时间:2014-09-23 11:38:12

标签: ios udid

我正在iPad上开发一个企业应用程序以满足特定的业务需求。 此应用程序适用于管理员预定义的特定数量的设备。

但我还要求应用程序拒绝任何登录请求,即使它是来自授权用户,当他或她正在使用未由管理员定义的设备时。

编辑:

假设我有2台设备,并且我有我的凭据登录到应用程序,我的需要是,限制从不是我的设备登录。 为此,我必须确定登录请求是否来自我的设备。

以前我们可以使用设备UDID来执行此操作,但现在不推荐使用它。

任何人都可以建议一种方法来实现这个吗?

7 个答案:

答案 0 :(得分:1)

试试这个。有关详情,请查看UIDevice

// IOS 6+
    NSString *uniqueIdentifier = [[NSString alloc] initWithString:[[[UIDevice currentDevice] identifierForVendor] UUIDString]];

答案 1 :(得分:1)

你可以在这里使用iCloud ,因为UUID已被弃用,且vendorId是unqe,但如果您卸载应用程序并安装它,则可能会更改,

所以我建议iCloud会更安全,你做的是在应用程序启动时你可以生成一个唯一的令牌,并将其与用户凭据一起保存到你的iCloud数据存储中,

因此,从下次开始,当用户尝试登录时,您可以使用iCloud进行检查。

答案 2 :(得分:0)

如何使用Apple的企业分销系统?这将允许您将应用程序部署到公司,并具有严格的访问控制。

https://developer.apple.com/programs/ios/enterprise/

答案 3 :(得分:0)

Just Trick:

您可以将APNS代码实施到您的项目并获取设备令牌。

设备令牌是唯一的。但用户必须允许APNS。

注意:APNS设备令牌已更改为以下原因。

  1. 更改Bundle id。
  2. 开发模式的变更(沙箱/生产)

答案 4 :(得分:0)

我已经为您的问题实施了一个解决方案,最佳解决方案(以及Apples建议的路线)是为您的应用创建一个独特的UUID,如下所示:

    NSString *uuidString = nil;
    CFUUIDRef uuid = CFUUIDCreate(NULL);
    if (uuid) {
        uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));
        CFRelease(uuid);
    }

然后,这是关键,您可以将其存储到iOS钥匙串(此处为Handy classes:https://github.com/lukef/IXKeychain),并且在用户卸载App时不会删除iOS钥匙串中的值,因此您可以保留您自己的UUID通过App安装,这是根据用户帐户管理特定数量的设备的关键部分。

答案 5 :(得分:0)

此方法将为每个设备返回一个字符串。因为它每次都会改变单个设备 所以我们将它存储在钥匙串中,并且可以在需要时随时引用它。

+ (NSString *) uniqueDeviceIdentifier
  {

    NSString *deviceUUID = [[SGKeyChain defaultKeyChain] stringForKey:@"uniqueId"];

        if (!deviceUUID) {

            if (!deviceUUID.length) {

        NSString *deviceUUID = @"";

        CFUUIDRef uuidRef = CFUUIDCreate(NULL);

        CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);

        CFRelease(uuidRef);

         deviceUUID = [NSString stringWithFormat:@"%@",[NSString stringWithString:(__bridge_transfer NSString *)uuidStringRef]];

    [[SGKeyChain defaultKeyChain] setObject:deviceUUID forKey:@"uniqueId" accessibleAttribute:kSecAttrAccessibleAlways];

        }
    }       
        return deviceUUID;
    }

你可以参考这个存储库...... https://github.com/sgup77/SGKeyChainWrapper用于SGKeyChain实现

答案 6 :(得分:0)

好的,我将分享我们为B2B企业应用程序所遵循的方法。

每位用户都有登录ID和密码。

1。因此,用户使用deviceReg API向服务器注册他的设备,该API将clientDeviceId作为param(客户端生成的uuid)以及用户名并传递。

2. 服务器返回服务器生成的唯一标识符,供该特定设备上的应用程序使用。

结论 - 以这种方式您可以使用特定设备限制用户。

您可以使用以下方法生成deviceSpecific客户端UUID

- (NSString *)getUuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    NSString *uuid = [NSString stringWithString:(__bridge NSString *)uuidStringRef];
    CFRelease(uuidStringRef);
    return uuid;
}

请注意: 我删除了有关使用AuthKey,AccessToken和其他我们用于安全目的的解释,因为您不使用任何auth服务器。

我希望它有所帮助。

更新1。

由于您正在使用企业应用程序,因此我确信您将至少拥有用户电子邮件ID。

因此,客户经理应该首先向所有活动帐户发送包含一次性令牌的电子邮件。

应用程序在注册设备并发送到服务器进行验证时可以请求此令牌。

一旦用于避免误操作,服务器也会使令牌无效。

如果用户迁移设备,应该有一个使用服务器生成的设备ID和迁移令牌的migrAtion api。