静默推送只有在第二次推送到达时才能正常工作(后台应用程序)
Silent push only work properly when second push arrive (app in background)
当应用程序在前台处于活动状态时,静默推送通知可以正常工作
2016-12-26 15:06:17.793051 App[] didReceive in BG!!!
2016-12-26 15:06:17.932569 App[] Connected!
2016-12-26 15:06:17.936581 App[] Subscribed!
2016-12-26 15:06:17.938355 App[] received:Hello World , in:/topic/state
当应用程序在 background.It 中运行时会卡住
2016-12-26 15:06:22.674577 App[] applicationWillResignActive
2016-12-26 15:06:23.228441 App[] applicationDidEnterBackground
第一个静默推送到了,卡在这里:
2016-12-26 15:06:30.642825 App[] didReceive in BG!!! //first push code
2016-12-26 15:06:31.842432 App[] Connected! //first push code
2016-12-26 15:06:31.843643 App[] Subscribed! //first push code
当第二次静默推送到达时,它显示第一次推送结果..并再次卡住.....
2016-12-26 15:06:41.713718 App[] received:Hello World , in:/topic/state //first push result
2016-12-26 15:06:41.740015 App[] didReceive in BG!!! //second push
2016-12-26 15:06:42.911593 App[] Connected! //second push
2016-12-26 15:06:42.913403 App[] Subscribed! //second push
我在Appdelegate中的实现代码
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
NSLog("didReceive in BG!!!" )
application.delegate = self
mqttSession = MQTTSession(host: "192.168.159.110", port: 1883, clientID: "swift", cleanSession: true, keepAlive: 5, useSSL: false)
mqttSession.username = "bucky"
mqttSession.password = "bucky"
mqttSession.delegate = self
mqttSession.connect { (succeeded, error) -> Void in
if succeeded {
NSLog("Connected!")
}
}
completionHandler(.newData)
}
MQTT 委托方法
func mqttDidReceive(message data: Data, in topic: String, from session: MQTTSession) {
let stringData = String(data: data, encoding: .utf8)
NSLog("received:%@ , in:%@", stringData ?? "12345", topic)
}
}
你必须在完成通知后调用completionHandler(),但你是立即调用它。您最好在 mqttDidReceive 和错误委托方法中调用它。
当应用程序在前台处于活动状态时,静默推送通知可以正常工作
2016-12-26 15:06:17.793051 App[] didReceive in BG!!!
2016-12-26 15:06:17.932569 App[] Connected!
2016-12-26 15:06:17.936581 App[] Subscribed!
2016-12-26 15:06:17.938355 App[] received:Hello World , in:/topic/state
当应用程序在 background.It 中运行时会卡住
2016-12-26 15:06:22.674577 App[] applicationWillResignActive
2016-12-26 15:06:23.228441 App[] applicationDidEnterBackground
第一个静默推送到了,卡在这里:
2016-12-26 15:06:30.642825 App[] didReceive in BG!!! //first push code
2016-12-26 15:06:31.842432 App[] Connected! //first push code
2016-12-26 15:06:31.843643 App[] Subscribed! //first push code
当第二次静默推送到达时,它显示第一次推送结果..并再次卡住.....
2016-12-26 15:06:41.713718 App[] received:Hello World , in:/topic/state //first push result
2016-12-26 15:06:41.740015 App[] didReceive in BG!!! //second push
2016-12-26 15:06:42.911593 App[] Connected! //second push
2016-12-26 15:06:42.913403 App[] Subscribed! //second push
我在Appdelegate中的实现代码
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
NSLog("didReceive in BG!!!" )
application.delegate = self
mqttSession = MQTTSession(host: "192.168.159.110", port: 1883, clientID: "swift", cleanSession: true, keepAlive: 5, useSSL: false)
mqttSession.username = "bucky"
mqttSession.password = "bucky"
mqttSession.delegate = self
mqttSession.connect { (succeeded, error) -> Void in
if succeeded {
NSLog("Connected!")
}
}
completionHandler(.newData)
}
MQTT 委托方法
func mqttDidReceive(message data: Data, in topic: String, from session: MQTTSession) {
let stringData = String(data: data, encoding: .utf8)
NSLog("received:%@ , in:%@", stringData ?? "12345", topic)
}
}
你必须在完成通知后调用completionHandler(),但你是立即调用它。您最好在 mqttDidReceive 和错误委托方法中调用它。