2 * Copyright (c) 2016 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #import <Foundation/Foundation.h>
27 @
class CKKSKeychainView
;
28 #import "keychain/ckks/CKKSGroupOperation.h"
29 #import "keychain/ckks/CloudKitDependencies.h"
31 NS_ASSUME_NONNULL_BEGIN
34 @protocol CKKSFetchBecauseProtocol
<NSObject
>
36 typedef NSString
<CKKSFetchBecauseProtocol
> CKKSFetchBecause
;
37 extern CKKSFetchBecause
* const CKKSFetchBecauseAPNS
;
38 extern CKKSFetchBecause
* const CKKSFetchBecauseAPIFetchRequest
;
39 extern CKKSFetchBecause
* const CKKSFetchBecauseCurrentItemFetchRequest
;
40 extern CKKSFetchBecause
* const CKKSFetchBecauseInitialStart
;
41 extern CKKSFetchBecause
* const CKKSFetchBecauseSecuritydRestart
;
42 extern CKKSFetchBecause
* const CKKSFetchBecausePreviousFetchFailed
;
43 extern CKKSFetchBecause
* const CKKSFetchBecauseKeyHierarchy
;
44 extern CKKSFetchBecause
* const CKKSFetchBecauseTesting
;
45 extern CKKSFetchBecause
* const CKKSFetchBecauseResync
;
47 /* Clients that register to use fetches */
48 @interface CKKSCloudKitFetchRequest
: NSObject
49 @property
bool participateInFetch
;
51 // If true, you will receive YES in the resync parameter to your callback.
52 // You may also receive YES to your callback if a resync has been triggered for you.
53 // It does nothing else. Use as you see fit.
54 // Note: you will receive exactly one callback with moreComing=0 and resync=1 for each
55 // resync fetch. You may then receive further callbacks with resync=0 during the same fetch,
56 // if other clients keep needing fetches.
57 @property BOOL resync
;
59 @
property (nullable
) CKServerChangeToken
* changeToken
;
62 @
class CKKSCloudKitDeletion
;
64 @protocol CKKSChangeFetcherClient
<NSObject
>
65 - (CKRecordZoneID
*)zoneID
;
66 - (BOOL
)zoneIsReadyForFetching
;
67 - (CKKSCloudKitFetchRequest
*)participateInFetch
;
69 // Return false if this is a 'fatal' error and you don't want another fetch to be tried
70 - (bool)shouldRetryAfterFetchError
:(NSError
*)error
;
72 - (void)changesFetched
:(NSArray
<CKRecord
*>*)changedRecords
73 deletedRecordIDs
:(NSArray
<CKKSCloudKitDeletion
*>*)deleted
74 newChangeToken
:(CKServerChangeToken
*)changeToken
75 moreComing
:(BOOL
)moreComing
79 // I don't understand why recordType isn't part of record ID, but deletions come in as both things
80 @interface CKKSCloudKitDeletion
: NSObject
81 @property CKRecordID
* recordID
;
82 @property NSString
* recordType
;
83 - (instancetype
)initWithRecordID
:(CKRecordID
*)recordID recordType
:(NSString
*)recordType
;
87 @interface CKKSFetchAllRecordZoneChangesOperation
: CKKSGroupOperation
88 @
property (readonly
) Class
<CKKSFetchRecordZoneChangesOperation
> fetchRecordZoneChangesOperationClass
;
89 @
property (readonly
) CKContainer
* container
;
91 // Set this to true before starting this operation if you'd like resync behavior:
92 // Fetching everything currently in CloudKit and comparing to local copy
93 @property
bool resync
;
95 @
property (nullable
) NSMutableArray
<CKRecordZoneID
*>* fetchedZoneIDs
;
97 @property NSSet
<CKKSFetchBecause
*>* fetchReasons
;
98 @property NSSet
<CKRecordZoneNotification
*>* apnsPushes
;
100 @property NSMutableDictionary
<CKRecordID
*, CKRecord
*>* modifications
;
101 @property NSMutableDictionary
<CKRecordID
*, CKKSCloudKitDeletion
*>* deletions
;
102 @property NSMutableDictionary
<CKRecordZoneID
*, CKServerChangeToken
*>* changeTokens
;
104 - (instancetype
)init NS_UNAVAILABLE
;
105 - (instancetype
)initWithContainer
:(CKContainer
*)container
106 fetchClass
:(Class
<CKKSFetchRecordZoneChangesOperation
>)fetchRecordZoneChangesOperationClass
107 clients
:(NSArray
<id
<CKKSChangeFetcherClient
>>*)clients
108 fetchReasons
:(NSSet
<CKKSFetchBecause
*>*)fetchReasons
109 apnsPushes
:(NSSet
<CKRecordZoneNotification
*>* _Nullable
)apnsPushes
110 forceResync
:(bool)forceResync
111 ckoperationGroup
:(CKOperationGroup
*)ckoperationGroup
;
115 NS_ASSUME_NONNULL_END