遇到 CKSubscription 错误:“无法创建或修改字段 'notif_num_subtitle_loc_args'”

Posted

技术标签:

【中文标题】遇到 CKSubscription 错误:“无法创建或修改字段 \'notif_num_subtitle_loc_args\'”【英文标题】:Encountering CKSubscription error: "Cannot create or modify field 'notif_num_subtitle_loc_args'"遇到 CKSubscription 错误:“无法创建或修改字段 'notif_num_subtitle_loc_args'” 【发布时间】:2017-05-02 06:29:33 【问题描述】:

所以我遇到了一个 CloudKit 错误,当我搜索它时只能得到一个 (1) 个 Google 结果。运行 CKModifySubscriptionsOperation 以创建初始用户的 CK 订阅时出现错误。错误是 Cannot create or modify field 'notif_num_subtitle_loc_args'

我很确定这曾经可以工作,所以这可能是 ios 10.3 或 CloudKit 内部的一些东西?

这是我用于创建订阅的代码:

    let subscriptionID = "MindscopeDownload"
    let predicate = NSPredicate(format: "TRUEPREDICATE")
    let options: CKSubscriptionOptions = [.firesOnRecordCreation, .firesOnRecordUpdate, .firesOnRecordDeletion]
    let subscription = CKSubscription(recordType: "MindscopeNode", predicate: predicate, subscriptionID: subscriptionID, options: options)
    let info = CKNotificationInfo()
    info.alertLocalizationKey = "Mindscope entry changes"
    info.shouldSendContentAvailable = true
    subscription.notificationInfo = info
    let op = CKModifySubscriptionsOperation(subscriptionsToSave: [subscription], subscriptionIDsToDelete: [])
    op.modifySubscriptionsCompletionBlock =  (foo, bar, error: Error?) -> () in
        if let e = error 
            print("Failed to modify subscription: \(e)

这是遇到相同问题的人的 Google 结果:https://forums.developer.apple.com/thread/76893

【问题讨论】:

【参考方案1】:

我遇到了完全相同的问题,它出现在 4 月 1 日到 4 月 17 日之间的某个时间,当时我不在办公室(因此没有进行任何代码更改)。我打开了一个错误,该错误已作为副本关闭。原始错误保持打开状态。所以至少苹果承认这是一个错误。

我只在生产环境看到这个错误,我找到了两个变通办法:

    创建一个新容器,在开发环境中创建订阅类型,部署到生产环境。在 prod 的新容器中创建新的 subs 再次起作用。

不幸的是,这给我留下了一个空容器,我并不急于编写迁移代码来将数据从原始容器移动到新容器。

    在原始容器中,在开发环境中,使用仪表板删除所有订阅类型。在应用程序中重新创建它们,然后将更改推送到生产环境。在 prod 的原始容器中创建 subs 再次起作用。

不幸的是,这会清除所有用户为已删除订阅类型创建的所有现有订阅。对我来说幸运的是,每个用户的订阅列表在我的应用程序中是静态的。我的代码在启动时已经验证/重新创建了丢失的潜艇。但是,如果您的用户动态选择要订阅的内容,这将是一个痛苦的管理情况。 (您可以在擦除订阅类型之前获取现有的 subs 并缓存谓词,但这需要与您的用户协调以确保他们都及时缓存了现有的 subs)

请注意,我还尝试使用具有相同谓词的新订阅 ID 创建新的订阅。那彻底失败了,抱怨新的潜艇是现有子类型的重复。如果您可以将其他子句添加到谓词中,则可以创建新的子类型,这些子类型在部署到 prod 时可以工作。

【讨论】:

P.S.我刚刚阅读了开发者论坛上的帖子。我已经在使用CKQuerySubscription 而不是CKSubscription,所以这不是解决方案。

以上是关于遇到 CKSubscription 错误:“无法创建或修改字段 'notif_num_subtitle_loc_args'”的主要内容,如果未能解决你的问题,请参考以下文章

CKSubscription 在使用 FiresOnce 时返回查询必须至少有一种触发模式的错误

CloudKit:删除 CKSubscription 不起作用

CloudKit 修改现有的 CKSubscription

如何使用 CKSubscription 发送多列信息

如何设置最小的 CKSubscription?

具有复杂谓词的 CKSubscription