Top Banner
© 2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. #WWDC14 JavaScript for Automation Session 306 Sal Soghoian Product Manger Automation Technologies Services
204
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 306 Javascript for Automation

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

#WWDC14

JavaScript for Automation

Session 306 Sal Soghoian Product Manger Automation Technologies

Services

Page 2: 306 Javascript for Automation
Page 3: 306 Javascript for Automation

Automation in Mavericks

Notifications

Code signing

use statements

Script libraries

Speakable workflows

Page 4: 306 Javascript for Automation

Automation in Yosemite

Code-signed workflows

Enhanced script libraries

Script progress indicators

Dictation commands

Page 5: 306 Javascript for Automation

JavaScript for Automation

Page 6: 306 Javascript for Automation

Script Editor

Page 7: 306 Javascript for Automation
Page 8: 306 Javascript for Automation

Slider

Page 9: 306 Javascript for Automation

Script

Slider

Page 10: 306 Javascript for Automation

Script

Event Log

Slider

Page 11: 306 Javascript for Automation
Page 12: 306 Javascript for Automation

Compile

Page 13: 306 Javascript for Automation

Run

Page 14: 306 Javascript for Automation

Stop

Page 15: 306 Javascript for Automation

Language

Page 16: 306 Javascript for Automation
Page 17: 306 Javascript for Automation

AppleScript

Page 18: 306 Javascript for Automation

JavaScript

Page 19: 306 Javascript for Automation

Language

Page 20: 306 Javascript for Automation
Page 21: 306 Javascript for Automation

Keynote = Application('Keynote')

documents = Keynote.documents

progress = $.NSProgress.currentProgressprogress.totalUnitCount = documents.length

destinationPath = $('~/Movies').stringByExpandingTildeInPath

for (i in documents) {document = documents[i]exportName = document.name().replace('.key','.m4v')document.export({

to: Path(destinationPath.js + '/' + exportName),as: 'QuickTime movie'

})progress.completedUnitCount = i

}

progress.completedUnitCount = documents.length

Script

Page 22: 306 Javascript for Automation

Keynote = Application('Keynote')

documents = Keynote.documents

progress = $.NSProgress.currentProgressprogress.totalUnitCount = documents.length

destinationPath = $('~/Movies').stringByExpandingTildeInPath

for (i in documents) {document = documents[i]exportName = document.name().replace('.key','.m4v')document.export({

to: Path(destinationPath.js + '/' + exportName),as: 'QuickTime movie'

})progress.completedUnitCount = i

}

progress.completedUnitCount = documents.length

// Target app "Keynote"! Application("Keynote").documents.length! ! --> 3! /* Progress: 1 of 3 */! Application("Keynote").documents[0].name()! ! --> “New Product Design.key"! Application("Keynote").export([object ObjectSpecifier], {to:[object ObjectSpecifier], as:'QuickTime movie’})! /* Progress: 33% completed */

Event Log

Script

Progress Indicator

Page 23: 306 Javascript for Automation

Keynote = Application('Keynote') !documents = Keynote.documents !progress = $.NSProgress.currentProgress progress.totalUnitCount = documents.length !destinationPath = $('~/Movies').stringByExpandingTildeInPath !for (i in documents) { document = documents[i] exportName = document.name().replace('.key','.m4v') document.export({ to: Path(destinationPath.js + '/' + exportName), as: 'QuickTime movie' }) progress.completedUnitCount = i } !progress.completedUnitCount = documents.length!

Event Log

Script

Progress Indicator

Page 24: 306 Javascript for Automation

Keynote = Application('Keynote') !documents = Keynote.documents !progress = $.NSProgress.currentProgress progress.totalUnitCount = documents.length !destinationPath = $('~/Movies').stringByExpandingTildeInPath !for (i in documents) { document = documents[i] exportName = document.name().replace('.key','.m4v') document.export({ to: Path(destinationPath.js + '/' + exportName), as: 'QuickTime movie' }) progress.completedUnitCount = i } !progress.completedUnitCount = documents.length!

! Application("Keynote").documents[1].name()! ! --> “Wind Power.key”! /* Progress: 2 of 3 */! Application("Keynote").export([object ObjectSpecifier], {to:[object ObjectSpecifier], as:'QuickTime movie'})! /* Progress: 66% completed */

Event Log

Script

Progress Indicator

Page 25: 306 Javascript for Automation

