I just finished watching What’s New in Cocoa Touch today from WWDC 2016, it was an awesome session. My coworker called it “the index for the rest of WWDC.” Olivier Gutknect basically goes on rapid fire for an hour citing change after change in UIKit for iOS 10. For each thing he mentions, he covers varied levels of detail, and usually references a different WWDC session where the framework or topic will be covered in more detail. The UIPasteboard iOS 10 API made an appearance in this session, just like the keynote. When I heard about the Universal Clipboard changes for iOS 10 and macOS Sierra, I was so excited to actually be able to use this new feature as an end user. It’s so cool, leveraging Handoff and continuity, iOS and macOS will intelligently share your clipboard across devices. This means I can copy something on my laptop, and then pickup my iPhone and have that most recent thing copied available for pasting.
As a developer, I was also curious to see what new changes were in store in the UIPasteboard iOS 10 API.
In order to take advantage of the new Universal Clipboard in your apps, you don’t need to do anything differently than you’ve been doing, just use the UIPasteboard API. That being said, in order to provide the best user experience, there’s two changes to the UIPasteboard iOS 10 API that are related to the Universal Clipboard:
- Methods to help understand what is in the clipboard.
- Methods to designate the lifetime of the clipboard item.
Understanding the Clipboard Contents
Some of the changes to the UIPasteboard iOS 10 API enable you to inspect the contents of the clipboard to understand what type of contents are in the clipboard. Is it a color? Is it an image? Is it a string? Is it a URL? As a developer, you can intelligently take advantage of this. For example, say your app contains a color picker. You could provide a standard looking color picker, while also observing that the clipboard contains a color and show it as well.
Here’s an example:
// Setup, let's put some stuff in the UIPasteboard
let pasteboard = UIPasteboard.general()
pasteboard.string = "andy"
pasteboard.url = URL(string: "http://cleanswifter.com")
pasteboard.image = UIImage()
pasteboard.color = UIColor.red()
// Understanding the UIPasteboard contents
if pasteboard.hasStrings {
print("The pasteboard has Strings!")
}
if pasteboard.hasURLs {
print("The pasteboard has URLs!")
}
if pasteboard.hasImages {
print("The pasteboard has images!")
}
if pasteboard.hasColors {
print("The pasteboard has colors!")
}
Designating The Lifetime of Clipboard Contents
With the changes to the UIPasteboard iOS 10 API that introduce Universal Clipboard, it also opens a slight security vulnerability in that an end user could copy a sensitive piece of data and inadvertently make it available across all their devices. The UIPasteboard iOS 10 API provides a way to lock this down. As a developer, you can either:
- Flag a piece of data as “local only” in which it will not appear in the Universal Clipboard across devices, and
- Set an expiration date on a piece of data such that it isn’t available after that date.
Here’s an example of flagging a pasteboard item as “local only”:
// Add a string
let aLocalOnlyStringKey = "Local only string key"
let aLocalOnlyStringValue = "Local only string value"
// Set the string in the LOCAL pasteboard
pasteboard.setItems([[aLocalOnlyStringKey: aLocalOnlyStringValue]], options: [UIPasteboardOption.localOnly : true])
In one line, you set the item in the UIPasteboard
with an option localOnly
as true
.
Here’s an example of adding something to the pasteboard with an expiration date:
let aExpiringStringKey = "Local only string key"
let aExpiringStringValue = "Local only string value"
// Create a date 24 hours from now
let expirationDateOfTomorrow = Date().addingTimeInterval(60*60*24)
// Add the string and mark it to expire 24 hours from now
pasteboard.setItems([[aExpiringStringKey: aExpiringStringValue]], options: [UIPasteboardOption.expirationDate: expirationDateOfTomorrow])
Again, in one line you get to pass an expiration date for when the UIPasteboard
item should expire. You can also use these together.
Gonna Needa Pasteboard
James Dempsey is going to need to update the lyrics to his song “Gonna Needa Pasteboard” to account for the Universal Clipboard and these new UIPasteboard iOS 10 API features. In the meantime, I absolutely can’t wait to use the Universal Clipboard, and all the while knowing that if developers properly take advantage of these new UIPasteboard iOS 10 API features, my data will be safe and my applications will be snappy.
The code from this post is available in GitHub as a playground, here.
Don’t forget, this UIPasteboard iOS 10 API is still in beta and could change between now and the public release.
Happy cleaning.
I can see an image in pasteboard using hasimages but when I try to use in a custom keyboard the code always reports there is no image in pasteboard?
I can insert text from my custom keyboard but cannot access the pasteboard?
Any ideas?