UIActivityViewController Tutorial: Sharing Data
In this UIActivityViewController tutorial, you’ll learn all about giving your users the ability to export their data and share it with others. By Owen L Brown.
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Contents
UIActivityViewController Tutorial: Sharing Data
10 mins
Exporting App Data
So far in this UIActivityViewController
tutorial, you’ve added functionality to your app that handles importing data from other apps. However, what if you want to share your app’s data?
You’re in luck, as Apple has made exporting data nice and easy.
Your app will need code to handle exporting your favorite books. Open Book.swift and replace the existing exportToURL()
definition with the following:
func exportToURL() -> URL? {
// 1
guard let encoded = try? JSONEncoder().encode(self) else { return nil }
// 2
let documents = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask
).first
guard let path = documents?.appendingPathComponent("/\(name).btkr") else {
return nil
}
// 3
do {
try encoded.write(to: path, options: .atomicWrite)
return path
} catch {
print(error.localizedDescription)
return nil
}
}
Here’s a step-by-step explanation of the code above:
- Encode
Book
as JSON. - Verify that your app can access its Documents directory without error.
- Finally, save the data to your Documents directory and return the URL of the newly-created file.
Now that you can export Book
data to a file, you’re going to need an easy way to share that data. Open BookDetailViewController.swift and replace the implementation of share(_:)
with the following:
@IBAction func share(_ sender: UIBarButtonItem) {
// Get latest changes
saveBook()
// 1
guard
let detailBook = detailBook,
let url = detailBook.exportToURL()
else { return }
// 2
let activity = UIActivityViewController(
activityItems: ["Check out this book! I like using Book Tracker.", url],
applicationActivities: nil
)
activity.popoverPresentationController?.barButtonItem = sender
// 3
present(activity, animated: true, completion: nil)
}
Here’s a step-by-step explanation of the code above:
- Ferify that you have a detail book and that you can retrieve the URL from
exportToURL()
. - Create an instance of
UIActivityViewController
and, foractivityItems
, pass in a message and the URL to your app’s data file. Depending on the activity the user selects from the activity menu, iOS uses the message you pass in to pre-populate its content. For example, if the user chooses to share the book via Email, the message you passed in will pre-populate the body of the email. Since not all activities have such capability, such as AirDrop, iOS may discard the message.UIActivityViewController
will do all of this heavy lifting for you and, since you defined all of the required information in your Info.plist, it’ll know just what to do with it. - Present the
UIActivityViewController
to the user.
Build and run your app, open a book and try to share it. You’ll notice that you see a few options available to you as shown below:
UIActivityViewController
has been around since iOS6, but despite how useful it is, it’s often under-appreciated. Perhaps one of the best options is the ability to AirDrop. If you have two devices — or better yet, a friend with the Book Tracker app installed — you can test AirDropping books!
Where to Go From Here?
You can download the completed version of the project using the Download Materials button at the top or bottom of this tutorial.
Now that you know how iOS imports and exports app data, you’re ready to take this knowledge and start sharing your favorite books or any other data of your choice.
Here are some resources for further study:
- A video on the same topic from WWDC17: Extend Your App’s Presence With Sharing.
- Another tutorial that leverages
UIActivityViewController
: Requesting App Ratings and Reviews Tutorial for iOS. - If you’re interested to know how to make your app show up as an option within
UIActivityViewController
, you may want to watch iOS App Extensions video tutorial series.