extending your app with safari app extensions...app frameworks #wwdc16 session 214 extending your...

98
© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari Engineer Zach Li Safari Engineer

Upload: others

Post on 28-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

App Frameworks #WWDC16

Session 214

Extending your Appwith Safari App Extensions

Brian Weinstein Safari EngineerDamian Kaleta Safari EngineerZach Li Safari Engineer

Page 2: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

CapabilitiesSafari App Extensions

Customize web pages

NEW

Page 3: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

CapabilitiesSafari App Extensions

Customize web pagesBlock loading of resources or elements

NEW

Page 4: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

CapabilitiesSafari App Extensions

Customize web pagesBlock loading of resources or elements Add toolbar buttons

NEW

Page 5: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

CapabilitiesSafari App Extensions

Customize web pagesBlock loading of resources or elements Add toolbar buttonsDisplay popovers

NEW

Page 6: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

CapabilitiesSafari App Extensions

Customize web pagesBlock loading of resources or elements Add toolbar buttonsDisplay popoversAdd items to context menus on webpages

NEW

Page 7: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Benefits - Built Using App ExtensionsSafari App Extensions

Developed using Xcode

Page 8: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Benefits - Built Using App ExtensionsSafari App Extensions

Developed using XcodeRun native code

Page 9: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Benefits - Distributed with your appSafari App Extensions

Sold through the Mac App Store

Page 10: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Benefits - Distributed with your appSafari App Extensions

Sold through the Mac App StoreSame version as your app

Page 11: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Page 12: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content Blockers

Page 13: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native code

Page 14: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 15: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 16: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Blockers

Zach Li Safari Engineer

Page 17: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

and many more…

17

Page 18: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Bring an iOS content blocker to macOSContent Blockers

Page 19: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Bring an iOS content blocker to macOSContent Blockers

Safari Extensibility: Content Blocking and Shared Links WWDC 2015

Page 20: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 21: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Dessert BlockerDemo

Page 22: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Blockers

Page 23: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

New APIContent Blockers

Page 24: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// SFContentBlockerManager

public class SFContentBlockerManager : NSObject { public class func getStateOfContentBlocker(identifier identifier: String,

completionHandler: (SFContentBlockerState?, NSError?) -> Void)

}

// SFContentBlockerState

public class SFContentBlockerState : NSObject {

public var isEnabled: Bool { get }

}

NEW

Page 25: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// SFContentBlockerManager

public class SFContentBlockerManager : NSObject { public class func getStateOfContentBlocker(identifier identifier: String,

completionHandler: (SFContentBlockerState?, NSError?) -> Void)

}

// SFContentBlockerState

public class SFContentBlockerState : NSObject {

public var isEnabled: Bool { get }

}

NEW

Page 26: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

SFSafariServicesAvailable()NEWCheck Safari Services APIs Availability

Safari Services APIs will be available on:• macOS Sierra• OS X El Capitan with Safari 10 installed

Page 27: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

SFSafariServicesAvailable()NEWCheck Safari Services APIs Availability

Safari Services APIs will be available on:• macOS Sierra• OS X El Capitan with Safari 10 installed import SafariServices

if SFSafariServicesAvailable() {

SFContentBlockerManager.getStateOfContentBlocker(identifier:

"com.apple.DessertBlocker.DessertBlockerExtension", completionHandler: {

(state, error) in

// Check `state` to find if the content blocker is enabled.

})

} else {

// The API is not available, have a fallback behavior.

}

Page 28: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

SFSafariServicesAvailable()NEWCheck Safari Services APIs Availability

Safari Services APIs will be available on:• macOS Sierra• OS X El Capitan with Safari 10 installed import SafariServices

if SFSafariServicesAvailable() {

SFContentBlockerManager.getStateOfContentBlocker(identifier:

"com.apple.DessertBlocker.DessertBlockerExtension", completionHandler: {

(state, error) in

// Check `state` to find if the content blocker is enabled.

})

} else {

// The API is not available, have a fallback behavior.

}

Page 29: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

SFSafariServicesAvailable()NEWCheck Safari Services APIs Availability

Safari Services APIs will be available on:• macOS Sierra• OS X El Capitan with Safari 10 installed import SafariServices

if SFSafariServicesAvailable() {

SFContentBlockerManager.getStateOfContentBlocker(identifier:

"com.apple.DessertBlocker.DessertBlockerExtension", completionHandler: {

(state, error) in

// Check `state` to find if the content blocker is enabled.

})

} else {

// The API is not available, have a fallback behavior.

}

Page 30: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

SFSafariServicesAvailable()NEWCheck Safari Services APIs Availability

Safari Services APIs will be available on:• macOS Sierra• OS X El Capitan with Safari 10 installed import SafariServices

