iOS 8 extension

Preview:

DESCRIPTION

iOS 8 extension CocoaHeads Taipei 2014/11/13

Citation preview

iOS Extension

Prince

⺩王品⼠士 (Prince)@wpsteak

github , linkedin

• App Extensions

• Today Widget & Demo

2007

App

App

Folder

Badge

Scenario 1

Edit a photo

Photo Home Find App Wait App Open

Find PhotoEdit Photo

Edit a photo

Photo Select App Edit Photo

Photo Editing Extension

Scenario 2

See scores from your favorite team

Home Find App Wait App Open

wait for loading

Auto uploadRate meCacheSync

8:1

See scores from your favorite team

Home

8:1

Today Extension

Widget

How an App Extension Works

Open URL

Shared Resources

Appextension

Hostapp

Containingapp

Request

Response

Appextension

Hostapp

Containingapp

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

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

Containing app

Containingapp

extension extension extension

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

Containing app

App extension• an app extension lets you extend custom

functionality and content beyond

Appextension

App extension• an app extension lets you extend custom

functionality and content beyond

Today Extension

Today Extension

Today Extension

Today Extension

Today Extension

Dropbox TodayView Today.app

How an App Extension Communicates

Dropbox TodayView Today.app

Database

How an App Extension Communicates

Dropbox.app Dropbox TodayView Today.app

Open URL

Database

How an App Extension Communicates

Open URL

Shared Resources

Appextension

Hostapp

Containingapp

How an App Extension Communicates

Share Extension

Share Extension

Share Extension

Share Extension

Share Extension

Appextension

Hostapp

Containingapp

Pocket AddToPocket Chrome

Server

Appextension

Hostapp

AddToPocket Chrome

Accessed via Apple frameworks code

Appextension

Hostapp

System Framework

Appextension

Hostapp

AddToPocket Chrome

UIActivityViewControllerSLComposeServiceViewController

Accessed via Apple frameworks code

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

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

Appextension

Hostapp

Containingapp

Pocket AddToPocket Chrome

Server

Appextension

Containingapp

Pocket AddToPocket

Different process

• Isolated address space

• Executes independently

• System optimizes separately

Run Separately

Appextension

Containingapp

Shared Resources

Share Resource

App Group

• UserDefault

• FileManager

Share Resource

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

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

Appextension

Containingapp

Pocket AddToPocket

ServerServer

• Same data model

• Same logic

• Same views

Share Code

Appextension

Containingapp

Pocket AddToPocket

ServerServer

• Framework

• Static library

Share Code

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];

• 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

Demo

Demo

• a light bulb

• sample code

• Wifi Environment

App Extension

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

• Add necessary libraries to extension target

• ViewController

Load View

• with storyboard

• NSExtensionMainStoryboard

• without interface file

• NSExtensionPrincipalClass

viewController’s life cycle• initWithCoder:

• viewDidLoad

• widgetMarginInsetsForProposedMarginInsets:

• widgetPerformUpdateWithCompletionHandler:

• viewWillAppear:

• viewDidAppear:

• widgetMarginInsetsForProposedMarginInsets

User Interface

• UIView

• UIButton

• UILabel

• UITextField

• UIScrollView

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.)

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.

App Store

End