60
iOS Extension Prince

iOS 8 extension

Embed Size (px)

DESCRIPTION

iOS 8 extension CocoaHeads Taipei 2014/11/13

Citation preview

Page 1: iOS 8 extension

iOS Extension

Prince

Page 2: iOS 8 extension

⺩王品⼠士 (Prince)@wpsteak

github , linkedin

Page 3: iOS 8 extension

• App Extensions

• Today Widget & Demo

Page 4: iOS 8 extension

2007

Page 5: iOS 8 extension
Page 6: iOS 8 extension

App

Page 7: iOS 8 extension

App

Folder

Badge

Page 8: iOS 8 extension

Scenario 1

Page 9: iOS 8 extension

Edit a photo

Photo Home Find App Wait App Open

Find PhotoEdit Photo

Page 10: iOS 8 extension

Edit a photo

Photo Select App Edit Photo

Photo Editing Extension

Page 11: iOS 8 extension

Scenario 2

Page 12: iOS 8 extension

See scores from your favorite team

Home Find App Wait App Open

wait for loading

Auto uploadRate meCacheSync

8:1

Page 13: iOS 8 extension

See scores from your favorite team

Home

8:1

Today Extension

Widget

Page 14: iOS 8 extension

How an App Extension Works

Page 15: iOS 8 extension

Open URL

Shared Resources

Appextension

Hostapp

Containingapp

Request

Response

Page 16: iOS 8 extension

Appextension

Hostapp

Containingapp

Page 17: iOS 8 extension

Host app• An app that a user employs to choose an app

extension is called a host app

Hostapp

Today.app

Today

Chrome.app

Share/Action

Dropbox.app

Document Provider

Photo.app

Photo Editing

Page 18: iOS 8 extension

• an app that contains one or more extensions is called a containing app

Containing app

Containingapp

extension extension extension

Page 19: iOS 8 extension

• an app that contains one or more extensions is called a containing app

Containing app

Page 20: iOS 8 extension

App extension• an app extension lets you extend custom

functionality and content beyond

Appextension

Page 21: iOS 8 extension

App extension• an app extension lets you extend custom

functionality and content beyond

Page 22: iOS 8 extension

Today Extension

Page 23: iOS 8 extension

Today Extension

Page 24: iOS 8 extension

Today Extension

Page 25: iOS 8 extension

Today Extension

Page 26: iOS 8 extension

Today Extension

Page 27: iOS 8 extension

Dropbox TodayView Today.app

How an App Extension Communicates

Page 28: iOS 8 extension

Dropbox TodayView Today.app

Database

How an App Extension Communicates

Page 29: iOS 8 extension

Dropbox.app Dropbox TodayView Today.app

Open URL

Database

How an App Extension Communicates

Page 30: iOS 8 extension

Open URL

Shared Resources

Appextension

Hostapp

Containingapp

How an App Extension Communicates

Page 31: iOS 8 extension

Share Extension

Page 32: iOS 8 extension

Share Extension

Page 33: iOS 8 extension

Share Extension

Page 34: iOS 8 extension

Share Extension

Page 35: iOS 8 extension

Share Extension

Page 36: iOS 8 extension

Appextension

Hostapp

Containingapp

Pocket AddToPocket Chrome

Server

Page 37: iOS 8 extension

Appextension

Hostapp

AddToPocket Chrome

Page 38: iOS 8 extension

Accessed via Apple frameworks code

Appextension

Hostapp

System Framework

Page 39: iOS 8 extension

Appextension

Hostapp

AddToPocket Chrome

UIActivityViewControllerSLComposeServiceViewController

Accessed via Apple frameworks code

Page 40: iOS 8 extension

Extension Type Host App host app use

Today Today.app NotificationCenter.framework

Share any app UIActivityViewController

Action any app UIActivityViewController

Photo Editing Photo.app PhotosUI.frameworkPhotos.framework

Document Provider any app UIDocumentPickerViewController

Custom Keyboard any app