Keynote = Application('Keynote') !documents = Keynote.documents !progress = $.NSProgress.currentProgress progress.totalUnitCount = documents.length !destinationPath = $('~/Movies').stringByExpandingTildeInPath !for (i in documents) { document = documents[i] exportName = document.name().replace('.key','.m4v') document.export({ to: Path(destinationPath.js + '/' + exportName), as: 'QuickTime movie' }) progress.completedUnitCount = i } !progress.completedUnitCount = documents.length!

Event Log

Script

Progress Indicator

Page 26: 306 Javascript for Automation

Keynote = Application('Keynote') !documents = Keynote.documents !progress = $.NSProgress.currentProgress progress.totalUnitCount = documents.length !destinationPath = $('~/Movies').stringByExpandingTildeInPath !for (i in documents) { document = documents[i] exportName = document.name().replace('.key','.m4v') document.export({ to: Path(destinationPath.js + '/' + exportName), as: 'QuickTime movie' }) progress.completedUnitCount = i } !progress.completedUnitCount = documents.length!

! Application("Keynote").documents[2].name()! ! --> "Community Projects.key"! Application("Keynote").export([object ObjectSpecifier], {to:[object ObjectSpecifier], as:'QuickTime movie'})! /* Progress: 3 of 3 */! /* Progress: 100% completed */// Stop targetingResult:3

Event Log

Script

Page 27: 306 Javascript for Automation
Page 28: 306 Javascript for Automation
Page 29: 306 Javascript for Automation
Page 30: 306 Javascript for Automation

General Settings

Page 31: 306 Javascript for Automation

Default Language

Page 32: 306 Javascript for Automation

AppleScript

Page 33: 306 Javascript for Automation

JavaScript

Page 34: 306 Javascript for Automation
Page 35: 306 Javascript for Automation

Script Menu

Page 36: 306 Javascript for Automation

Script Menu

Script Menu

Page 37: 306 Javascript for Automation

Formatting

Page 38: 306 Javascript for Automation

Formatting

Page 39: 306 Javascript for Automation
Page 40: 306 Javascript for Automation
Page 41: 306 Javascript for Automation
Page 42: 306 Javascript for Automation

Language

Page 43: 306 Javascript for Automation

Language

Page 44: 306 Javascript for Automation

LanguageAppleScript

Page 45: 306 Javascript for Automation

LanguageAppleScript

JavaScript

Page 46: 306 Javascript for Automation

LanguageAppleScript

JavaScriptObjective-C

Page 47: 306 Javascript for Automation
Page 48: 306 Javascript for Automation

Model Viewer

Page 49: 306 Javascript for Automation

Suite

Page 50: 306 Javascript for Automation

Suite

Methods

Page 51: 306 Javascript for Automation

Suite

Class

Methods

Page 52: 306 Javascript for Automation

Suite

Class

ElementsMethods

Page 53: 306 Javascript for Automation

Suite

Class

Properties

ElementsMethods

Page 54: 306 Javascript for Automation

Definition Viewer

Page 55: 306 Javascript for Automation

Class

Properties

Elements

Methods

Page 56: 306 Javascript for Automation
Page 57: 306 Javascript for Automation

Script Editor

Page 58: 306 Javascript for Automation

JavaScript for Automation

David Steinberg Automation Engineer

Page 59: 306 Javascript for Automation

JavaScript for Automation

Application scripting

Libraries and applets

UI scripting

Using system APIs

Page 60: 306 Javascript for Automation

Automation

Page 61: 306 Javascript for Automation

AutomationAutomate tasks

Page 62: 306 Javascript for Automation

AutomationAutomate tasks

Page 63: 306 Javascript for Automation

AutomationInteract with applications

Page 64: 306 Javascript for Automation

+ + +

AutomationInteract with applications

Page 65: 306 Javascript for Automation

Demo

Page 66: 306 Javascript for Automation

Automation

Page 67: 306 Javascript for Automation

Cocoa Scripting

Automation

Page 68: 306 Javascript for Automation

Cocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

Automation

!

!

!

!

Object Model

Page 69: 306 Javascript for Automation

Cocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Automation

Page 70: 306 Javascript for Automation

Apple EventsCocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Automation

Page 71: 306 Javascript for Automation

Apple EventsCocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Automation

Page 72: 306 Javascript for Automation

Apple Events

AppleScript Objective-C

Python

Ruby

Perl

Cocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Automation

Page 73: 306 Javascript for Automation

AutomationObject model

