Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS 7中始终获取唯一的设备id_Ios_Iphone_Objective C_Uniqueidentifier - Fatal编程技术网

在iOS 7中始终获取唯一的设备id

在iOS 7中始终获取唯一的设备id,ios,iphone,objective-c,uniqueidentifier,Ios,Iphone,Objective C,Uniqueidentifier,我们的iOS应用程序是针对特定用户的。因此,我们使用设备唯一标识符进行用户识别。这种方法在iOS 6之前运行良好,因为我们每次都得到相同的值 NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier]; 在iOS 7中,上述方法返回不同的值,我们在用户识别方面遇到了问题。iOS 7提供以下备选 NSUUID *oNSUUID = [[UIDevice currentDevice] identifierF

我们的iOS应用程序是针对特定用户的。因此,我们使用设备唯一标识符进行用户识别。这种方法在iOS 6之前运行良好,因为我们每次都得到相同的值

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];
在iOS 7中,上述方法返回不同的值,我们在用户识别方面遇到了问题。iOS 7提供以下备选

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

我们将
uniqueIdentifier
替换为
identifierForVendor
,并创建了一个特别构建。然后,我们在iOS 7和iOS 6设备上安装了构建。到目前为止,在iOS 7中,我们每次都会得到相同的值,但iOS 6每次删除并重新安装应用程序时都会给出不同的值。

如果设备上没有安装您签名的其他应用程序,则供应商可以更改标识符。此外,如果您通过不同的分发方法安装应用程序,则供应商的标识符可能会更改,即当通过XCode安装应用程序时,以及当通过TestFlight或HockeyApp分发应用程序时,供应商的标识符可能不相同。

来自供应商的for
标识符:

当用户从设备中删除该供应商的所有应用程序并随后重新安装其中一个或多个应用程序时,该值将发生变化。在使用Xcode安装测试生成或在使用即席分发的设备上安装应用程序时,也可以使用该值。因此,如果您的应用程序将此属性的值存储在任何位置,您应该优雅地处理标识符更改的情况


iOS7设备上是否安装了来自同一供应商的其他应用程序?根据报告:

当应用程序(或其他应用程序)运行时,此属性中的值保持不变 iOS设备上安装了来自同一供应商的应用程序。价值 当用户从中删除该供应商的所有应用程序时发生更改 然后重新安装其中一个或多个。价值可以 在使用Xcode安装测试版本或安装应用程序时也是如此 在使用临时分发的设备上。因此,如果你的应用商店 此属性的值在任何位置,您都应该优雅地处理 标识符更改的情况

您是否通过AppStore提供应用程序?如果没有:

如果应用程序不是从应用程序商店安装的(例如,当应用程序 (仍在开发中),供应商根据应用程序的 捆绑包ID。假定捆绑包ID为反向DNS格式,并且 前两个组件用于为生成供应商ID 例如,com.example.app1和com.example.app2似乎有 相同的供应商ID


尝试清除计算机上应用程序的缓存,然后进行检查。这可能是您的缓存问题

使用此小助手方法在应用程序的安装/删除会话之间的密钥链中保留标识符

-(NSString *)getUniqueDeviceIdentifierAsString
{
    NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

    NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
    if (strApplicationUUID == nil)
    {
        strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
    }

    return strApplicationUUID;
}

将库添加到您的项目中,例如,通过Cocoapods和
pod'SSKeychain'
UDID替换为什么?

目前看来,苹果计划用两种不同的标识符取代UDID:供应商ID和广告ID

供应商ID

来自同一开发人员的应用程序之间相同的ID。 删除该团队ID的最后一个应用程序后将被擦除

广告ID

唯一的设备。 适用于所有应用程序;用于广告-iAd已从iOS 6及更高版本的UDID转换而来。 用“擦除所有内容和设置”重置


在大多数情况下,供应商ID将允许具有多个应用程序的开发人员在其所有应用程序中将您标识为同一用户。这可以帮助开发人员更好地了解他们的受众,并提供更好的服务

广告ID仍将为设备创建唯一标识符,但与UDID不同,它可以关闭或重置,就像可以在桌面或笔记本电脑的浏览器中控制cookie一样

随着本周早些时候iOS7的发布,苹果又迈出了一步,那就是关闭另一个唯一标识符——应用程序开发者和广告公司可以使用的“MAC地址”,而不是新的广告ID。通过关闭这个漏洞,苹果正在采取一个好的步骤,迫使这些公司只使用用户可以控制的跨应用程序标识符

还有待观察的是,目标公司是否会继续寻求绕过苹果授权的途径。其他技术,如“设备指纹识别”,已经被开发出来在苹果的框架之外唯一地识别你的设备。苹果是否会取缔这些方法还有待观察。

要添加一些东西,有一个名为
MCSMKeychainItem
的很好的钥匙链包装器,它除了其他几个功能外,还允许您使用一行代码生成和检索唯一的设备ID:

因此,基本用法如下

它基于Keychain工作,在这里存储一次生成的唯一标识符(正如nerowolf所建议的)。它是开源的,你可以下载


注意:我不是扩展的作者,我也不认识他/她。

你是在iOS<6.1.3上测试的吗?我的应用程序支持从iOS 5.0到iOS 7.0,现在我在iOS 7.0上测试。谢谢,但我想获得始终唯一的id。还有其他方法可以像设备标识符方法一样始终保持唯一的id吗。如果它是可行的,那么请建议我。好的,谢谢,但我想得到总是唯一的id。否则有任何替代方法,做唯一的id总是一样,就像设备标识符的方法。如果可能的话,请建议我。或者它可以通过identifierforvander方法实现。不,不可能获得始终相同的标识符。文档中都有。如果您从该供应商删除所有应用并重新安装一个,则此值将更改。当重置内容和se时
[MCSMApplicationUUIDKeychainItem applicationUUID];
+ (NSString *)deviceId {
  // load unique device ID or generate new one
  return [MCSMApplicationUUIDKeychainItem applicationUUID];
}