Data Delivery with Drag and Drop

Similar documents
Mastering Drag and Drop

Using and Extending the Xcode Source Editor

Modern User Interaction on ios

Enhancing your apps for the next dimension of touch

Using Grouped Notifications

What's New in Core Spotlight

What s New in Xcode App Signing

Managing Documents In Your ios Apps

Introduction to Siri Shortcuts

Mastering UIKit on tvos

What s New in imessage Apps

What s New in watchos

Introducing Password AutoFill for Apps

Media and Gaming Accessibility

Monetize and Promote Your App with iad

Quick Interaction Techniques for watchos

Vision Framework. Building on Core ML. Media #WWDC17. Brett Keating, Apple Manager Frank Doepke, He who wires things together

Extending Your Apps with SiriKit

What s New in tvos 12

Creating Audio Apps for watchos

Building Watch Apps #WWDC15. Featured. Session 108. Neil Desai watchos Engineer

What s New in tvos #WWDC16. App Frameworks. Session 206. Hans Kim tvos Engineer

Building for Voice with Siri Shortcuts

What s New in Notifications

Building Visually Rich User Experiences

Integrating Apps and Content with AR Quick Look

Touch Bar Fundamentals

Getting the Most Out of HealthKit

App Extension Best Practices

New UIKit Support for International User Interfaces

What s New in MapKit. App Frameworks #WWDC17. Fredrik Olsson

What s New in Core Data?

What s New in Cocoa for macos

imessage Apps and Stickers, Part 2

ios Accessibility Developing for everyone Session 201 Ian Fisch ios Accessibility

Introducing the Contacts Framework

CarPlay Audio and Navigation Apps

Introducing the Modern WebKit API

What's New in UIKit Dynamics and Visual Effects Session 229

Introducing On Demand Resources

Introducing the Photos Frameworks

Mysteries of Auto Layout, Part 1

What s New in CloudKit

Enabling Your App for CarPlay

Creating Complications with ClockKit Session 209

Designing for Apple Watch

What s New in SiriKit

Getting Published in Apple News

WatchKit In-Depth, Part 2

Seamless Linking to Your App

Accessibility on ios. Developing for everyone. Frameworks #WWDC14. Session 210 Clare Kasemset ios Accessibility

Swift API Design Guidelines

What s New in NSCollectionView Session 225

Introducing MusicKit. Media #WWDC17. Tim Parthemore, MusicKit Services Joel Lopes Da Silva, ios Music

Writing Energy Efficient Apps

Accessibility on OS X

Apple Watch Design Tips and Tricks

Leveraging Touch Input on ios

What s New in Testing

Building Apps with Dynamic Type

What s New in SpriteKit

Engineering for Testability

Introducing Swift Playgrounds

Localizing with Xcode 9

What s New in HomeKit

What s New in Swift Playgrounds

Core ML in Depth. System Frameworks #WWDC17. Krishna Sridhar, Core ML Zach Nation, Core ML

Cross Platform Nearby Networking

Creating Extensions for ios and OS X, Part Two

Implementing UI Designs in Interface Builder

Advances in AVFoundation Playback

Advanced Notifications

Creating Great App Previews

CloudKit Tips And Tricks

New Ways to Work with Workouts

What s New in ARKit 2

Introducing SiriKit. Hey Siri, say hello to apps #WWDC16. App Frameworks. Session 217

What s New in Foundation for Swift Session 207

Getting Started with CareKit

Designing Great Apple Watch Experiences

Your Apps and the Future of macos Security

Thread Sanitizer and Static Analysis

Validating HTTP Live Streams

Building Faster in Xcode

Advanced Scrollviews and Touch Handling Techniques

Getting the Most out of Playgrounds in Xcode

Guidelines for Annual Meeting Presentations Child Neurology Society October 15-18, 2018 Hyatt Regency Chicago Chicago, IL

Understanding Undefined Behavior

Finding Bugs Using Xcode Runtime Tools

Introducing Metal 2. Graphics and Games #WWDC17. Michal Valient, GPU Software Engineer Richard Schreyer, GPU Software Engineer

Improving your Existing Apps with Swift

Design for Everyone. Design #WWDC17. Caroline Cranfill, Designer Alexander James O Connell, Designer

Localization Best Practices on tvos

Localizing with Xcode 6

SceneKit: What s New Session 604

Creating Content with iad JS

Creating Extensions for Safari

CICS Explorer. Matthew Webster IBM Thursday, February 7, IBM Corporation

Content Protection for HTTP Live Streaming