Page 74: 306 Javascript for Automation

AutomationObject model

Page 75: 306 Javascript for Automation

application

application "Mail"

AutomationObject model

Page 76: 306 Javascript for Automation

application

inbox

application "Mail"inbox of

AutomationObject model

Page 77: 306 Javascript for Automation

application

inbox

messages

application "Mail"inbox of

AutomationObject model

Page 78: 306 Javascript for Automation

application

inbox

messages

message 1 message 2. . .

application "Mail"inbox ofmessage 2 of

AutomationObject model

Page 79: 306 Javascript for Automation

JavaScript

Page 80: 306 Javascript for Automation

JavaScript and Automation

Page 81: 306 Javascript for Automation

JavaScript and Automation

Cocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Apple Events

Page 82: 306 Javascript for Automation

JavaScript and Automation

Cocoa Scripting

!

!

!

!

Object Model

!

!

!

!

Object Model

!

!

!

!

Object Model

Apple EventsJavaScript

CoreJavaScript AE Bridge

Page 83: 306 Javascript for Automation

Application Scripting

Page 84: 306 Javascript for Automation

Application ScriptingApplication object

Page 85: 306 Javascript for Automation

Name: Application('Safari')

Application ScriptingApplication object

Page 86: 306 Javascript for Automation

Name: Application('Safari')

Bundle ID: Application('com.apple.mail')

Application ScriptingApplication object

Page 87: 306 Javascript for Automation

Name: Application('Safari')

Bundle ID: Application('com.apple.mail')

Path: Application('/Applications/TextEdit.app')

Application ScriptingApplication object

Page 88: 306 Javascript for Automation

Name: Application('Safari')

Bundle ID: Application('com.apple.mail')

Path: Application('/Applications/TextEdit.app')

Process ID: Application(763)

Application ScriptingApplication object

Page 89: 306 Javascript for Automation

Name: Application('Safari')

Bundle ID: Application('com.apple.mail')

Path: Application('/Applications/TextEdit.app')

Process ID: Application(763)

Current Application: Application.currentApplication()

Application ScriptingApplication object

Page 90: 306 Javascript for Automation

Application ScriptingSyntax

Page 91: 306 Javascript for Automation

Application ScriptingSyntax

Properties: Safari.name

Page 92: 306 Javascript for Automation

Application ScriptingSyntax

Properties: Safari.name

Elements: Safari.documents[0]

Page 93: 306 Javascript for Automation

Application ScriptingSyntax

Properties: Safari.name

Elements: Safari.documents[0]

Commands: Safari.open(...)

Page 94: 306 Javascript for Automation

Application ScriptingSyntax

Properties: Safari.name

Elements: Safari.documents[0]

Commands: Safari.open(...)

Classes: Safari.Document(...)

Page 95: 306 Javascript for Automation

Application ScriptingGetting and setting properties

Page 96: 306 Javascript for Automation

Application ScriptingGetting and setting properties

