博客> 个推推送问题总结
个推推送问题总结
2017-11-21 10:16 评论:0 阅读:133 梧桐一叶
个推 GTSDK 通知栏不显示 收不到透传消息
    一直用个推推送,也算是所有的疑难杂症都遇到过了,特此总结,避免后人踩坑。
    由于个推SDK是用OC语言写的,对于使用OC语言开发的人使用应该很简单,不会有乱七八糟的问题出现,这里不再赘述。下面主要讲使用Swift语言开发遇到的问题:
   首先,在个推网站getui.com下载SDK包,其中包含资源文件、API文档、Demo工程和readme.txt。

第一步,根据API文档中的集成指南进行集成 (指南很详细,照着一步一步做就可以了)

  1. 创建个推应用 2.打开项目工程 3.添加个推iOS SDK及相关配置 注意1:如果你的项目是用cocoapods管理的,导入个推SDK的方法就不是将 GtSdkLib 录拷 到项 程 录下,导 GtSdkLib 件夹,而是要按照网站提供的cocoapods集成http://docs.getui.com/mobile/ios/cocoapods/#8-cocoapods进行,如果你非要copy,那就按照copy吧 注意2:开启推送功能,如图 开启推送功能: ,可能会出现另一种情况,如图 开启推送失败 ,出现这种情况你就要登录开发者账号检查证书了,要确保如图所示的Push Notifications状态是Enabled 推送功能正常: ,只有enabled才说明你的证书是支持推送的,如果不会enabled请重新编辑,重新下载安装。如果重新安装后还发现steps的第一条是标红的,一般的情况是Xcode抽风了,如果你的证书管理选择的是自动管理话,切换到手动管理试试,反之亦然,互相切换,总能好的(最终我选择的是自动管理,是OK的) 注意3:后台运行权限中后台运行模式中的最后两个一定要勾选,不然应用在后天运行时收不到推送的

第二步,编写集成代码 主要叙述代码中那些坑 坑一:Swift2和Swift3方法有变化引起的坑 Swift2代码如下: /* 远程通知注册成功委托 / func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")); token = token.stringByReplacingOccurrencesOfString(" ", withString: "")

    // [ GTSdk ]:向个推服务器注册deviceToken
    GeTuiSdk.registerDeviceToken(token);
}

Swift3代码如下: func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let deviceToken_ns = NSData.init(data: deviceToken); // 转换成NSData类型 var token = deviceToken_ns.description.trimmingCharacters(in: CharacterSet(charactersIn: "<>")); token = token.replacingOccurrences(of: " ", with: "")

    // [ GTSdk ]:向个推服务器注册deviceToken
    GeTuiSdk.registerDeviceToken(token)

}

以上都是改过之后正确的代码,由于我是两个项目分别是用Swift2和Swift3写的,当用Swift3开发项目的时候我想把代码直接拷贝,稍加修改就可以了,没有想到我竟让获取不到deviceToken,原因是我没有把Swift3下面的Data转化成NSData,所以就有了这句代码let deviceToken_ns = NSData.init(data: deviceToken); // 转换成NSData类型。这个可能对于大牛不会遇到,但是着实考验了我一把,耗费几个小时。

坑二:iOS10问题 如图集成指南上所述是必不可少的 iOS10问题: ,附上Swift3代码,如下: //iOS10新增:处理前台收到通知的代理方法 @available(iOS 10.0, ) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo print("userInfo10:(userInfo)") completionHandler([.sound,.alert]) } //iOS10新增:处理后台点击通知的代理方法 @available(iOS 10.0, ) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo print("userInfo10:(userInfo)") let str = "payload" as NSObject let payload = userInfo[str] as? String print("payload=(String(describing: payload))") completionHandler() } 如果你的应用支持iOS10以下,不要忘记写下面接收远程推送的方法 private func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // [ GTSdk ]:将收到的APNs信息传给个推统计 GeTuiSdk.handleRemoteNotification(userInfo);

    //        NSLog("\n>>>[Receive RemoteNotification]:%@\n\n",userInfo);//接受推送处理
    let str = "payload" as NSObject
    let payload =  userInfo[str] as? String
    if payload != nil {
        let data = payload!.data(using: String.Encoding.utf8)! as NSData
        let dictionary = try? JSONSerialization.jsonObject(with: data as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
        let actionID = dictionary?.object(forKey: "actionID") //对应跳转界面
        if actionID != nil {

// let strActionID = actionID as! String // let eventID = dictionary?.object(forKey: "id") // if eventID != nil { //// mainTab?.dealWithPushMessageWithActionID(strActionID, eventID: eventID as! String) // } }

    }
    completionHandler(UIBackgroundFetchResult.newData)

}

坑三:容易漏掉一步 当个推启动成功,代理方法透传消息也能收到了,但是通知栏不显示通知消息。这个真真是困惑,于是鼓起勇气咨询了个推的技术大牛们,大牛先让我提供一下收不到推送的cid,提供后大牛说这个cid和devicetoken是没有绑定的,然后在个推应用配置界面测试一下我的deviceToken,看看返回什么。考虑到有人可能不知道在哪里测试,上图: 测试deviceToken是否可用: 。我的测试可用。这时大牛告诉我应用卸载重装一下,先别推送。按照大牛所说下载重装,cid在线一下,果然就好了。这里所说的容易漏掉一步是cid在线一下,登录成功,绑定调用一下GeTuiSdk.bindAlias(memberID, andSequenceNum: cid)就OK了

收藏
1
sina weixin mail 回到顶部