我正在使用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。
知道我做错了什么吗? 提前谢谢。
答案 0 :(得分:1)
您的注册码和设备令牌都没有任何问题。设备令牌是二进制文件,无法使用 NSUTF8StringEncoding 编码转换为字符串。您可以使用断点来验证存在什么值,但调用成功委托本身就可以证明您的应用程序从Apple收到了正确的设备推送令牌。
要接收推送通知,您需要使用正确的发布方法,这些方法允许您指定 APNS 有效负载。以下是方法之一:https://www.pubnub.com/docs/swift/api-reference#publish_arg_6 payload 应设置为有效的 APNS 有效负载字典(按Apple规范)。