我正在为iOS聊天应用程序使用推送通知。
我已经成功实现并接收了推送通知,还实现了后台获取。
当我为TestFlight或通过他的商店上传新版本时,我可以正确地运行didReceiveRemoteNotification函数,直到completeHandler仅用于多个推送通知为止。 (大约10左右)在后台模式下。
此后,该功能将不会在后台模式下运行。它要么不同步,要么停止工作。我知道苹果将应用程序限制在后台模式,但是不确定这种情况,因为在我看来,此函数调用只需不到一秒钟的时间:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let state = UIApplication.shared.applicationState
if state == .background {
if saveNotificationData(userInfo: userInfo) {
completionHandler(UIBackgroundFetchResult.newData)
} else {
completionHandler(UIBackgroundFetchResult.noData)
}
} else {
completionHandler(UIBackgroundFetchResult.noData)
}
}
private func saveNotificationData(userInfo: [AnyHashable: Any]) -> Bool {
let context = self.privateContext
var result = false
if let chatRoomId = (userInfo["chatRoomId"] as? String) {
do {
let fetchRequest: NSFetchRequest<Room> = Room.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "chatRoomId == %@", chatRoomId)
let fetchedResults = try context.fetch(fetchRequest)
if fetchedResults.count > 0 {
let message = Message(context: context)
message.messageRoomId = userInfo["chatRoomId"] as? String
message.messageCreatorUserId = userInfo["user_id"] as? String
message.messageText = userInfo["message_text"] as? String
message.messageChatRoom = fetchedResults.first!
do {
try context.save()
result = true
} catch {
print(error)
}
}
} catch {
// error fetching list
print("Could not fetch \(error)")
}
}
return result
}
我尝试了许多不同的方法来做到这一点,包括使用主上下文而不是定义的背景上下文。将保存功能放在context.perform块中,在返回completionHandler之前分派到主队列。
但是结果总是一样的。该功能按前几个通知的预期运行,然后在后台模式下停止工作。要么不同步,要么就被锁定。似乎当接收到下一次推送时,先前的函数将继续执行,从而使事情混乱。
我也在实现didReceive和willPresent,但是我已经完全删除了它们,以查看它是否有所作为,但没有。真的卡在这里,不知道是什么原因造成的。
我想知道是否在执行新推送时是否可以取消上一个推送中正在进行的操作是否不同步?但这可能不是问题。