if SFSafariServicesAvailable() {

SFContentBlockerManager.getStateOfContentBlocker(identifier:

"com.apple.DessertBlocker.DessertBlockerExtension", completionHandler: {

(state, error) in

// Check `state` to find if the content blocker is enabled.

})

} else {

// The API is not available, have a fallback behavior.

}

Page 31: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 32: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 33: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a style sheet - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariStyleSheet</key>

<array>

<dict>

<key>Style Sheet</key>

<string>style.css</string>

</dict>

</array>

</dict>

Page 34: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a style sheet - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariStyleSheet</key>

<array>

<dict>

<key>Style Sheet</key>

<string>style.css</string>

</dict>

</array>

</dict>

Page 35: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a style sheet - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariStyleSheet</key>

<array>

<dict>

<key>Style Sheet</key>

<string>style.css</string>

</dict>

</array>

</dict>

Page 36: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a style sheet - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariStyleSheet</key>

<array>

<dict>

<key>Style Sheet</key>

<string>style.css</string>

</dict>

</array>

</dict>

Page 37: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a content script - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariContentScript</key>

<array>

<dict>

<key>Script</key>

<string>replace.js</string>

</dict>

</array>

</dict>

Page 38: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a content script - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariContentScript</key>

<array>

<dict>

<key>Script</key>

<string>replace.js</string>

</dict>

</array>

</dict>

Page 39: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a content script - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariContentScript</key>

<array>

<dict>

<key>Script</key>

<string>replace.js</string>

</dict>

</array>

</dict>

Page 40: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Adding a content script - Info.plist

<key>NSExtension</key>

<dict>

<key>SFSafariContentScript</key>

<array>

<dict>

<key>Script</key>

<string>replace.js</string>

</dict>

</array>

</dict>

Page 41: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Script ArchitecturePage Modification

Content ScriptExtension Process

SafariExtension Bundle www.apple.com

Page 42: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Script ArchitecturePage Modification

safari.extension.dispatchMessage(“GetWordsAndReplacements");

Content ScriptExtension Process

SafariExtension Bundle www.apple.com

Page 43: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Receiving a message from a content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 44: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Receiving a message from a content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 45: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Receiving a message from a content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 46: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Receiving a message from a content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 47: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Sending a message back to the content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 48: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Sending a message back to the content script

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

override func messageReceived(withName messageName: String,

from page: SFSafariPage, userInfo: [NSObject : AnyObject]!) {

if (messageName == "GetWordsAndReplacements") {

page.dispatchMessageToScript(withName: "WordsAndReplacements",

userInfo: ["Bear": "🐻"]);

}

}

}

Page 49: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Script ArchitecturePage Modification

Content ScriptExtension Process

SafariExtension Bundle www.apple.com

Page 50: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Content Script ArchitecturePage Modification

Content ScriptExtension Process

SafariExtension Bundle www.apple.com

page.dispatchMessageToScript(withName: "WordsAndReplacements", userInfo: ["Bear": "🐻"]);

Page 51: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 52: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 53: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 54: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 55: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 56: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Listening for messages inside a content script

safari.self.addEventListener("message", messageHandler);

function messageHandler(event)

{

if (event.name === "WordsAndReplacements") {

var wordReplacementMap = event.message;

for (var wordToReplace in wordReplacementMap) {

replace(document.body, wordToReplace, wordReplacementMap[wordToReplace]);

}

}

}

Page 57: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Website Access LevelSafari App Extensions

Page 58: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Website Access LevelSafari App Extensions

<key>NSExtension</key>

<dict>

<key>SFSafariWebsiteAccess</key>

<dict>

<key>Level</key>

<string>All</string>

</dict>

</dict>

Page 59: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Website Access LevelSafari App Extensions

<key>NSExtension</key>

<dict>

<key>SFSafariWebsiteAccess</key>

<dict>

<key>Level</key>

<string>Some</string>

<key>Allowed Domains</key>

<array>

<string>*.apple.com</string>

<string>*.webkit.org</string>

</array>

</dict>

</dict>

Page 60: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Demo

Page 61: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 62: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 63: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Extending Safari's UI

Damian Kaleta Safari Engineer

Page 64: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 65: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 66: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 67: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 68: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 69: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 70: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Toolbar Button

Page 71: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 72: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition

// Toolbar Button

<key>NSExtension</key>

<dict>

<key>SFSafariToolbarItem</key>

<dict>

<key>Identifier</key>

<string>NotebookToolbarItem</string>

<key>Label</key>

<string>Show Snippets</string>

<key>Image</key>

<string>ToolbarItemIcon.pdf</string>

<key>Action</key>

<string>Command</string>

</dict>

</dict>

Page 73: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition

// Toolbar Button

<key>NSExtension</key>

<dict>

<key>SFSafariToolbarItem</key>

