菜鸟教程小白 发表于 2022-12-12 11:46:57

ios - Cloudkit 不发送推送通知


                                            <p><p>推送通知没有被发送(或接收)到我使用 CloudKit 订阅的应用程序,因为有很多方法可以解决这个问题,我将在下面列出我所做的事情,这可能会有所帮助其他人有同样的问题,并且(希望)会指出我做错了什么:(</p>

<p>具体来说,我正在尝试在记录插入时获得静默通知(无论是在后台还是前台),但我都没有收到。</p>

<p>项目设置我在功能下启用CloudKit,在仪表板中设置记录类型。我在功能下为应用程序启用推送通知。我启用了后台模式“远程通知”。</p>

<p>在启动时注册远程通知:</p>

<pre><code>    // Register for push notification
    let settings = UIUserNotificationSettings(forTypes: [.Alert,.Badge,.Sound], categories: nil)
    application.registerUserNotificationSettings(settings)

    // Register for remote notification
    application.registerForRemoteNotifications()
</code></pre>

<p>监听推送通知注册成功(Succeeds)并创建订阅:</p>

<pre><code>func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    NSLog(&#34;Remote notifications registered - %@&#34;,deviceToken)
    createSubscriptions()
}
</code></pre>

<p>创建我的订阅对象,并设置它的通知信息,并将其保存到服务器:</p>

<pre><code>private func createSubscriptions(user : CKRecord, completion: (NSError?) -&gt; ()) {
      let messageSubscription = CKSubscription(recordType: &#34;Messages&#34;, predicate: NSPredicate(format:&#34;TRUEPREDICATE&#34;), subscriptionID: &#34;Messages&#34;, options: .FiresOnRecordCreation)
      let notificationInfo = CKNotificationInfo()
      notificationInfo.shouldSendContentAvailable = true
      notificationInfo.soundName = &#34;&#34;
      messageSubscription.notificationInfo = notificationInfo
      CKContainer.defaultContainer().publicCloudDatabase.saveSubscription(subscription) { (_, error) in
            if let error = error {
                if error.domain == &#34;CKErrorDomain&#34; &amp;&amp; error.code == 15 {
                  NSLog(&#34;Already set, ignoring dupe&#34;)
                }
                else
                {
                  completion(error)
                  return
                }
            }
            completion(nil)
      }
}
</code></pre>

<p>我可以在 CloudKit 仪表板中看到订阅确实创建成功。</p>

<p>然后我从第二个设备或仪表板创建一些记录(“消息”),看到它们是在查询或仪表板调用中添加的,但我必须获取通知的方法从未被调用:</p>

<pre><code>func application(application: UIApplication, didReceiveRemoteNotification userInfo: , fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -&gt; Void) {
    // Crickets.Never called
}
</code></pre>

<p>我了解通知不适用于模拟器。我已经在开发中使用设备进行了尝试,在生产中使用 testflight 和许多设备进行了尝试。我错过了什么明显的东西吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你似乎做的一切都是正确的。我能想到的两件事:</p>

<ol>
<li><p>您确定要注册远程通知吗?我在任何地方都看不到对 <code>application.registerForRemoteNotifications()</code> 的调用。我假设您忘记在此处粘贴它。</p></li>
<li><p>您是否尝试在面板中删除订阅并重新创建?我遇到过使用不同的 notificationInfo 多次注册同一个订阅会<em>破坏</em>它并且它会停止触发的问题。</p></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Cloudkit 不发送推送通知,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/38709940/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/38709940/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Cloudkit 不发送推送通知