在iOS中唯一标识设备
我正在iPad上开发针对特定业务需求的企业应用程序。 此应用程序旨在用于由管理员预定义的特定数量的设备。在iOS中唯一标识设备
但是我还需要应用程序拒绝任何登录请求,即使它来自授权用户,当他或她使用未由管理员定义的设备时。
编辑:
说我有2台设备,我有我的凭据登录到应用程序,而我需要的是,限制从设备登录这是不是我的。 为此,我必须确定登录请求是否来自我的设备。
以前我们可以使用设备UDID来做到这一点,但现在它已被弃用。
任何人都可以请建议一种方法来实现这个?
如何使用苹果的企业分销系统?这将允许您将应用程序部署到公司,并拥有严格的访问控制。
Hi Nailer, 谢谢。 实际上,该应用程序目前在应用程序商店中可用(未使用企业许可证构建),因此需要通过包含此功能来更新相同的应用程序。 – 2014-09-23 11:45:56
好的。从你的问题,它似乎是一个可行的解决方案:) – Nailer 2014-09-23 13:23:20
建议的想法是足够好,但我的应用程序已经在应用程序商店,并阅读我们不能将应用程序发布到应用程序商店,如果我们正在使用苹果的企业分布式系统。 – 2014-09-25 06:43:47
试试这个。更多信息检查UIDevice
// IOS 6+
NSString *uniqueIdentifier = [[NSString alloc] initWithString:[[[UIDevice currentDevice] identifierForVendor] UUIDString]];
identifierForVendor仅在运行时生成,这意味着我们只在应用程序安装完成后才能获取该标识符。 但在我的情况下,我需要明确定义通信服务器中的设备列表。这样我可以检查它是否是授权设备。 – 2014-09-23 11:54:39
然后Nailer答案是正确的。您需要使用Apple的企业分销系统。 – Deepak 2014-09-23 11:58:11
只是绝招:
可以实现APNS码到您的项目并获取设备令牌。
设备令牌是唯一的。但用户必须允许APNS。
注意:APNS设备令牌更改为以下原因。
- 更改捆绑ID。
- 转变发展模式(沙盒/生产部)
我已经实现了整整您的问题,最好的解决方案的解决方案(和苹果推荐的路线)是创建一个UUID专属于您的应用程序是这样的:
NSString *uuidString = nil;
CFUUIDRef uuid = CFUUIDCreate(NULL);
if (uuid) {
uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(NULL, uuid));
CFRelease(uuid);
}
然后,这是关键,你可以存储到iOS的钥匙串(手持类在这里:https://github.com/lukef/IXKeychain)和值在iOS的钥匙串,当用户卸载应用程序不会被删除,所以你可以坚持你的通过应用程序安装拥有UUID,这是管理特定数量设备的关键部分 用户帐号。
此方法将为每个设备返回一个字符串。由于每次都会改变单个设备 ,因此我们将它存储在钥匙串中,并且可以在需要时将其引用。
+ (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实施
好吧,我将分享我们遵循一个B2B的企业应用程序的方法。 。
每个用户都有登录ID和密码。
1.因此,用户使用deviceReg API将服务器注册到服务器,该API使用clientDeviceId作为参数(客户端生成的uuid)以及用户名和密码。
2.服务器返回服务器生成的唯一标识符,供应用程序在该特定设备上使用。
结束 -通过这种方式,您可以限制用户使用某个设备。
您可以使用以下方法来生成设备专用客户端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
既然你有一个企业应用程序,所以我相信你会是具有至少应用户的电子邮件标识。
因此,客户经理应该比第一次向所有活动账户发送带有一次性令牌的电子邮件。
注册设备并发送给服务器进行验证时,该令牌可以由应用程序请求。
此外,服务器还会使令牌失效,以避免误用。
应该有一个migrAtion API,如果用户迁移设备,它将使用服务器生成的设备ID和迁移标记。
感谢您分享这个想法。但我认为,有可能由知道用户凭证的人注册不需要的设备。我对吗 ? – 2014-09-23 13:06:11
虽然可以有很多解决方案来处理这种情况。但是您可以使用您的服务器将令牌发送到短信网关服务器,该服务器会向预先注册的手机号码发送消息。短信服务器发送的短信令牌将与客户端生成的DeviceID一起使用,以验证用户。 – bllakjakk 2014-09-23 13:25:58
我们无法将设备链接到手机号码,因为我们没有收集用户的手机号码,并且所有的iPad都可能没有SIM卡支持:( – 2014-09-25 06:41:15
您可以使用iCloud的这里是因为UUID已被弃用,厂商ID是潮头,但如果你卸载应用程序并安装它agian可能会改变,
所以我建议的iCloud将更加安全,你在应用程序启动时,您可以生成一个唯一的令牌,并将其与用户凭据一起保存到您的iCloud数据存储中,
因此,从下次开始用户尝试登录时,您可以检查它与iCloud。
你有没有auth服务器?它提供Api的注册/注销?在这种情况下,我将分享我们在B2B企业APP中使用的方法。 – bllakjakk 2014-09-23 11:55:44
对不起,我没有任何auth服务器。我们只有一个应用程序与之通信的服务器。我们计划使用此服务器验证设备。 – 2014-09-23 12:06:38
我添加了删除auth服务器相关部分的方法。请检查您的使用案例。 – bllakjakk 2014-09-23 12:19:21