ios – 存储在SSKeychain中的CFUUID在某些设备中为空

ios – 存储在SSKeychain中的CFUUID在某些设备中为空,第1张

概述我发布的应用程序使用CFUUID和SSKeychain来识别设备(即使卸载并重新安装了应用程序,也保持该ID不变) 我将这些设备ID保存在服务器中,我最近注意到一些用户为同一个真实设备拥有多个这些ID.我看到的唯一解释是ID没有从Keychain保存或加载,因此设备生成一个新ID.奇怪的是,它在运行相同iOS版本的其他一些设备上运行良好. 关于可能发生什么的任何想法? 这是我在(BOOL)应用程序 我发布的应用程序使用CFUUID和SSKeychain来识别设备(即使卸载并重新安装了应用程序,也保持该ID不变)

我将这些设备ID保存在服务器中,我最近注意到一些用户为同一个真实设备拥有多个这些ID.我看到的唯一解释是ID没有从Keychain保存或加载,因此设备生成一个新ID.奇怪的是,它在运行相同iOS版本的其他一些设备上运行良好.

关于可能发生什么的任何想法?

这是我在(BOol)应用程序中的相关代码:(UIApplication *)application dIDFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Nsstring* IDentifIEr = @"appname";Nsstring* servicename = @"com.company.appname";Nsstring *retrIEveuuID = [SSKeychain passwordForService:servicename account:IDentifIEr];if (retrIEveuuID == nil) {    CFUUIDRef theUUID = CFUUIDCreate(NulL);    CFStringRef string = CFUUIDCreateString(NulL,theUUID);    CFRelease(theUUID);    Nsstring *uuID  = (Nsstring*) string;    [SSKeychain setPassword:uuID forService:servicename account:IDentifIEr];}

编辑:我的猜测是,由于某种原因,retrIEveuuID == nil没有按预期工作.稍后在应用程序中,我注册了推送通知,并将推送令牌与我用同一行[SSKeychain passwordForService:servicename account:IDentifIEr]读取的CFUUID一起发送到服务器,但是当它被发送到服务器时它不是零(所以我可以看到几个具有相同推送令牌的CFUUID).

编辑2以附加更多实际代码.

AppDelegate.m

Nsstring* IDentifIEr = @"appname";Nsstring* servicename = @"com.company.appname";- (BOol)application:(UIApplication *)application dIDFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //Creating UUID    Nsstring *retrIEveuuID = [AppDelegate getdeviceid];    if (retrIEveuuID == nil) {        CFUUIDRef theUUID = CFUUIDCreate(NulL);        CFStringRef string = CFUUIDCreateString(NulL,theUUID);        CFRelease(theUUID);        Nsstring *uuID  = (Nsstring*) string;        [SSKeychain setPassword:uuID forService:servicename account:IDentifIEr];    }    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];}+ (Nsstring*) getdeviceid {    return [SSKeychain passwordForService:servicename account:IDentifIEr];}- (voID)application:(UIApplication*)application dIDRegisterForRemoteNotificationsWithDevicetoken:(NSData*)devicetoken{    Nsstring *newToken = [devicetoken description];    newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];    newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""];    _devicetoken = [[Nsstring alloc] initWithString:newToken];    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];    Nsstring *user = [prefs objectForKey:@"appnameUsername"];    if(user && ![user isEqualToString:@""]){        RestClIEnt *rest = [[RestClIEnt alloc] init];        rest.delegate = self;        rest.tag = 2;        [rest updatetoken:newToken ForUsername:user];        [rest release];    }}

RestClIEnt.m

-(voID) updatetoken:(Nsstring *)token ForUsername:(Nsstring *)username{    NSArray* info = [NSArray arrayWithObject: [NSMutableDictionary dictionaryWithObjectsAndKeys:                                               username,@"Username",token,@"TokenNo",[[UIDevice currentDevice].model hasPrefix:@"iPad"] ? @"iPad" : @"iPhone",@"Device",[UIDevice currentDevice].systemVersion,@"Osversion",[AppDelegate getdeviceid],@"deviceid",@"updatetoken",@"CMD",nil]];    [self doAction:info];}

doAction方法只是将数据发送到服务器然后回调委托,该部分工作正常.我可以在服务器上看到接收此命令的日志:

"JsONCMD":"[{   "TokenNo" : "f0d3aa21758350333b7e6315c38_EDIT_257c1838f49c43049f8380ec1ff63","AppVersion" : "1.0.4","Username" : "user@server.com","CMD" : "updatetoken","Osversion" : "7.0.4","deviceid" : "9B794E11-6EF7-470C-B319-5A9FCcdaFD2B","Device" : "iPhone"}]

我看到2个可能导致奇怪行为的候选者,控制器主体中的Nsstrings和静态getDevice方法.但是,我不知道这在许多设备中如何工作,但在其他设备中却失败了.

解决方法 我遇到了同样的问题,我找到了解决方案.用户将密码设置为解锁手机的设备会出现问题.在iOS7上,某些代码可以在后台运行(推送通知,后台获取),如果您使用标准辅助功能类型在钥匙串中保存了某些内容,则在设备被锁定(并且应用程序在后台运行)时无法读取它.尝试设置:

[SSKeychain setAccessibilityType:kSecAttrAccessibleAlways];

在你读/写钥匙串之前.希望能帮助到你.

总结

以上是内存溢出为你收集整理的ios – 存储在SSKeychain中的CFUUID在某些设备中为空全部内容,希望文章能够帮你解决ios – 存储在SSKeychain中的CFUUID在某些设备中为空所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1018658.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存