Hostapp

Page 41: iOS 8 extension

Extension Type Enter point

Today UIViewController <NCWidgetProviding>

Share SLComposeServiceViewController

Action SLComposeServiceViewController UI and non-UI variants

Photo Editing UIViewController <PHContentEditingController>

Document Provider UIDocumentPickerViewController UI and non-UI variants

Custom Keyboard UIInputViewController

Appextension

Page 42: iOS 8 extension

Appextension

Hostapp

Containingapp

Pocket AddToPocket Chrome

Server

Page 43: iOS 8 extension

Appextension

Containingapp

Pocket AddToPocket

Different process

• Isolated address space

• Executes independently

• System optimizes separately

Run Separately

Page 44: iOS 8 extension

Appextension

Containingapp

Shared Resources

Share Resource

App Group

• UserDefault

• FileManager

Page 45: iOS 8 extension

Share Resource

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@“group.domain"];

NSURL *directory = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.domain"];

Page 46: iOS 8 extension

Appextension

Containingapp

Pocket AddToPocket

ServerServer

• Same data model

• Same logic

• Same views

Share Code

Page 47: iOS 8 extension

Appextension

Containingapp

Pocket AddToPocket

ServerServer

• Framework

• Static library

Share Code

Page 48: iOS 8 extension

Share Code

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.domain"]; NSString *sorPath = [NSString stringWithFormat:@"%@/Dylib.framework",[[NSBundle mainBundle] bundlePath]]; NSString *desPath = [NSString stringWithFormat:@“%@/Library/Caches/Dylib.framework",containerURL.path];

BOOL copyResult = [[NSFileManager defaultManager] copyItemAtPath: sorPath toPath:desPath error:&err];

Page 49: iOS 8 extension

• Containing app is still most important

• Extension cannot without containing app

• Don't have full use of system resources

• Make it seamless

• Make it useful

Page 50: iOS 8 extension

Demo

Page 51: iOS 8 extension

Demo

• a light bulb

• sample code

• Wifi Environment

Page 52: iOS 8 extension

App Extension

• Create an app extension by adding a new target to an app

• Add necessary libraries to extension target

• ViewController

Page 53: iOS 8 extension

Load View

• with storyboard

• NSExtensionMainStoryboard

• without interface file

• NSExtensionPrincipalClass

Page 54: iOS 8 extension

viewController’s life cycle• initWithCoder:

• viewDidLoad

• widgetMarginInsetsForProposedMarginInsets:

• widgetPerformUpdateWithCompletionHandler:

• viewWillAppear:

• viewDidAppear:

Page 55: iOS 8 extension

• widgetMarginInsetsForProposedMarginInsets

Page 56: iOS 8 extension

User Interface

• UIView

• UIButton

• UILabel

• UITextField

• UIScrollView

Page 57: iOS 8 extension

Some APIs are Unavailable to App Extensions

• Access a sharedApplication object

• Use any API marked in header files with the NS_EXTENSION_UNAVAILABLE macro, or similar unavailability macro, or any API in an unavailable framework

• Access the camera or microphone on an iOS device

• Perform long-running background tasks

• The specifics of this limitation vary by platform, as described in the extension point chapters in this document.

• (An app extension can initiate uploads or downloads using an NSURLSession object, with results of those operations reported to the containing app.)

• Receive data using AirDrop

• (An app extension can send data using AirDrop in the same way an app does: by employing the UIActivityViewController class.)

Page 58: iOS 8 extension

App Store• NOTE ABOUT 64-BIT ARCHITECTURE

• An app extension target must include the arm64 (iOS) or x86_64 architecture (OS X) in its Architectures build settings or it will be rejected by the App Store. Xcode includes the appropriate 64-bit architecture with its “Standard architectures” setting when you create a new app extension target.

• If your containing app target links to an embedded framework, the app must also include 64-bit architecture or it will be rejected by the App Store.

Page 59: iOS 8 extension

App Store

Page 60: iOS 8 extension

End