PubNub iOS应用程序不接收推送通知

时间:2016-04-27 21:34:13

标签: ios swift pubnub

我正在使用iOS 8+,Xcode 7.3上最新的PubNub试用版试图构建聊天应用程序。我正在评估PubNub作为另一个聊天服务器的替代方案。

我已按照PubNub文档中有关Apple推送通知的说明操作,但我的应用程序在后台时从未接收过推送通知。

我已经创建了p12证书并将其导入我的PubNub密钥集。我在Xcode常规设置中启用了推送通知。我编写了PubNub文档中指定的Swift代码。我能够成功发布和订阅,但我的应用程序(应用程序:UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken:NSData)方法向我显示了一个'nil'令牌。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, PNObjectEventListener {
    var window: UIWindow?
    // Instance property
    var client: PubNub?

    // For demo purposes the initialization is done in the init function so that
    // the PubNub client is instantiated before it is used.
    override init() {

        // Instantiate configuration instance.
        let configuration = PNConfiguration(publishKey: "mypubkey", subscribeKey: "mysubkey")
        // Instantiate PubNub client.
        client = PubNub.clientWithConfiguration(configuration)
        super.init()
        client?.addListener(self)
    }

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
self.client?.subscribeToChannels(["my_channel"], withPresence: true)

let types: UIUserNotificationType = [.Badge, .Sound, .Alert]
let mySettings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes:types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(mySettings)
UIApplication.sharedApplication().registerForRemoteNotifications()

return true
}

在我的推送通知注册方法中:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "DeviceToken")
    NSUserDefaults.standardUserDefaults().synchronize()
    print("Device Token=\(NSString(data: deviceToken, encoding:NSUTF8StringEncoding))")
    self.client?.addPushNotificationsOnChannels(["my_channel"],
       withDevicePushToken: deviceToken,
       andCompletion: { (status) -> Void in
    ...
    })
}

print方法显示deviceToken为nil。

知道我做错了什么吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的注册码和设备令牌都没有任何问题。设备令牌是二进制文件,无法使用 NSUTF8StringEncoding 编码转换为字符串。您可以使用断点来验证存在什么值,但调用成功委托本身就可以证明您的应用程序从Apple收到了正确的设备推送令牌。

要接收推送通知,您需要使用正确的发布方法,这些方法允许您指定 APNS 有效负载。以下是方法之一:https://www.pubnub.com/docs/swift/api-reference#publish_arg_6 payload 应设置为有效的 APNS 有效负载字典(按Apple规范)。