iosios 推送 devicetokenn 多长

主题 : iOS11.0 以上获取不到devicetoken
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 91(时)
发自: Web Page
来源于&&分类
iOS11.0 以上获取不到devicetoken&&&
app archive 后 安装在iOS 11.0 及以上,didRegisterForRemoteNotificationsWithDeviceToken 方法不调用,获取不到devicetoken,如果直接连数据线run一下,还是会掉用的0.0好无奈的bug,其他不是11.0 及以上的手机,archive 和run 都是正常的
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 91(时)
发自: Web Page
求大腿来给点思路,自己顶下
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 91(时)
发自: Web Page
看来没人遇到过了0.0
级别: 圣骑士
可可豆: 1241 CB
威望: 1321 点
在线时间: 2819(时)
发自: Web Page
级别: 骑士
UID: 335952
可可豆: 354 CB
威望: 419 点
在线时间: 1041(时)
发自: Web Page
检查下相关环境?release和debug版本对应的配置是不一样的
级别: 精灵王
UID: 551166
可可豆: 2596 CB
威望: 1930 点
在线时间: 636(时)
发自: Web Page
看楼上有人说可以获取,那估计是楼主自己的问题了。
向天下所有的女司机道歉,我错了。
级别: 新手上路
可可豆: 82 CB
威望: 82 点
在线时间: 312(时)
发自: Web Page
你看下推送通知的开关有没有打开,我之前升级xcode后,之前开着的,现在被关闭了,也导致获取不到token
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版Device token for an iPhone device生成之后就永远不变吗?不是,if a device is wiped (应该是重装系统), it will get a new device token. 官方网站是这样写的: If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes正是因为device有可能改变,所以建议在app start时(即在didFinishLaunchingWithOptions
里)调用registerForRemoteNotificationTypes来获取device token以检查device token是否改变,如果改变了就应该把新token传给push provider。(官方描述:An application should register every time it launches and give its provider the current token)device token应该存储在NSUserDefaults来达到新旧比较的目的那么旧device token在push provider对应的record怎么办?方案1:把旧device token send to provider and request delete record方案2:使用apns feedback service。方案2可能更好些,因为总是需要使用apns feedback service来处理用户在device里删除app的情况。调用registerForRemoteNotificationTypes方法后,成功注册后,APNS就会返回一个device token,然后回调delegate methoddidRegisterForRemoteNotificationsWithDeviceToken, 如果注册失败,则回调delegate method didFailToRegisterForRemoteNotificationsWithError。注意:* 在第一次调用registerForRemoteNotificationTypes方法时没有联网,则既不会调用didRegisterForRemoteNotificationsWithDeviceToken,也不会调用didFailToRegisterForRemoteNotificationsWithError*在第一次调用registerForRemoteNotificationTypes注册成功后,之后即使没有联网,再调用registerForRemoteNotificationTypes时都会以最上一次的device token作为参数回调didRegisterForRemoteNotificationsWithDeviceToken方法。* (官方描述) If your application has previously registered, calling registerForRemoteNotificationTypes: results in the operating system passing the device token to the delegate immediately without incurring additional overhead.上述东东参考官方网站关于Registering for Remote Notifications的讲解
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至: 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。iOS-DeviceToken变化之谜 - 简书
iOS-DeviceToken变化之谜
本人iOS菜鸟一枚,最近遇到了关于deviceToken的一些问题,将解决问题的思路记录下来,也算是一种知识的沉淀吧,或许能帮助到同样遇到问题的你,那就再好不过了.
闲话不说,直接进入主题.
一.介绍一下问题的背景
最近在搞远程推送的时候,忽然发现,有时候,当某一台机器需要推送一条信息的时候,这台机器可能会收到同样的信息若干条.就去找问题所在.然而更换了证书,或者配置文件之后,故障依然存在.我就认为这不是我的问题,是后台服务器的问题(后台的兄弟们,无辜躺枪),就去了解了一下后台推送的相关流程.之前只是了解一下苹果远程推送的原理,不是很了解我们后台服务器端需要做些什么事情.
简述一下我目前的理解.当app启动时,我们在appDelegate里面注册远程通知,然后苹果服务器返回一个deviceToken给我们,在appDelegate的其中一个代理方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken
在该方法里,我们获取到的NSData类型的devToken就是苹果服务器根据我们这一台设备的UDID和app的bundleID混编而成的deviceToken,我们需要将这个deviceToken传送给我们的服务器端,或者登陆用户的时候作为参数传给服务器.这样一个用户对象就绑定了一个deviceToken.当需要给这个用户推送消息的时候,我们自己的后台服务器,就会找这个用户对应的deviceToken和要发送的推送内容,直接发送到苹果的apns服务器,然后由苹果的apns服务器将消息推送到该deviceToekn对应的手机上.
后来我就让后台的兄弟查到该用户竟然对应了多个deviceToken,不过当这一账号同时在多个设备上登陆的时候,可能会绑定多个deviceToken的,但问题是测试机一共就两个,不会存在绑定八九个deviceToken的.我就在想这个deviceToken会不会发生变化.
二.问题所在
在网上搜索到一些知识,也查询了一下官方文档里面对deviceToken的解释,deviceToken会发生变化,但是仅仅在用户在新的设备上登陆或者更新设备操作系统的时候会发生变化.更重要的是,我的上司领导也很肯定的告诉我,同一台设备,同一款软件,而且还是在没有修改软件的bundleID的情况下,deviceToken是不会发生变化的.
后来测试时候就无意中发现,每当我将运行在真机上的demo卸载再重新运行的时候,deviceToken竟然会是发生变化的,而且还是无规律的发生变化.这让我发现了故障的所在.竟然卸载重装会让deviceToken发生变化.后来我分别用iOS7.0系统和iOS8.0的真机测试,发现在这两款系统上,卸载重装,苹果返回的deviceToken不会发生变化.而只有iOS9.0以后的系统版本会发生变化.而且如果每次启动都请求注册的话,只要你没有卸载重装,那么返回的deviceToken是不会发生变化的.只有当你卸载重装的时候才会发生变化.
三.解决方案
先说我尝试过的一种解决方案吧,我将第一次安装软件时候所获得的deviceToken,存储在钥匙串(keychain)内.以后不论什么时候卸载重装软件,只有软件一启动,那么就从keychain内读取保存的deviceToken.然后利用这个deviceToken去进行推送服务.但是我自己在用网络上的那个可以模拟推送的mac小demo(名字叫做PushMeBaby)时,发现如果卸载重装软件后,keychain内保存的旧的deviceToken竟然是无效的,而新获得的deviceToken才是有效的.这让我感到很无奈,保存在keychain的方法没有奏效.
后来考虑到在传递给自己后台服务器时候,怎么才可能保证用一个用户下,一个设备下仅仅保存一个deviceToken,每当这个设备的deviceToken发生变化的时候,就替换该设备对应的deviceToken.
最终的解决方案就是,获取设备的UUID(被苹果禁用的是UDID) + keychain + DeviceToken来解决这个问题.
当软件第一次安装时候,获取设备的UUID 存储到keychain中,那么只要你不刷机,那么这个保存在keychain中的UUID一直存在,即使你升级操作系统也会存在(我正好升级试了一下),这样我们就能保证设备编码的唯一性,在向我们自己的后台服务器传参数时,将这个UUID和获得的deviceToken一起传递过去,让后台做个校验,查询该用户属性下的UUID设备对应的deviceToken是否发生变化,如果发生变化,就替换.这样保证了该用户在这一台设备上绑定了一个deviceToken,这样推送的时候就不会造成可能会推送多条信息的bug.
四.下面附上封装的UUID和keychain的代码,稍微修改一下即可使用.(注意:必须需要导入Security.framework框架)
UuidObject.h
#import@interface UuidObject : NSObject
+ (NSString *)getUUID;
UuidObject.m
#import "UuidObject.h"
#import "KeyChainStore.h"
@implementation UuidObject
+(NSString *)getUUID
NSString * strUUID = (NSString *)[KeyChainStore load:@"your_app_bundleID"];
//首次执行该方法时,uuid为空
if ([strUUID isEqualToString:@""] || !strUUID)
//生成一个uuid的方法
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
//将该uuid保存到keychain
[KeyChainStore save:KEY_USERNAME_PASSWORD data:strUUID];
return strUUID;
//KeyChainStore.h
#import@interface KeyChainStore : NSObject
+ (void)save:(NSString *)service data:(id)
+ (id)load:(NSString *)
+ (void)deleteKeyData:(NSString *)
//KeyChainStore.m
#import "KeyChainStore.h"
@implementation KeyChainStore
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassGenericPassword,(id)kSecClass,
service, (id)kSecAttrService,
service, (id)kSecAttrAccount,
(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
+ (void)save:(NSString *)service data:(id)data {
//Get search dictionary
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
//Delete old item before add new item
SecItemDelete((CFDictionaryRef)keychainQuery);
//Add new object to search dictionary(Attention:the data format)
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
//Add item to keychain with the search dictionary
SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
+ (id)load:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
//Configure the search setting
//Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
CFDataRef keyData = NULL;
if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
} @catch (NSException *e) {
NSLog(@"Unarchive of %@ failed: %@", service, e);
} @finally {
if (keyData)
CFRelease(keyData);
+ (void)deleteKeyData:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
SecItemDelete((CFDictionaryRef)keychainQuery);
本人iOS菜鸟一枚,最近遇到了关于deviceToken的一些问题,将解决问题的思路记录下来,也算是一种知识的沉淀吧,或许能帮助到同样遇到问题的你,那就再好不过了. 闲话不说,直接进入主题. 一.介绍一下问题的背景 最近在搞远程推送的时候,忽然发现,有时候,当某一台机器需要...
本人iOS菜鸟一枚,最近遇到了关于deviceToken的一些问题,将解决问题的思路记录下来,也算是一种知识的沉淀吧,或许能帮助到同样遇到问题的你,那就再好不过了. 闲话不说,直接进入主题. 一.介绍一下问题的背景 最近在搞远程推送的时候,忽然发现,有时候,当某一台机器需要...
用到的组件1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好...
Swift版本点击这里欢迎加入QQ群交流:
最新更新日期:17-11-01 About A curated list of iOS objective-C ecosystem. How to Use Simply presscommand+F+&xxx...
Apple公司于日开始,拒绝采集UDID的App上架App Store==== iOS 5.0 之后uniqueIdentifier方法就被废弃掉了;==== iOS 7.0 中苹果又封杀mac地址。==== iOS 7.0 系统把粘贴板的访问权...
新的一年就这样来了,好像很多事情都还没来得及做,都还停留在计划中。果然强迫症患者的效率就是低。值得开心的就是我的开题报告告一段落了,老师们说我的题目可以做,而且他们认为我的选题选的很好,他们给了我一系列的意见,使我的调研范围变的小了好多,恨感谢他们。实习还在继续中,干到明年...
这个世界上,所有事情都有障眼法。看见的,未必是真的。真的你未必能幸运的看见。
——《十分爱》
《郭靖黄蓉》 英雄少年思家国 蓉女佳人最婀娜 桃花岛上双雕落 星云梦里羡黄郭 《七夕》 星云河汉雨细细 牵牛织女影依依 风凄露戚草木萋 今夕何夕到七夕 《海棠》 斋外独徘徊,阶下长青苔。 梦里多聊赖,心中无空白。 紫芝交杯彩,琼蕊报晓开。 海棠依旧在,佳人何不来?
刚踏入树木园的时候,看到的是幽长的小路和丛生的草木。由于已是深秋,路面铺满薄薄的一层落叶。走进这样的林子,不仅仅是走近了自然的年轻,也与自然的衰老近距离接触。 席地而坐。偶尔有落叶打在我肩上,再坠落地面,使我感到这深秋的沉重。同行的人看着我,说“你眉上有东西”,我伸手一...ios推送功能的devicetoken 每次取得的是否都一样?_百度知道
ios推送功能的devicetoken 每次取得的是否都一样?
我有更好的答案
同一台机器是一样的,不然老变化,服务器怎么记录这台设备的代号了。但是如果机器初始化后,这个token是会变化的。就比如你先使用了一台iPhone,然后有微博的消息推送,是推送的你微博账号的内容。你把手机卖别人了,别人初始化手机后,如果还能接收到你微博账号的内容就坏了。所以初始化手机后,token会变化。
采纳率:40%
为您推荐:
其他类似问题
推送功能的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。输入关键字或相关内容进行搜索
应用是原生集成H5,原生的IOS注册devicetoken用原生IOS方法能获取到devicetoken,但是用HBuilder集成个推后获取到token
赞助DCloud可免广告,
要回复问题请先或
赞助DCloud可免广告,
赞助DCloud可免广告,}

我要回帖

更多关于 ios 获取devicetoken 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信