Skip to content

Commit

Permalink
Merge pull request #24 from deeje/feature/4.0.2
Browse files Browse the repository at this point in the history
Fix for CloudKit error 3 when using cellular
  • Loading branch information
deeje committed Apr 3, 2022
2 parents 99ecd2a + 9af949a commit 2f771f7
Show file tree
Hide file tree
Showing 17 changed files with 42 additions and 21 deletions.
2 changes: 1 addition & 1 deletion CloudCore.podspec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "CloudCore"
s.summary = "Framework that enables synchronization between CloudKit and Core Data."
s.version = "4.0.1"
s.version = "4.0.2"
s.homepage = "https://github.com/deeje/CloudCore"
s.license = 'MIT'
s.author = { "deeje" => "deeje@mac.com", "Vasily Ulianov" => "vasily@me.com" }
Expand Down
1 change: 1 addition & 0 deletions Example/Sources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import UIKit
import CoreData
import CloudKit
import CloudCore
import Connectivity

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ CloudCore now has built-in support for CloudKit Sharing. There are several addi
func windowScene(_ windowScene: UIWindowScene,
userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
let acceptShareOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
acceptShareOperation.qualityOfService = .userInteractive
acceptShareOperation.qualityOfService = .userInitiated
acceptShareOperation.perShareCompletionBlock = { meta, share, error in
CloudCore.pull(rootRecordID: meta.rootRecordID, container: self.persistentContainer, error: nil) { }
}
Expand All @@ -198,7 +198,7 @@ OR
func application(_ application: UIApplication,
userDidAcceptCloudKitShareWith cloudKitShareMetadata: CKShare.Metadata) {
let acceptShareOperation = CKAcceptSharesOperation(shareMetadatas: [cloudKitShareMetadata])
acceptShareOperation.qualityOfService = .userInteractive
acceptShareOperation.qualityOfService = .userInitiated
acceptShareOperation.perShareCompletionBlock = { meta, share, error in
CloudCore.pull(rootRecordID: meta.rootRecordID, container: self.persistentContainer, error: nil) { }
}
Expand Down
18 changes: 17 additions & 1 deletion Source/Classes/CloudCore.swift
Original file line number Diff line number Diff line change
Expand Up @@ -256,5 +256,21 @@ open class CloudCore {

delegate?.error(error: subscriptionError, module: nil)
}


static public func perform(completion: ((CKContainer) -> Void)) {
let container = config.container

if #available(iOS 15.0, *) {
let ckConfig = CKOperation.Configuration()
// ckConfig.container = container
ckConfig.qualityOfService = .userInitiated
ckConfig.allowsCellularAccess = true
container.configuredWith(configuration: ckConfig, group: nil) { configuredContainer in
completion(configuredContainer)
}
} else {
completion(container)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class FetchPublicSubscriptionsOperation: AsynchronousOperation {
super.init()

name = "FetchPublicSubscriptionsOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public class PublicDatabaseSubscriptions {

let config = CKOperation.Configuration()
config.timeoutIntervalForResource = 20
config.qualityOfService = .userInitiated
modifySubscriptions.configuration = config

CloudCore.config.container.publicCloudDatabase.add(modifySubscriptions)
Expand All @@ -67,6 +68,7 @@ public class PublicDatabaseSubscriptions {

let config = CKOperation.Configuration()
config.timeoutIntervalForResource = 20
config.qualityOfService = .userInitiated
modifySubscription.configuration = config

CloudCore.config.container.publicCloudDatabase.add(modifySubscription)
Expand Down
8 changes: 4 additions & 4 deletions Source/Classes/Pull/PullChangesOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public class PullChangesOperation: PullOperation {
let changedRecordIDs: NSMutableSet = []
let deletedRecordIDs: NSMutableSet = []
let fetchNotificationChanges = CKFetchNotificationChangesOperation(previousServerChangeToken: databaseChangeToken)
fetchNotificationChanges.qualityOfService = .userInteractive
fetchNotificationChanges.qualityOfService = .userInitiated
fetchNotificationChanges.notificationChangedBlock = { innerNotification in
if let innerQueryNotification = innerNotification as? CKQueryNotification {
if innerQueryNotification.queryNotificationReason == .recordDeleted {
Expand All @@ -80,7 +80,7 @@ public class PullChangesOperation: PullOperation {
let allChangedRecordIDs = changedRecordIDs.allObjects as! [CKRecord.ID]
let fetchRecords = CKFetchRecordsOperation(recordIDs: allChangedRecordIDs)
fetchRecords.database = CloudCore.config.container.publicCloudDatabase
fetchRecords.qualityOfService = .userInteractive
fetchRecords.qualityOfService = .userInitiated
fetchRecords.perRecordCompletionBlock = { record, recordID, error in
if error == nil {
self.addConvertRecordOperation(record: record!, context: backgroundContext)
Expand Down Expand Up @@ -111,7 +111,7 @@ public class PullChangesOperation: PullOperation {

let fetchDatabaseChanges = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
fetchDatabaseChanges.database = database
fetchDatabaseChanges.qualityOfService = .userInteractive
fetchDatabaseChanges.qualityOfService = .userInitiated
fetchDatabaseChanges.recordZoneWithIDChangedBlock = { recordZoneID in
changedZoneIDs.append(recordZoneID)
}
Expand Down Expand Up @@ -173,7 +173,7 @@ public class PullChangesOperation: PullOperation {
if recordZoneIDs.isEmpty { return }

let recordZoneChangesOperation = FetchRecordZoneChangesOperation(from: database, recordZoneIDs: recordZoneIDs, tokens: tokens)
recordZoneChangesOperation.qualityOfService = .userInteractive
recordZoneChangesOperation.qualityOfService = .userInitiated
recordZoneChangesOperation.recordChangedBlock = {
self.addConvertRecordOperation(record: $0, context: context)
}
Expand Down
2 changes: 1 addition & 1 deletion Source/Classes/Pull/PullOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class PullOperation: Operation {

super.init()

qualityOfService = .userInteractive
qualityOfService = .userInitiated

queue.name = "PullQueue"
queue.maxConcurrentOperationCount = 1
Expand Down
2 changes: 1 addition & 1 deletion Source/Classes/Pull/PullRecordOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public class PullRecordOperation: PullOperation {
private func addFetchRecordsOp(recordIDs: [CKRecord.ID], backgroundContext: NSManagedObjectContext) {
let fetchRecords = CKFetchRecordsOperation(recordIDs: recordIDs)
fetchRecords.database = database
fetchRecords.qualityOfService = .userInteractive
fetchRecords.qualityOfService = .userInitiated
fetchRecords.perRecordCompletionBlock = { record, recordID, error in
if let record = record {
self.fetchedRecordIDs.append(recordID!)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class FetchRecordZoneChangesOperation: Operation {
super.init()

name = "FetchRecordZoneChangesOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
Expand Down Expand Up @@ -90,7 +90,7 @@ class FetchRecordZoneChangesOperation: Operation {
}

fetchRecordZoneChanges.database = self.database
fetchRecordZoneChanges.qualityOfService = .userInteractive
fetchRecordZoneChanges.qualityOfService = .userInitiated

return fetchRecordZoneChanges
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class PurgeLocalDatabaseOperation: Operation {
super.init()

name = "PurgeLocalDatabaseOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
Expand Down
2 changes: 1 addition & 1 deletion Source/Classes/Push/PushOperationQueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class PushOperationQueue: OperationQueue {
let modifyRecords = CKModifyRecordsOperation(recordsToSave: recordsToSave, recordIDsToDelete: recordIDsToDelete)
modifyRecords.database = database
modifyRecords.savePolicy = .changedKeys
modifyRecords.qualityOfService = .userInteractive
modifyRecords.qualityOfService = .userInitiated

modifyRecords.perRecordCompletionBlock = { record, error in
if let error = error {
Expand Down
3 changes: 2 additions & 1 deletion Source/Classes/Setup/CreateCloudCoreZoneOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@ class CreateCloudCoreZoneOperation: AsynchronousOperation {
super.init()

name = "CreateCloudCoreZoneOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
super.main()

let cloudCoreZone = CKRecordZone(zoneName: CloudCore.config.zoneName)
let recordZoneOperation = CKModifyRecordZonesOperation(recordZonesToSave: [cloudCoreZone], recordZoneIDsToDelete: nil)
recordZoneOperation.qualityOfService = .userInitiated
recordZoneOperation.modifyRecordZonesCompletionBlock = {
if let error = $2 {
self.errorBlock?(error)
Expand Down
2 changes: 1 addition & 1 deletion Source/Classes/Setup/PushAllLocalDataOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class PushAllLocalDataOperation: Operation {
super.init()

name = "PushAllLocalDataOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
Expand Down
2 changes: 1 addition & 1 deletion Source/Classes/Setup/SetupOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class SetupOperation: Operation {
super.init()

name = "SetupOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

private let queue = OperationQueue()
Expand Down
6 changes: 3 additions & 3 deletions Source/Classes/Setup/SubscribeOperation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class SubscribeOperation: AsynchronousOperation {
super.init()

name = "SubscribeOperation"
qualityOfService = .userInteractive
qualityOfService = .userInitiated
}

override func main() {
Expand Down Expand Up @@ -75,7 +75,7 @@ class SubscribeOperation: AsynchronousOperation {
}
}

modifySubscriptions.qualityOfService = .userInteractive
modifySubscriptions.qualityOfService = .userInitiated

return modifySubscriptions
}
Expand All @@ -89,7 +89,7 @@ class SubscribeOperation: AsynchronousOperation {
operationToCancel.cancel()
}
}
fetchSubscriptions.qualityOfService = .userInteractive
fetchSubscriptions.qualityOfService = .userInitiated

return fetchSubscriptions
}
Expand Down
1 change: 1 addition & 0 deletions Source/Classes/Sharing/CloudCoreSharingController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public class CloudCoreSharingController: NSObject, UICloudSharingControllerDeleg
let sharingController = UICloudSharingController { _, handler in
let modifyOp = CKModifyRecordsOperation(recordsToSave: [aRecord, share], recordIDsToDelete: nil)
modifyOp.savePolicy = .changedKeys
modifyOp.qualityOfService = .userInitiated
modifyOp.modifyRecordsCompletionBlock = { records, recordIDs, error in
if let share = records?.first as? CKShare {
handler(share, CloudCore.config.container, error)
Expand Down

0 comments on commit 2f771f7

Please sign in to comment.