CKServerChangeToken のドキュメントを見ると、CKFetchRecordChangesOperation を使用する場合にのみ取得できるようです。参照: https://developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKServerChangeToken_class/index.html
では、どうすればそのトークンを手に入れることができるでしょうか。
通常は次のようにします: でわかるように、 でCKFetchRecordChangesOperation
初期化できますpreviousServerChangeToken
。このトークンはタイムスタンプのように機能します。操作が完了すると、このトークンが に返されますfetchRecordChangesCompletionBlock
。たとえば、そのトークンをユーザーのデフォルトに保存する必要があります。次に を起動したときにCKFetchRecordChangesOperation
、そのトークンを使用して、最後に呼び出してからの変更の読み取りを開始できます。
実際にトークンを保存するのは少し難しいかもしれません。次のようなプロパティを追加することをお勧めします。
private var previousChangeToken: CKServerChangeToken? {
get {
let encodedObjectData = NSUserDefaults.standardUserDefaults().objectForKey("\(container.containerIdentifier)_lastFetchNotificationId") as? NSData
var decodedData: CKServerChangeToken? = nil
if encodedObjectData != nil {
decodedData = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObjectData!) as? CKServerChangeToken
}
return decodedData
}
set(newToken) {
if newToken != nil {
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(newToken!), forKey:"\(container.containerIdentifier)_lastFetchNotificationId")
}
}
}
あなたの場合、他の実行中のアプリによってのみ作成された可能性のある変更トークンで新しいアプリケーションを開始する必要があります。そのため、変更トークンを NSUserDefaults に保存するだけでなく、パブリック データベースの CloudKit の特定の設定 recordType レコードにも保存する必要があります。NSUserDefaults にトークンを持たない新しくインストールされたアプリは、CloudKit 設定レコードからトークンを読み取ることができます。