iCloud drive mission setup tutorial
Let’s begin by creating a brand new mission for iOS. You may choose the only view software template, don’t fret an excessive amount of about doc based mostly 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 can generate a brand new entitlements file for you. Additionally you may should allow the iCloud software service for the app id on the Apple developer portal. You must also assign the iCloud container that is 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 with a purpose to set superior app capabilities like iCloud help. So you need to pay $99/yr. #greed 🤑
So I consider that now you’ve a correct iOS app identifier with iCloud capabilities and software providers enabled. One final step is forward, you need to add these few strains to your Information.plist
file with a purpose to outline the iCloud drive container (folder identify) that you will use. Word you could have a number of containers for one app.
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.tiborbodecs.teszt</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>Teszt</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
Lastly we’re prepared to maneuver ahead with some precise coding. 💻
Information inside iCloud drive containers
Working with iCloud information 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. 🤔 Nonetheless I will present you some greatest practices & tips.
First you need to examine 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 haven’t got to put in writing all these lengthy phrases once more. 😅
var containerUrl: URL? {
return FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Paperwork")
}
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 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 present the kind of the paperwork that you just’d wish to entry. Have you ever ever heard about UTI‘s? No? Perhaps sure…? The factor is that you need to discover the correct uniform sort identifier for each file sort, as a substitute of offering an extension or mime-type or one thing generally used factor. Sensible 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 finished by calling the startAccessingSecurityScopedResource
methodology. Remember to name the stopAccessingSecurityScopedResource methodology
, or issues are going to be out of stability. 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()
}
}
Every part else works as you’d count on. It can save you information immediately into the container via file APIs or through the use of the UIDocumentPickerViewController
occasion. Listed below are among the most typical api calls, that you should utilize to control information.
strive string.write(to: url, atomically: true, encoding: .utf8)
strive String(contentsOf: url)
strive knowledge.write(to: url, choices: [.atomic])
strive Knowledge(contentsOf: url)
FileManager.default.copyItem(at: native, to: url)
FileManager.default.removeItem(at: url)
You may learn and write any sort 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 can be magically out there on each machine. Clearly you need to be logged in together with your iCloud account, and have sufficient free storage. 💰
Debugging
If you happen to alter one thing in your settings you may need to increment your construct quantity as effectively with a purpose to notify the working system in regards to the modifications. 💡
On the mac all of the iCloud drive information / containers are positioned beneath the consumer’s Library folder contained in the Cell Paperwork listing. You may 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/Cell Paperwork
ls -la
You too can monitor the exercise of the CloudDocs daemon, through the use of this command:
brctl log --wait --shorten
The output will let you know what’s really occurring through the sync.
I encourage you to examine the guide entry for the brctl
command, as a result of there are just a few extra flags that may make troubleshooting less difficult. 🤐
This text was closely impressed by Marcin Krzyzanowski‘s actually previous weblog submit. 🍺