Safari = Application(‘Safari')

Page 97: 306 Javascript for Automation

Application ScriptingGetting and setting properties

Safari = Application(‘Safari')

doc = Safari.document[0]

Page 98: 306 Javascript for Automation

Application ScriptingGetting and setting properties

Safari = Application(‘Safari')

doc = Safari.document[0]

url = doc.url()

Page 99: 306 Javascript for Automation

Application ScriptingGetting and setting properties

Safari = Application(‘Safari')

doc = Safari.document[0]

url = doc.url()

doc.url = 'http://apple.com'

Page 100: 306 Javascript for Automation

Application ScriptingElement arrays

Page 101: 306 Javascript for Automation

Application ScriptingElement arrays

Safari = Application('Safari')

Page 102: 306 Javascript for Automation

Application ScriptingElement arrays

Safari = Application('Safari')

window = Safari.windows[0]

Page 103: 306 Javascript for Automation

Application ScriptingElement arrays

Safari = Application('Safari')

window = Safari.windows[0]

window = Safari.windows['Apple']

Page 104: 306 Javascript for Automation

Application ScriptingElement arrays

Safari = Application('Safari')

window = Safari.windows[0]

window = Safari.windows['Apple']

window = Safari.windows['#412']

Page 105: 306 Javascript for Automation

Demo

Page 106: 306 Javascript for Automation

Application ScriptingFiltering arrays

Page 107: 306 Javascript for Automation

Mail = Application(‘Mail')

Application ScriptingFiltering arrays

Page 108: 306 Javascript for Automation

Mail = Application(‘Mail')

jsEmails = Mail.inbox.messages.whose({subject:'JavaScript'})

Application ScriptingFiltering arrays

Page 109: 306 Javascript for Automation

Application ScriptingSending commands

Page 110: 306 Javascript for Automation

Mail = Application('Mail')

Application ScriptingSending commands

Page 111: 306 Javascript for Automation

Mail = Application('Mail')

message = Mail.inbox.messages[0]

Application ScriptingSending commands

Page 112: 306 Javascript for Automation

Mail = Application('Mail')

message = Mail.inbox.messages[0]

message.open()

Application ScriptingSending commands

Page 113: 306 Javascript for Automation

Mail = Application('Mail')

message = Mail.inbox.messages[0]

message.open()

Mail.open(message)

Application ScriptingSending commands

Page 114: 306 Javascript for Automation

Mail = Application('Mail')

message = Mail.inbox.messages[0]

message.open()

Mail.open(message)

Application ScriptingSending commands

response = message.reply({ replyAll: true, openingWindow: false })

Page 115: 306 Javascript for Automation

Application ScriptingPaths

Page 116: 306 Javascript for Automation

TextEdit = Application('TextEdit')

Application ScriptingPaths

Page 117: 306 Javascript for Automation

TextEdit = Application('TextEdit')

path = Path(‘/Users/username/Desktop/foo.rtf')

Application ScriptingPaths

Page 118: 306 Javascript for Automation

TextEdit = Application('TextEdit')

path = Path(‘/Users/username/Desktop/foo.rtf')

TextEdit.open(path)

Application ScriptingPaths

Page 119: 306 Javascript for Automation

Application ScriptingCreating objects

Page 120: 306 Javascript for Automation

TextEdit = Application(‘TextEdit')

Application ScriptingCreating objects

Page 121: 306 Javascript for Automation

TextEdit = Application(‘TextEdit')

doc = TextEdit.Document()

Application ScriptingCreating objects

Page 122: 306 Javascript for Automation

TextEdit = Application(‘TextEdit')

doc = TextEdit.Document()

TextEdit.documents.push(doc)

Application ScriptingCreating objects

Page 123: 306 Javascript for Automation

TextEdit = Application(‘TextEdit')

doc = TextEdit.Document()

TextEdit.documents.push(doc)

doc.text = 'Hello world’

Application ScriptingCreating objects

Page 124: 306 Javascript for Automation

TextEdit = Application(‘TextEdit')

doc = TextEdit.Document()

TextEdit.documents.push(doc)

doc.text = 'Hello world’

jsDoc = TextEdit.Document({text:'JavaScript for Automation'})

Application ScriptingCreating objects

TextEdit.documents.push(jsDoc)

Page 125: 306 Javascript for Automation

Application ScriptingStandard additions

Page 126: 306 Javascript for Automation

app = Application.currentApplication()

Application ScriptingStandard additions

Page 127: 306 Javascript for Automation

app = Application.currentApplication()

app.includeStandardAdditions = true

Application ScriptingStandard additions

Page 128: 306 Javascript for Automation

app = Application.currentApplication()

app.includeStandardAdditions = true

app.beep(3)

Application ScriptingStandard additions

Page 129: 306 Javascript for Automation

app = Application.currentApplication()

app.includeStandardAdditions = true

app.beep(3)

app.say('Hello world')

Application ScriptingStandard additions

Page 130: 306 Javascript for Automation

app = Application.currentApplication()

app.includeStandardAdditions = true

app.beep(3)

app.say('Hello world')

app.displayAlert('Finished task')

Application ScriptingStandard additions

Page 131: 306 Javascript for Automation

Libraries

Page 132: 306 Javascript for Automation

function log(message,format) { ... }

Libraries

Home Library Script Libraries toolbox.scpt

Page 133: 306 Javascript for Automation

function log(message,format) { ... }

Libraries

Home Library Script Libraries toolbox.scpt

toolbox = Library('toolbox') !

toolbox.log('hello world')

Page 134: 306 Javascript for Automation

Applets

Page 135: 306 Javascript for Automation

AppletsEvent handlers

Page 136: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

Page 137: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

function openDocuments(docs) { ... }

Page 138: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

function openDocuments(docs) { ... }

function printDocuments(docs) { ... }

Page 139: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

function openDocuments(docs) { ... }

function printDocuments(docs) { ... }

function idle() { ... }

Page 140: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

function openDocuments(docs) { ... }

function printDocuments(docs) { ... }

function idle() { ... }

function reopen() { ... }

Page 141: 306 Javascript for Automation

AppletsEvent handlers

function run() { ... }

function openDocuments(docs) { ... }

function printDocuments(docs) { ... }

function idle() { ... }

function reopen() { ... }

function quit() { ... }

Page 142: 306 Javascript for Automation

Demo

Page 143: 306 Javascript for Automation

UI Scripting

Page 144: 306 Javascript for Automation

UI ScriptingBuilt on accessibility

Page 145: 306 Javascript for Automation

UI ScriptingBuilt on accessibility

Page 146: 306 Javascript for Automation

UI ScriptingBuilt on accessibility

System Events

Page 147: 306 Javascript for Automation

UI ScriptingBuilt on accessibility

System Events

UI Scripting

Page 148: 306 Javascript for Automation

UI ScriptingClicking and typing

Page 149: 306 Javascript for Automation

UI ScriptingClicking and typing

SystemEvents = Application('System Events’)

Page 150: 306 Javascript for Automation

UI ScriptingClicking and typing

SystemEvents = Application('System Events’)

notesUI = SystemEvents.processes[‘Notes']

Page 151: 306 Javascript for Automation

UI ScriptingClicking and typing

SystemEvents = Application('System Events’)

notesUI = SystemEvents.processes[‘Notes']

notesUI.windows[0].buttons[0].click()

Page 152: 306 Javascript for Automation

UI ScriptingClicking and typing

SystemEvents = Application('System Events’)

notesUI = SystemEvents.processes[‘Notes']

notesUI.windows[0].buttons[0].click()

Notes = Application('Notes') Notes.activate()

Page 153: 306 Javascript for Automation

UI ScriptingClicking and typing

SystemEvents = Application('System Events’)

notesUI = SystemEvents.processes[‘Notes']

notesUI.windows[0].buttons[0].click()

Notes = Application('Notes') Notes.activate()

SystemEvents.keystroke('m', { using: 'command down' })

Page 154: 306 Javascript for Automation

Using System APIs

Page 155: 306 Javascript for Automation

Using System APIsObjC and $

Page 156: 306 Javascript for Automation

Using System APIsObjC and $

ObjC.wrap(...)

Page 157: 306 Javascript for Automation

Using System APIsObjC and $

ObjC.wrap(...)

ObjC.unwrap(...) ObjC.deepUnwrap(...)

Page 158: 306 Javascript for Automation

Using System APIsObjC and $

ObjC.wrap(...)

ObjC.unwrap(...) ObjC.deepUnwrap(...)

ObjC.import(...)

Page 159: 306 Javascript for Automation

Using System APIsObjC and $

ObjC.wrap(...)

ObjC.unwrap(...) ObjC.deepUnwrap(...)

ObjC.import(...)

$.NSString

Page 160: 306 Javascript for Automation

Using System APIsObjC and $

ObjC.wrap(...)

ObjC.unwrap(...) ObjC.deepUnwrap(...)

ObjC.import(...)

$.NSString

$('foo')

Page 161: 306 Javascript for Automation

Calling methodsUsing System APIs

Page 162: 306 Javascript for Automation

Calling methods

str = [[NSString alloc] initWithUTF8String:”bar”]; !

[str writeToFile:@"/tmp/foo" atomically:YES];

Using System APIs

Page 163: 306 Javascript for Automation

Calling methods

str = [[NSString alloc] initWithUTF8String:”bar”]; !

[str writeToFile:@"/tmp/foo" atomically:YES];

Using System APIs

str = $.NSString.alloc.initWithUTF8String(‘bar') !

str.writeToFileAtomically('/tmp/foo', true)

Page 164: 306 Javascript for Automation

Demo

Page 165: 306 Javascript for Automation

Accessing propertiesUsing System APIs

Page 166: 306 Javascript for Automation

Accessing properties

task = $.NSTask.alloc.init

Using System APIs

Page 167: 306 Javascript for Automation

Accessing properties

task = $.NSTask.alloc.init

task.running

Using System APIs

Page 168: 306 Javascript for Automation

Accessing properties

task = $.NSTask.alloc.init

task.running

task.launchPath = '/bin/sleep'

Using System APIs

Page 169: 306 Javascript for Automation

Bridged nilUsing System APIs

Page 170: 306 Javascript for Automation

Bridged nil

error = $()

Using System APIs

Page 171: 306 Javascript for Automation

Bridged nil

error = $()

Using System APIs

doc = $.NSXMLDocument.alloc.initWithXMLStringOptionsError( xmlString, undefined, error )

Page 172: 306 Javascript for Automation

Bridged nil

error = $()

Using System APIs

if (doc.isNil()) { $.NSLog(error.userInfo.description) }

doc = $.NSXMLDocument.alloc.initWithXMLStringOptionsError( xmlString, undefined, error )

Page 173: 306 Javascript for Automation

SubclassingUsing System APIs

Page 174: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({

Using System APIs

})

Page 175: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({ name: ‘AppDelegate',

Using System APIs

})

Page 176: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({ name: ‘AppDelegate', superclass: ‘NSObject’,

Using System APIs

})

Page 177: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({ name: ‘AppDelegate', superclass: ‘NSObject’, protocols: [‘NSApplicationDelegate'],

Using System APIs

})

Page 178: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({ name: ‘AppDelegate', superclass: ‘NSObject’, protocols: [‘NSApplicationDelegate'],

Using System APIs

properties: { window: 'id' },

})

Page 179: 306 Javascript for Automation

Subclassing

ObjC.registerSubclass({ name: ‘AppDelegate', superclass: ‘NSObject’, protocols: [‘NSApplicationDelegate'],

Using System APIs

properties: { window: 'id' }, methods: { 'applicationDidFinishLaunching:': { types: ['void', ['id']], implementation: function (notification) { $.NSLog('Application finished launching'); } } } })

Page 180: 306 Javascript for Automation

Demo

Page 181: 306 Javascript for Automation

Release notesUsing System APIs

Page 182: 306 Javascript for Automation

Release notes

Binding C functions

Using System APIs

Page 183: 306 Javascript for Automation

Release notes

Binding C functions

Explicit pass-by-reference

Using System APIs

Page 184: 306 Javascript for Automation

Release notes

Binding C functions

Explicit pass-by-reference

Passing functions as blocks

Using System APIs

Page 185: 306 Javascript for Automation

Where to Use It

Page 186: 306 Javascript for Automation

JavaScript for AutomationSystem-wide scripting

Page 187: 306 Javascript for Automation

Script Editor

JavaScript for AutomationSystem-wide scripting

Page 188: 306 Javascript for Automation

Script Editor

Applets/Droplets

JavaScript for AutomationSystem-wide scripting

Page 189: 306 Javascript for Automation

Script Editor

Applets/Droplets

Script Menu

JavaScript for AutomationSystem-wide scripting

Page 190: 306 Javascript for Automation

Script Editor Automator

Applets/Droplets

Script Menu

JavaScript for AutomationSystem-wide scripting

Page 191: 306 Javascript for Automation

Script Editor Automator

Applets/Droplets

Script Menu

JavaScript for AutomationSystem-wide scripting

Services

Page 192: 306 Javascript for Automation

Script Editor Automator

Applets/Droplets

Script Menu

JavaScript for AutomationSystem-wide scripting

osascript

Services

Page 193: 306 Javascript for Automation

Demo

Page 194: 306 Javascript for Automation

JavaScript for AutomationSummary

Page 195: 306 Javascript for Automation

JavaScript for AutomationSummary

Built on JavaScriptCore and OSA

Page 196: 306 Javascript for Automation

JavaScript for AutomationSummary

Built on JavaScriptCore and OSA

Integrated system-wide

Page 197: 306 Javascript for Automation

JavaScript for AutomationSummary

Built on JavaScriptCore and OSA

Integrated system-wide

Offers many options for scripting

Page 198: 306 Javascript for Automation

JavaScript for AutomationCall to action

Page 199: 306 Javascript for Automation

JavaScript for AutomationCall to action

Script applications

Page 200: 306 Javascript for Automation

JavaScript for AutomationCall to action

Script applications

Make your applications scriptable

Page 201: 306 Javascript for Automation

JavaScript for AutomationCall to action

Script applications

Make your applications scriptable

Tell others to make their applications scriptable

Page 202: 306 Javascript for Automation

More Information

[email protected]

!

Documentation JavaScript for Automation Release Notes https://developer.apple.com

Apple Developer Forums http://devforums.apple.com

Page 203: 306 Javascript for Automation

Lab

• Automation Lab Services Lab B Friday 12:45PM

Page 204: 306 Javascript for Automation