Discover ways to sync information and knowledge by way of a shared iCloud drive folder utilizing the most recent model of Swift programming language.
iCloud drive venture setup tutorial
Let’s begin by creating a brand new venture for iOS. You possibly can 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 must allow the iCloud utility service for the app id on the Apple developer portal. You must also assign the iCloud container that’s going for use to retailer knowledge. Only a few clicks, however you need to do that manually. 💩
You want a legitimate Apple Developer Program membership as a way to set superior app capabilities like iCloud help. So you need to pay $99/12 months. #greed 🤑
So I consider that now you will have a correct iOS app identifier with iCloud capabilities and utility companies enabled. One final step is forward, you need to add these few traces to your Information.plist
file as a way to outline the iCloud drive container (folder title) that you just’re going to make use of. Be aware 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. 💻
Recordsdata inside iCloud drive containers
Working with iCloud information utilizing Swift is comparatively straightforward. Mainly you simply must get the bottom URL of your iCloud drive container, and you are able to do no matter you need. 🤔 Nonetheless I’ll present you some finest practices & methods.
First you need to verify in case your container folder already exists, if not it is best 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 put in writing all these lengthy phrases once more. 😅
var containerUrl: URL? {
FileManager.default.url(
forUbiquityContainerIdentifier: nil
)?.appendingPathComponent("Paperwork")
}
// verify 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 easy, you possibly can append path parts to the bottom URL and use that actual location URL as you need.
let myDocumentUrl = self.containerUrl?
.appendingPathComponent(subDirectory)
.appendingPathComponent(fileName)
.appendingPathExtension(fileExtension)
Selecting current information can 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 it’s essential to present the kind of the paperwork that you just’d wish to entry. Have you ever ever heard about UTI’s? No? Possibly sure…? The factor is that you need to discover the right uniform sort identifier for each file sort, as an alternative 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 need to “unlock” the picked file earlier than you begin studying it. That may be executed 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 information straight into the container by way of file APIs or by utilizing the UIDocumentPickerViewController
occasion. Listed here are among the most typical api calls, that you should utilize to govern information.
// string
strive string.write(to: url, atomically: true, encoding: .utf8)
strive String(contentsOf: url)
// knowledge
strive knowledge.write(to: url, choices: [.atomic])
strive Knowledge(contentsOf: url)
// file supervisor
FileManager.default.copyItem(at: native, to: url)
FileManager.default.removeItem(at: url)
You possibly can learn and write any form of string, knowledge. Through the use of the FileManager
you possibly can copy, transfer, delete gadgets or change file attributes. All of your paperwork saved inside iCloud drive might be magically obtainable on each system. Clearly you need to be logged in along with your iCloud account, and have sufficient free storage. 💰
Debugging
In the event you alter one thing in your settings you would possibly need to increment your construct quantity as effectively as a way to notify the working system concerning the adjustments. 💡
On the mac all of the iCloud drive information / containers are positioned beneath the person’s Library folder contained in the Cellular Paperwork listing. You possibly can merely use the Terminal or Finder to go there and record all of the information. Professional tip: search for hidden ones as effectively! 😉
cd ~/Library/Cellular Paperwork
ls -la
# ls -la|grep tiborbodecs
You too can monitor the exercise of the CloudDocs daemon, by utilizing this command:
# man brctl
brctl log --wait --shorten
The output will inform you what’s really taking place throughout the sync.
I encourage you to verify the handbook entry for the brctl
command, as a result of there are a number of extra flags that may make troubleshooting simpler. 🤐
This text was closely impressed by Marcin Krzyzanowski’s actually previous weblog publish. 🍺