<dict>

<key>Identifier</key>

<string>NotebookToolbarItem</string>

<key>Label</key>

<string>Show Snippets</string>

<key>Image</key>

<string>ToolbarItemIcon.pdf</string>

<key>Action</key>

<string>Command</string>

</dict>

</dict>

Page 74: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition

// Toolbar Button

<key>NSExtension</key>

<dict>

<key>SFSafariToolbarItem</key>

<dict>

<key>Identifier</key>

<string>NotebookToolbarItem</string>

<key>Label</key>

<string>Show Snippets</string>

<key>Image</key>

<string>ToolbarItemIcon.pdf</string>

<key>Action</key>

<string>Command</string>

</dict>

</dict>

Page 75: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

All methods should be defined on SFSafariExtensionHandler

APIs

optional public func toolbarItemClicked(in window: SFSafariWindow)

optional public func validateToolbarItem(in window: SFSafariWindow,

validationHandler: (enabled: Bool, badgeText: String) -> Swift.Void)

Toolbar Button

Page 76: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 77: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

ArchitecturePopover

Extension Safari

Remote View

SFSafariExtensionHandler

popoverViewController

Page 78: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition

// Popover

<key>NSExtension</key>

<dict>

<key>SFSafariToolbarItem</key>

<dict>

<key>Identifier</key>

<string>NotebookToolbarItem</string>

<key>Label</key>

<string>Show Snippets</string>

<key>Image</key>

<string>ToolbarItemIcon.pdf</string>

<key>Action</key>

<string>Popover</string>

</dict>

</dict>

Page 79: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition

// Popover

<key>NSExtension</key>

<dict>

<key>SFSafariToolbarItem</key>

<dict>

<key>Identifier</key>

<string>NotebookToolbarItem</string>

<key>Label</key>

<string>Show Snippets</string>

<key>Image</key>

<string>ToolbarItemIcon.pdf</string>

<key>Action</key>

<string>Popover</string>

</dict>

</dict>

Page 80: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

All methods should be defined on SFSafariExtensionHandler

APIs

optional public func popoverWillShow(in window: SFSafariWindow)

optional public func popoverDidClose(in window: SFSafariWindow)

optional public func popoverViewController() -> SFSafariExtensionViewController

Popover

Page 81: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Context Menu Items

Page 82: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari
Page 83: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition// Context Menu Items

<key>NSExtension</key>

<dict>

<key>SFSafariContextMenu</key>

<array>

<dict>

<key>Text</key>

<string>Add Snippet to Notebook</string>

<key>Command</key>

<string>Add</string>

</dict>

</array>

</dict>

Page 84: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition// Context Menu Items

<key>NSExtension</key>

<dict>

<key>SFSafariContextMenu</key>

<array>

<dict>

<key>Text</key>

<string>Add Snippet to Notebook</string>

<key>Command</key>

<string>Add</string>

</dict>

</array>

</dict>

Page 85: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

// Definition// Context Menu Items

<key>NSExtension</key>

<dict>

<key>SFSafariContextMenu</key>

<array>

<dict>

<key>Text</key>

<string>Add Snippet to Notebook</string>

<key>Command</key>

<string>Add</string>

</dict>

</array>

</dict>

Page 86: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

All methods are defined on SFSafariExtensionHandler

optional public func contextMenuItemSelected(withCommand command: String,

in page: SFSafariPage, userInfo: [NSObject : AnyObject]? = [:])

APIsContext Menu Items

Page 87: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Setting Context Menu User InfoContext Menu Items

document.addEventListener("contextmenu", handleContextMenu, false);

function handleContextMenu(event)

{

var selectedText = window.getSelection().toString();

safari.extension.setContextMenuEventUserInfo(event,

{ "selectedText": selectedText });

}

Page 88: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Extend Safari’s UIDemo

Page 89: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 90: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 91: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 92: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

TypesSafari App Extensions

Content BlockersPage modification and communication with native codeExtending Safari’s UI

Page 93: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Summary

Based on App Extensions

Page 94: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Summary

Based on App ExtensionsDistributed with your Mac app

Page 95: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

More Information

https://developer.apple.com/wwdc16/214

Page 96: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Related Sessions

Creating Extensions for iOS and OS X, Part 1 WWDC 2014

Creating Extensions for iOS and OS X, Part 2 WWDC 2014

App Extension Best Practices WWDC 2015

Page 97: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari

Labs

Safari and WebKit Lab Fort Mason Wednesday 4:30PM

Safari and WebKit Lab Frameworks Lab C Friday 4:30PM

Page 98: Extending your App with Safari App Extensions...App Frameworks #WWDC16 Session 214 Extending your App with Safari App Extensions Brian Weinstein Safari Engineer Damian Kaleta Safari