一直以来使用的解析方式(iOS13之前)都是如下: Objective-C: NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet [token stringByReplacingOccurrencesOfString:@" " withString:@""]; Swift: let dataStr = NSData(data: deviceToken [deviceToken isKindOfClass:[NSData class]]) return; const unsigned *tokenBytes = [deviceToken bytes ]; const unsigned *tokenBytes = [deviceToken bytes]; NSInteger count = deviceToken.length; for (int i () 但是,有大神做过测试,下面这种方式最快 let token = deviceToken.reduce("", {$0 + String(format: "%02x", $1)}) //比上面解析速度快
关于提前适配iOS13 苹果推送DeviceToken的通知 随着苹果iOS13系统即将发布,个推提前推出DeviceToken适配方案,以确保新版本的兼容与APP推送服务的正常使用。 iOS13的一个重要变化是"[deviceToken description]" 会受不同运行环境及系统的影响而发生变化,如果未及时做好适配工作,会导致SDK绑定到错误的DeviceToken,从而影响 在Xcode11、iOS13运行时"[deviceToken description]",情况如下图所示: ? 针对开发者注册DeviceToken的不同场景,个推提出了相应的iOS推送SDK适配方案。 适配方案:因获取DeviceToken字符串的过程就是将NSData转换成HexString,在"[deviceToken description]"发出变化后,就需要开发者修改转换方案,参考代码如下图
关于推送效率,苹果官方给出的建议是当建立一个Socket通道后,尽可能将需要推送消息和接受的devicetoken连续发送至APNS服务器端。 但是,这里需要注意如果消息队列中存在不正确的devicetoken时,苹果会在接受到这个devicetoken时,强制中断当前的Socket通道,这样会造成后面的消息无法正常发送给APNS服务器。 很简单,我的做法是在一个消息队列中,每发送一条消息,就去read当前的Socket通道,苹果会在遇到错误的devicetoken后进行标记,我们可以read到这个数据,从而将错误的devicetoken 从队列中剔除,并尝试重新建立一个Socket通道,然后从错误的devicetoken后面继续推送。 那么,我们通过定期从feedback中获得这些devicetoken后,在数据库中进行标记,在下次的推送中,从消息队列中剔除这些devicetoken,这样减少了无用功,推送一次会完成的更快。
deviceToken是不透明的NSData实例,其中包含Apple分配给特定设备上特定应用程序的唯一标识符。只有APN才能解码和读取deviceToken的内容。 安装应用后第一次打开APP获取deviceToken时必须联网。如果在获取时没有网络,在重新连接网络后会第一时间返回deviceToken。 不需要缓存DeviceToken。 如果已经生成了有效的DeviceToken,系统或有缓存,在 重新安装App、重装系统、或者从备份还原系统时,会重新生成DeviceToken并更新缓存。 debug环境下是向开发环境的APNs服务器申请DeviceToken,而release环境是向生产环境的APNs服务器申请的。如果环境不匹配,则会出现Bad deviceToken错误。 deviceToken与bundleId存在着关联。如果deviceToken与证书中的bundleId不匹配,会返回DeviceTokenNotForTopic
根据CID去查devicetoken,确认CID和devicetoken绑定是否正确。 3. 查看证书是否上传错误 4. 服务端推送的,请检查离线时间是否设置。 原因如下:换证书环境后,devicetoken是变掉了,但是CID没变导致不会立即重新绑定devicetoken(一般是24小时后会重新绑定),服务端记录的还是原来的devicetoken。 24小时内做测试的话,会因Clientid和devicetoken绑定问题导致消息接收不到,因为证书更换后的devicetoken变掉了但没有更新到服务器,导致服务端查询到的devicetoken是错误的 因证书环境变更,导致Clientid与devicetoken绑定变化,但服务端的数据没有更新,还是与旧的devicetoken绑定的。 10、生产证书下怎么获取devicetoken?
App 获取 deviceToken 后,通过 API 将 App 的相关信息和 deviceToken 发送给应用服务器,服务器将其记录下来。 (图中步骤 4) 当要推送通知时,应用服务器按照 App 的相关信息找到存储的 deviceToken,将通知和 deviceToken 发送给 APNs。 : Data)获取 deviceToken。 如果正常获取到 deviceToken,即表示注册成功,可以进行远程通知的推送,最后需要将其发送给应用服务器。注意: App 重新启动后,deviceToken 不会变化。 : Data)获取 deviceToken。
deviceToken的生成 当一个App注册接收远程通知时,系统会发送请求到APNs服务器,APNs服务器收到此请求会根据请求所带的key值生成一个独一无二的value值也就是所谓的deviceToken Provider收到deviceToken以后进行储存等相关处理,以后Provider给我们的设备推送通知的时候,必须包含此deviceToken。 deviceToken到底是什么?有什么用? 服务器根据此Token key编码生成一个deviceToken。 唯一性并不是说一台设备上的一个应用程序永远只有一个deviceToken,当用户升级系统的时候deviceToken是会变化的。 { [JPUSHService registerDeviceToken:deviceToken];//将 deviceToken 传给极光推送 } 综上,注册及接收推送 必须 使用真机
要解答你这个问题,那就必须提一下DeviceToken这个东西。只要有 DeviceToken,那么APNS 服务器就知道将消息推送到哪台 iOS 设备上。 小树接着问:那也就是说 DeviceToken 是跟设备绑定的咯? 其实你只答对了一半。 其实 DeviceToken 是跟设备和App绑定在一起的。 不同设备的同一应用,它们的 DeviceToken 是不同的。同一设备的不同应用,它们的 DeviceToken 也是不同的。 当你点击「允许」之后,你的手机便会向 APNS 服务器请求生成一个 DeviceToken,此时 APNS 服务器便将这个 DeviceToken 和这个 iOS 联系起来了。 此时,APNS 服务器将这个 DeviceToken 与该 iOS 设备绑定起来。
3.APNs根据设备的UDID和App的Bundle Id生成deviceToken再发回给App。 4.App再将deviceToken发送给远程推送服务器(自己的服务器), 由服务器保存在数据库中。 6.APNs根据deviceToken发送给对应的用户。 · APNs 服务器就是苹果专门做远程推送的服务器。 ·deviceToken是由APNs生成的一个专门找到你某个手机上的App的一个标识码。 · deviceToken 可能会变,如果你更改了你项目的bundle Identifier或者APNs服务器更新了可能会变。
有变化 原因: NSString *token = [deviceToken description]; token = [token stringByReplacingOccurrencesOfString 字符串了,iOS 13 通过[deviceToken description]获取到的内容已经变了。 application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken [deviceToken isKindOfClass:[NSData class]]) return; const unsigned *tokenBytes = [deviceToken bytes (tokenBytes[5]), ntohl(tokenBytes[6]), ntohl(tokenBytes[7])]; NSLog(@"deviceToken
具体过程,见下图 1、[Client App]注册消息推送; 2、[Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken; 3、 [Client App]将deviceToken发送给[Provider]Push服务端程序; 4、当Push服务端程序满足发送消息条件了,[Provider]向[APNS Service]发送消息; Device Token:设备令牌、用户标识 1.获取devicetoken: 1>客户端向苹果服务APNS,发送设备的UDID和英语的Bundle Identifier. 2>经苹果服务器加密生成一个 deviceToken 3>将当前用户的deviceToken(用户标识),发送给自己应用的服务器 4>自己的服务器,将得到的deviceToken,进行保存 !!! 2.获取到deviceToken后推送消息给设备 5>需要推送的时候,将消息和deviceToken一起发送给APNS,苹果服务器,再通过deviceToken找到用户,并将消息发给用户 参考文章
单点发送可以根据唯一的devicetoken发送消息给用户,因此可以把这个token和数据库中用户名进行绑定,根据用户名查询出token给指定用户发送即可。 用Autoriwed注入 youMain.sendAndroidBroadcast(model); } /** * 通过友盟发送给指定用户,这个根据devicetoken 给指定的app发送消息,这个devicetoken在给用户注册的时候可以记录下来,存到数据库 * 这个token可以跟用户名进行绑定,根据用户名去查找token,这样就可以给指定用户发送消息了 测试,您好":model.get("text")); String devicetoken = (String) model.get("devicetoken");//上面已经判断过空的情况 unicast.setDeviceToken( devicetoken); unicast.setTicker(ticker); unicast.setTitle
application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet Success]:%@\n\n", token); // [ GTSdk ]:向个推服务器注册deviceToken,这个方法写在类别里面! @param deviceToken deviceToken */ -(void)registerDeviceTokenToGeTuiSDK:(NSString *)deviceToken{ // 向个推服务器注册deviceToken [GeTuiSdk registerDeviceToken:deviceToken]; } /* 将收到的APNs信息传给个推统计
privatestatic int port = 2195; publicstatic void main(String[] args) throws Exception { String deviceToken = "";//iphone手机获取的token String deviceToken2 = "";//iphone手机获取的token List deviceTokens = new ArrayList(); deviceTokens.add(deviceToken); deviceTokens.add(deviceToken2); String p12FilePassword ="123456";//此处注意导出的证书密码不能为空因为空密码会报错 pushOne(p12File, p12FilePassword, deviceToken2 PushNotificationManager pushManager =PushNotificationManager.getInstance(); pushManager.addDevice("iphone", deviceToken
App,可以认为是由deviceID、bundleId和安装时的相关信息生成的,App的升级操作deviceToken不变,卸载重装App、恢复和重装操作系统后的deviceToken会发生变化。 苹果的APNs服务是基于deviceToken实现的,因此需要将设备的deviceToken发送到我们的业务服务器中,用于后续的消息推送。 一个设备可能登录过多个用户,一个用户也可能在多个设备中登录过,当我们需要给不同用户推送不同的消息时,除了deviceToken之外,我们还需要保存用户的openid与deviceToken的映射关系。 在新闻类App出现事实热点新闻时,后台服务就可以携带消息内容和deviceToken等内容,向苹果的APNs服务发起消息推送请求,推送消息的实现是异步的,只要请求格式和deviceToken检查通过APNs 5.1、获取设备deviceToken 在App启动时,我们可以通过UIApplication的registerForRemoteNotifications方法向苹果的APNS服务器请求deviceToken
V2TIMAPNSConfig *confg = [[V2TIMAPNSConfig alloc] init]; confg.businessID = sdkBusiId; confg.token = self.deviceToken *msg) { NSLog(@"-----> 设置 APNS 失败");//设置token失败 提示msg:sdk not login }]; 原因: IMSDK使用离线推送的时候需要将DeviceToken ] init]; // 企业证书 ID,上传证书到 IM 控制台后生成 confg.businessID = @"证书id"; // 苹果后台请求的 deviceToken confg.token = _deviceToken; [[V2TIMManager sharedInstance] setAPNS:confg succ:^{
远程推送原理 ---- 准备工作 开发iOS程序的推送功能, iOS端需要做的事 请求苹果获得deviceToken UDID : 目的是将来可以找到手机 Bundle ID : 目的是将来可以找到手机中的程序 得到苹果返回的deviceToken 发送deviceToken给公司的服务器 监听用户对通知的点击 调试iOS的远程推送功能必备条件:真机、付费开发者账号 调试推送需要的证书文件 1> aps_development.cer application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 将来要在这里将Token 发送给自己的服务器做保存 NSLog(@"deviceToken: %@", deviceToken); } #pragma mark 接收到远程推送的消息时调用此方法
2、 APNs服务器接受请求,并将deviceToken返给你设备上的应用程序 3、客户端应用程序将deviceToken发送给后台服务器程序,后台接收并储存。 4、 后台服务器向APNs服务器发送推送消息 5、 APNs服务器将消息发给deviceToken对应设备上的应用程序 4. 消息推送原理 ?
3、关于deviceToken: 首先清楚开发环境和生产环境下的deviceToken是不一样的。同一环境下token也是会变的,比如系统恢复设置或刷机操作。 每次要推送消息时,sever从数据库取出deviceToken,如果用户把我们的app删了,再发送消息肯定是收不到了,所以server要不断的更新数据库的deviceToken去掉那些无效的deviceToken
能解释清楚肯定就有货真价实的开发经验 使用远程推送 1、获取苹果获得deviceToken-获取手机UDID+应用的唯一标识(bundel ID) 2、得到苹果返回的deviceToken 3、发送 deviceToken给公司的服务器 4、监听用户对通知的点击 如何调试远程推送功能 1、真机 2、调试推送需要的证书文件 证书自己配置。。。 UIApplicationLaunchOptionsRemoteNotificationKey]) { // 跳转 // 添加一个红色的View } return YES; } // 获取DeviceToken application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // 将DeviceToken传给服务器 NSLog(@"%@", deviceToken.description); } // 正常接到远程通知的时候会调用这个方法 - (void