Networking with NSURLSession

Transcription:

Session App Frameworks #WWDC17 Data Delivery with Drag and Drop 227 Dave Rahardja, UIKit Tanu Singhal, UIKit 2017 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

API Roadmap Drag Interaction Preview Drop Interaction Drag Interaction Delegate Drag Session Drag Item Drop Session Drop Interaction Delegate Item Provider

API Roadmap Drag Interaction Preview Drop Interaction Drag Interaction Delegate Drag Session Drag Item Drop Session Drop Interaction Delegate Item Provider

NSItemProvider Basics Uniform Type Identifiers Model Classes Advanced Topics

NSItemProvider Basics

NSItemProvider Data promises Asynchronous Progress, cancellable Supported Drag and Drop UIPasteConfiguration UIPasteboard

Data Promise

Data Promise Providing Data let image = UIImage(named: "Photo") let itemprovider = NSItemProvider(object: image!)

Data Promise Providing Data let image = UIImage(named: "Photo") let itemprovider = NSItemProvider(object: image!) Retrieving Data itemprovider.loadobject(ofclass: UIImage.self) { (object, error) in if let image = object as? UIImage { // use image } }

Data Promise Providing Data let image = UIImage(named: "Photo") let itemprovider = NSItemProvider(object: image!) Retrieving Data itemprovider.loadobject(ofclass: UIImage.self) { (object, error) in if let image = object as? UIImage { DispatchQueue.main.async { // Update UI } } }

Demo

Progress and Cancellation

Progress and Cancellation Retrieving Data let progress = itemprovider.loadobject(ofclass: UIImage.self) { // Returns progress (object, error) in //... } let progresssofar = progress.fractioncompleted let isfinished = progress.isfinished progress.cancel()

Progress and Cancellation One Progress object per load request Overall Progress object from UIDropSession

Maximize Compatibility

Uniform Type Identifiers

Multiple Representations One NSItemProvider = one thing being dragged Multiple representations

Multiple Representations One NSItemProvider = one thing being dragged Multiple representations Vector drawing Native file format PDF PNG JPG

Multiple Representations One NSItemProvider = one thing being dragged Multiple representations Vector drawing Native file format com.yourcompany.vector-drawing PDF com.adobe.pdf PNG public.png JPG public.jpeg

Multiple Representations One NSItemProvider = one thing being dragged Multiple representations Vector drawing Native file format com.yourcompany.vector-drawing PDF kuttypepdf PNG kuttypepng JPG kuttypejpeg

Fidelity Order Highest fidelity first Internal type Highest fidelity common type Next highest fidelity common type

Use Concrete Uniform Type Identifiers

Use Concrete Uniform Type Identifiers Abstract item public.data public.plain-text public.image

Use Concrete Uniform Type Identifiers Abstract item public.data public.plain-text public.image

Use Concrete Uniform Type Identifiers Abstract item public.data public.plain-text public.image Concrete data public.utf8-plain-text public.png

Use Concrete Uniform Type Identifiers Abstract item public.data public.plain-text public.image Concrete data public.utf8-plain-text public.png Private type identifier com.yourcompany.vector-drawing

Model Classes

NSItemProviderReading, -Writing Protocols

NSItemProviderReading, -Writing Protocols NSItemProviderWriting exports data from model object

NSItemProviderReading, -Writing Protocols NSItemProviderWriting exports data from model object NSItemProviderReading creates model object from data

NSItemProviderReading, -Writing Protocols NSItemProviderWriting exports data from model object NSItemProviderReading creates model object from data Maintained with model classes, not UI code

NSItemProviderWriting Protocol

NSItemProviderWriting Protocol public protocol NSItemProviderWriting : NSObjectProtocol { public static var writabletypeidentifiersforitemprovider: [String] { get } public func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? }

NSItemProviderWriting Protocol public protocol NSItemProviderWriting : NSObjectProtocol { public static var writabletypeidentifiersforitemprovider: [String] { get } public func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? } let itemprovider = NSItemProvider(object: vectorobject)

NSItemProviderWriting Protocol public protocol NSItemProviderWriting : NSObjectProtocol { public static var writabletypeidentifiersforitemprovider: [String] { get } public func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? } let itemprovider = NSItemProvider(object: vectorobject) itemprovider.registerdatarepresentation(fortypeidentifier: "com.yourcompany.vector-drawing" ) itemprovider.registerdatarepresentation(fortypeidentifier: kuttypepdf ) itemprovider.registerdatarepresentation(fortypeidentifier: kuttypetiff ) itemprovider.registerdatarepresentation(fortypeidentifier: kuttypepng ) itemprovider.registerdatarepresentation(fortypeidentifier: kuttypejpeg )

NSItemProviderReading Protocol

NSItemProviderReading Protocol public protocol NSItemProviderReading : NSObjectProtocol { public static var readabletypeidentifiersforitemprovider: [String] { get } public init(itemproviderdata data: Data, typeidentifier: String) throws }

NSItemProviderReading Protocol public protocol NSItemProviderReading : NSObjectProtocol { public static var readabletypeidentifiersforitemprovider: [String] { get } public init(itemproviderdata data: Data, typeidentifier: String) throws } if itemprovider.canloadobject(ofclass: VectorDrawing.self) { itemprovider.loadobject(ofclass: VectorDrawing.self) { (object, error) in //... } }

Model Classes Conform to NSItemProviderReading, Writing NSObject Drag and Drop, UIPasteConfiguration, UIPasteboard

Demo

Advanced Topics

Data Marshaling

Data Marshaling Providing As NSData itemprovider.registerdatarepresentation( ) As a file or folder itemprovider.registerfilerepresentation( fileoptions:[]) File Provider (open in place optional) itemprovider.registerfilerepresentation( fileoptions:[.openinplace])

Data Marshaling Retrieving Copy as NSData itemprovider.loaddatarepresentation( ) Copy as file or folder itemprovider.loadfilerepresentation( ) Attempt to open in place itemprovider.loadinplacefilerepresentation( ) // Falls back to file copy

Data Marshaling File NSData NSData File copy Folder NSData (zipped) File Provider File copy

Progress and Cancellation Return your own Progress

Progress and Cancellation Return your own Progress func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? { let dataloader = DataLoader() let progress = Progress(totalUnitCount: 100) var shouldcontinue = true progress.cancellationhandler = { shouldcontinue = false } dataloader.beginloading(update: { percentdone in progress.completedunitcount = percentdone return shouldcontinue }, completionhandler: completionhandler) } return progress

Progress and Cancellation Return your own Progress func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? { let dataloader = DataLoader() let progress = Progress(totalUnitCount: 100) var shouldcontinue = true progress.cancellationhandler = { shouldcontinue = false } dataloader.beginloading(update: { percentdone in progress.completedunitcount = percentdone return shouldcontinue }, completionhandler: completionhandler) } return progress

Progress and Cancellation Return your own Progress func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? { let dataloader = DataLoader() let progress = Progress(totalUnitCount: 100) var shouldcontinue = true progress.cancellationhandler = { shouldcontinue = false } dataloader.beginloading(update: { percentdone in progress.completedunitcount = percentdone return shouldcontinue }, completionhandler: completionhandler) } return progress

Progress and Cancellation Return your own Progress func loaddata(withtypeidentifier typeidentifier: String, foritemprovidercompletionhandler completionhandler: @escaping (Data?, Error?) -> Void) -> Progress? { let dataloader = DataLoader() let progress = Progress(totalUnitCount: 100) var shouldcontinue = true progress.cancellationhandler = { shouldcontinue = false } dataloader.beginloading(update: { percentdone in progress.completedunitcount = percentdone return shouldcontinue }, completionhandler: completionhandler) } return progress

Per-Representation Visibility Restrict visibility Same application Same Team Everyone Use to hide private types

Team Data teamdata property Up to 8 KB of metadata Visible to same Team Improve UI during drag

Suggested Name suggestedname property Used as file name Use when providing NSData

Preferred Presentation Size preferredpresentationsize property Use to target drop animation

File Provider App extension Allows app to be terminated URL to file in File Provider container Open in Place Building Great Document-based Apps in ios 11 Hall 2 Thursday 1:50PM File Provider Enhancements Hall 3 Friday 11:00AM

Demo

Summary NSItemProvider Multiple representations Asynchronous Progress, cancellable NSItemProviderReading and Writing Visibility and Team Data File Provider, Open in Place

More Information https://developer.apple.com/wwdc17/227

Related Sessions Introducing Drag and Drop Hall 3 Tuesday 11:20AM Mastering Drag and Drop Exec Ballroom Wednesday 11:00AM Drag and Drop with Collection and Table View Hall 2 Thursday 9:00AM Building Great Document-based Apps in ios 11 Hall 2 Thursday 1:50PM File Provider Enhancements Hall 3 Friday 11:00AM

Labs Cocoa Touch and Haptics Lab Technology Lab C Fri 12:00PM 1:10PM