gpt4 book ai didi

ios - AppDelegate 永远不会为 CKQuerySubscription 调用它的 didReceiveRemoteNotification

转载 作者:行者123 更新时间:2023-11-28 14:16:01 26 4
gpt4 key购买 nike

我正在尝试让 iOS 应用程序监听 CKQuerySubscription 更改。数据由远程 iOS 应用程序传输。我已经有一个 macOS 应用程序,它确实接收远程 iOS 应用程序发送的数据。我遇到问题的 iOS 应用程序已经有订阅。然而,它的 AppDelegate 从未在 didReceiveRemoteNotification 方法中收到调用。

import UIKit
import UserNotifications
import CloudKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
/* notifications */
let center = UNUserNotificationCenter.current()
center.delegate = self
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
switch settings.authorizationStatus {
case .authorized:
print("You already have permission")
DispatchQueue.main.async() {
application.registerForRemoteNotifications()
}
case .denied:
print("setting has been disabled")
case .notDetermined:
print("Let me ask")
UNUserNotificationCenter.current().requestAuthorization(options: []) { (granted, error) in
if error == nil {
if granted {
print("you are granted permission")
DispatchQueue.main.async() {
application.registerForRemoteNotifications()
}
}
}
}
}
}
return true
}
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register notifications_ error:", error)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("Receiving data...") // never called...
}
}

我有一些功能,如下所示。我不知道该应用是否需要推送通知。目前,它已打开。

那么为什么我的 iOS 应用程序没有收到远程通知调用?我在实际设备上使用该应用程序,而不是模拟器。谢谢。

enter image description here

编辑:创建对记录更改的订阅

class HomeViewController: UIViewController {
override func viewDidLoad() {
registerSubscription()
}

func registerSubscription() {
let cloudContainer = CKContainer(identifier: "iCloud.com.xxx.XXXXX")
let privateDB = cloudContainer.privateCloudDatabase
let predicate = NSPredicate(format: "TRUEPREDICATE")
let subscription = CKQuerySubscription(recordType: "PrivateRecords", predicate: predicate, options: .firesOnRecordCreation)
let notification = CKNotificationInfo()
subscription.notificationInfo = notification
privateDB.save(subscription, completionHandler: ({returnRecord, error in
if let err = error {
print("Subscription has failed: \(err.localizedDescription)")
} else {
print("Subscription set up successfully")
print("Subscription ID: \(subscription.subscriptionID)")
}
}))
}
}

最佳答案

还有一些您可以检查的内容。

首先,确保您在应用委托(delegate)中实现了didReceiveRemoteNotification:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {  
let dict = userInfo as! [String: NSObject]
let notification = CKNotification(fromRemoteNotificationDictionary: dict)

if let sub = notification.subscriptionID{
print("iOS Notification Received: \(sub)")
}
}

您还可以检查其他一些事项:

  1. 尝试在 CloudKit 仪表板中删除您的 CKQuerySubscription,然后再次运行您的 iOS 代码以注册它。订阅是否显示在仪表板中?
  2. CloudKit 日志是否显示已发送通知?它列出了推送到设备的所有通知。
  3. 如果您使用静默推送通知,请尝试在后台模式功能中启用后台获取(就在远程通知上方)。

如果你做了所有这些但仍然不起作用,你能分享你的 CKQuerySubscription 代码吗?

-- 更新--

尝试在您的 CKNotificationInfo 对象上设置一些额外的属性。通知有一些不明显的错误,通常可以通过设置如下几个属性来规避:

notification.shouldSendContentAvailable = true
notification.alertBody = "" //(Yes, a blank value. It affects the priority of the notification delivery)

您还可以尝试将谓词设置为:NSPredicate(value: true)

此外,您的 privateDB.save 方法返回什么?它说它成功还是失败?

关于ios - AppDelegate 永远不会为 CKQuerySubscription 调用它的 didReceiveRemoteNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52179137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com