Discover ways to sync recordsdata and information via a shared iCloud drive folder utilizing the newest model of Swift programming language.
iCloud drive venture setup tutorial
Let’s begin by creating a brand new venture for iOS. You may choose the only view utility template, don’t fear an excessive amount of about doc primarily based apps, as a result of on this tutorial we’re not going to the touch the UIDocument class in any respect. 🤷♂️

Step one is to allow iCloud capabilities, which is able to generate a brand new entitlements file for you. Additionally you’ll should allow the iCloud utility service for the app id on the Apple developer portal. You also needs to assign the iCloud container that’s going for use to retailer information. Only a few clicks, however you must do that manually. 💩
NOTE: You want a sound Apple Developer Program membership so as to set superior app capabilities like iCloud assist. So you must pay $99/yr. #greed 🤑

So I consider that now you could have a correct iOS app identifier with iCloud capabilities and utility providers enabled. One final step is forward, you must add these few traces to your Information.plist file so as to outline the iCloud drive container (folder title) that you simply’re going to make use of. Word that you would be able to have a number of containers for one app.
NSUbiquitousContainers
iCloud.com.tiborbodecs.teszt
NSUbiquitousContainerIsDocumentScopePublic
NSUbiquitousContainerName
Teszt
NSUbiquitousContainerSupportedFolderLevels
Any
Lastly we’re prepared to maneuver ahead with some precise coding. 💻
Information inside iCloud drive containers
Working with iCloud recordsdata utilizing Swift is comparatively simple. Principally you simply should get the bottom URL of your iCloud drive container, and you are able to do no matter you need. 🤔 Nevertheless I’ll present you some greatest practices & tips.
First you must test in case your container folder already exists, if not you need to create it by hand utilizing the FileManager class. I’ve additionally made a “shortcut” variable for the container base URL, so I don’t have to write down all these lengthy phrases once more. 😅
var containerUrl: URL? {
FileManager.default.url(
forUbiquityContainerIdentifier: nil
)?.appendingPathComponent("Paperwork")
}
// test for container existence
if
let url = self.containerUrl,
!FileManager.default.fileExists(
atPath: url.path,
isDirectory: nil
) {
do {
strive FileManager.default.createDirectory(
at: url, withIntermediateDirectories: true,
attributes: nil
)
}
catch {
print(error.localizedDescription)
}
}
Working with paths contained in the iCloud drive container is straightforward, you possibly can append path parts to the bottom URL and use that precise location URL as you need.
let myDocumentUrl = self.containerUrl?
.appendingPathComponent(subDirectory)
.appendingPathComponent(fileName)
.appendingPathExtension(fileExtension)
Selecting present recordsdata can also be fairly simple. You need to use the built-in doc picker class from UIKit. There are solely two catches right here. 🤦♂️
First one is that you want to present the kind of the paperwork that you simply’d prefer to entry. Have you ever ever heard about UTI’s? No? Possibly sure…? The factor is that you must discover the right uniform sort identifier for each file sort, as a substitute of offering an extension or mime-type or one thing generally used factor. Good one, huh? 🧠
let picker = UIDocumentPickerViewController(
documentTypes: ["public.json"],
in: .open
)
picker.delegate = self
picker.modalPresentationStyle = .fullScreen
self.current(picker, animated: true, completion: nil)
The second catch is that you must “unlock” the picked file earlier than you begin studying it. That may be achieved by calling the startAccessingSecurityScopedResource technique. Don’t neglect to name the stopAccessingSecurityScopedResource technique, or issues are going to be out of steadiness. You don’t need that, belief me! #snap 🧤
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard
controller.documentPickerMode == .open,
let url = urls.first,
url.startAccessingSecurityScopedResource()
else {
return
}
defer {
url.stopAccessingSecurityScopedResource()
}
// do some work with the url
}
Every thing else works as you’d anticipate. It can save you recordsdata instantly into the container via file APIs or by utilizing the UIDocumentPickerViewController occasion. Listed below are a number of the commonest api calls, that you should use to govern recordsdata.
// string
strive string.write(to: url, atomically: true, encoding: .utf8)
strive String(contentsOf: url)
// information
strive information.write(to: url, choices: [.atomic])
strive Information(contentsOf: url)
// file supervisor
FileManager.default.copyItem(at: native, to: url)
FileManager.default.removeItem(at: url)
You may learn and write any sort of string, information. By utilizing the FileManager you possibly can copy, transfer, delete gadgets or change file attributes. All of your paperwork saved inside iCloud drive can be magically accessible on each gadget. Clearly you must be logged in together with your iCloud account, and have sufficient free storage. 💰
Debugging
When you alter one thing in your settings you would possibly need to increment your construct quantity as properly so as to notify the working system in regards to the adjustments. 💡
On the mac all of the iCloud drive recordsdata / containers are situated below the person’s Library folder contained in the Cell Paperwork listing. You may merely use the Terminal or Finder to go there and checklist all of the recordsdata. Professional tip: search for hidden ones as properly! 😉
cd ~/Library/Cell Paperwork
ls -la
# ls -la|grep tiborbodecs
You may also monitor the exercise of the CloudDocs daemon, by utilizing this command:
# man brctl
brctl log --wait --shorten
The output will let you know what’s truly occurring through the sync.

I encourage you to test the guide entry for the brctl command, as a result of there are just a few extra flags that may make troubleshooting simpler. 🤐
This text was closely impressed by Marcin Krzyzanowski’s actually previous weblog publish. 🍺

