菜鸟教程小白 发表于 2022-12-12 13:34:33

ios - 检查 CloudKit 中是否已存在记录订阅


                                            <p><p>我找不到正确的方法来检查 CKRecord 订阅是否已经存在,如果不存在则订阅它以获取推送通知。</p>

<p>我已经实现了订阅本身并且它正在响应,但是每次我输入正确的 ViewController 时,我总是试图再次订阅,如果该订阅已经存在,服务器会回复错误 - 我的问题是:有有什么方法可以先检查订阅是否存在,而不是尝试创建它并等待服务器响应?</p>

<p>这是我订阅记录的方式:</p>

<pre><code>    // Create the predicate
let predicate = NSPredicate(format: &#34;recordId = %@&#34;, RECORD_ID)

// Create a subscription specifying the record type, predicate and notification options
let subscription = CKQuerySubscription(recordType: &#34;Tabs&#34;, predicate: predicate, options: [.firesOnRecordUpdate, .firesOnRecordCreation])

// Create a CloudKit notification object
let notificationInfo = CKNotificationInfo()
notificationInfo.alertLocalizationKey = &#34;Updates have been made&#34;
notificationInfo.shouldBadge = true

// Set the subscriptor&#39;s notification object to the new CloudKit notification object
subscription.notificationInfo = notificationInfo

// Save the subscription to the database
let publicDatabase = CKContainer.default().publicCloudDatabase
publicDatabase.save(subscription) { (subs, err) in
    if let err = err {
      print(&#34;Failed to save subscription:&#34;, err)
      return
    }
}
</code></pre>

<p>谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以使用 <code>fetchAllSubscriptionsWithCompletionHandler</code> 来查询所有现有的 subs,然后您可以检查完成处理程序中返回的每个 sub 的 <code>subscriptionID</code> 属性。 Objective-c 版本如下所示:</p>

<pre><code>    [publicDatabase fetchAllSubscriptionsWithCompletionHandler:^(NSArray&lt;CKSubscription *&gt; * _Nullable subscriptions, NSError * _Nullable error)
    {
      NSMutableArray *subIDs = ;
      for (CKSubscription *sub in subscriptions)
      {
            if (;
            {
                  //do some stuff
            }
      }
    }];
</code></pre>

<p>但是,您提到重新进入 ViewController 并重新运行此检查。并不是说此检查每次都会向服务器发出请求,因此将计入您的事务和传输配额。我建议您在应用启动时运行一次此检查,然后将每个子的状态保存在类变量中,这样您就不必通过不必要的调用反复重新查询服务器。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 检查 CloudKit 中是否已存在记录订阅,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44540026/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44540026/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 检查 CloudKit 中是否已存在记录订阅