2016-04-22 17 views
0

CloudKitとCKSubcriptionを使用して、いくつかのApple TV間でデータを同期しようとしています。問題はapplication:didReceiveRemoteNotification:で、レコードの追加、削除、または更新時には呼び出されません。私はサブスクリプションを正しく設定していると信じて、CloudKitダッシュボードに追加されたことを確認しました。私はダッシュボードで開発環境をリセットしようと繰り返し試みましたが、それは助けにはなりません。私は本当に毎回頻繁にフェッチするタイマーを作成したくありません。助けてくれてありがとう!CloudKitサブスクリプションin tvOS

また、私はCloudKitでプライベートデータベースを使用していますが、重要であればパブリックデータベースではありません。

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    CloudKitManager.subscribeToItemUpdates() 
    application.registerForRemoteNotifications() 

    ... 

    return true 
} 

CloudKitManager.swift

class func subscribeToItemUpdates() { 

    if let uuid = UIDevice.currentDevice().identifierForVendor?.UUIDString { 

     saveSubscriptionWithIdentifier(uuid + "create", options: CKSubscriptionOptions.FiresOnRecordCreation) 
     saveSubscriptionWithIdentifier(uuid + "update", options: CKSubscriptionOptions.FiresOnRecordUpdate) 
     saveSubscriptionWithIdentifier(uuid + "delete", options: CKSubscriptionOptions.FiresOnRecordDeletion) 
    } 

} 

class func saveSubscriptionWithIdentifier(identifier: String, options: CKSubscriptionOptions) { 

    let sub = CKSubscription(recordType: "Message", predicate: NSPredicate(value: true), subscriptionID: identifier, options: options) 
    sub.notificationInfo = CKNotificationInfo() 

    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase 
     publicDatabase.saveSubscription(sub) { (savedSubscription, error) -> Void in 
     if error != nil { 
      print("Error saving CloudKit subscription \(error)") 
     } 
     else { 
      print("Saved subscription to CloudKit", savedSubscription) 
     } 
    } 
} 

答えて

0

tvOSとiOSの間にわずかな違いがあります:

は、ここに私のコードです。私のデモアプリケーションでは、私はこのようにそれを扱う:didReceiveRemoteNotification`なく `アプリケーション:didReceiveRemoteNotification:fetchCompletionHandler`詳細については

#if os(tvOS) 
//This will only be called when your app is active. So this is what you should use on tvOS 
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { 
    EVLog("Push received") 
    EVCloudData.publicDB.didReceiveRemoteNotification(userInfo, executeIfNonQuery: { 
     EVLog("Not a CloudKit Query notification.") 
    }, completed: { 
     EVLog("All notifications are processed") 
    }) 
} 
#else 
// Process al notifications even if we are in the background. tvOS will not have this event 
// Make sure you enable background notifications in the app settings. (entitlements: pushnotifications and backgrounds modes - notifications plus background fetch) 
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
    EVLog("Push received") 
    EVCloudData.publicDB.didReceiveRemoteNotification(userInfo, executeIfNonQuery: { 
     EVLog("Not a CloudKit Query notification.") 
    }, completed: { 
     EVLog("All notifications are processed") 
     completionHandler(.NewData) 
    }) 
} 
#endif 

私は`アプリケーションを使用していますEVCloudKitDao

+0

を参照してください。私はEVCloudKitDaoを見て、アプリが起動するたびにすべての購読を削除して再購読しているようだ。私はそれをしていない、それはおそらく問題ですか?それは必要ですか? CloudKitの公開データベースではなくプライベートデータベースを使用しているので、それは違いがありますか?ありがとう –

関連する問題