大佬教程收集整理的这篇文章主要介绍了ios – 存储在SSKeychain中的CFUUID在某些设备中为空,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我将这些设备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没有按预期工作.稍后在应用程序中,我@L_944_5@了推送通知,并将推送令牌与我用同一行[SSKeychain passwordForservice:servicename account:identifier]读取的CFUUID一起发送到服务器,但是当它被发送到服务器时它不是零(@R_352_9447@看到几个具有相同推送令牌的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方法.但是,我不知道这在许多设备中如何工作,但在其他设备中却失败了.
以上是大佬教程为你收集整理的ios – 存储在SSKeychain中的CFUUID在某些设备中为空全部内容,希望文章能够帮你解决ios – 存储在SSKeychain中的CFUUID在某些设备中为空所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。