172
These are confidential sessions—please refrain from streaming, blogging, or taking pictures Part 2: Framework and Web Service API Session 309 Introducing Passbook Ken Ferry and Eliza Block Passbook Group

Session 309 - Introducing Passbook, Part 2

Embed Size (px)

DESCRIPTION

Session 309 - Introducing Passbook, Part 2

Citation preview

These are confidential sessions—please refrain from streaming, blogging, or taking pictures

Part 2: Framework and Web Service API

Session 309

Introducing Passbook

Ken Ferry and Eliza BlockPassbook Group

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

Companion AppsModifying passes

Show Installed Passes

PKPassLibrary

PKPass

Show Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

PKPassLibraryGet Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

PKPassLibraryGet Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

PKPassLibraryGet Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

PKPassLibraryGet Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

PKPassLibraryGet Installed Passes

passLibrary = [[PKPassLibrary alloc] init];

passes = [passLibrary passes];

noteCenter = [NSNotificationCenter defaultCenter];[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

alloc/init to instantiatePKPassLibrary Is Not a Singleton

[noteCenter addObserver:self selector:@selector(passLibraryDidChange) name:PKPassLibraryDidChangeNotification object:passLibrary];

•Notifications are per-library• Thread confined

An app must declare the passes it accessesEntitlements

passes = [passLibrary passes];

!<key>com.apple.developer.pass-type-identifiers</key>!<array>!! <string>pass.com.oceanic.BoardingPass</string>!</array>

Display a Pass in Table Form

Display a Pass in Table Form

Grabbing text off the passDisplay a Pass in Table Form

[pass localizedValueForFieldKey:@”monkeyProfession”]

{ "key": "monkeyProfession" "label": "PROFESSION", "value": "Butler",}

Display a Pass for Scanning

…in PassbookDisplay a Pass for Scanning

[sharedApp openURL:[tappedPass passURL]]

Don’t write an app if you don’t need oneCompanion Apps Are for Editing

•Avoid duplicating Passbook•A pass should not require an app to be useful

Modifying a Pass

PKPass isn’t mutableModifying a Pass

Your Server

PKPass isn’t mutableModifying a Pass

Your Server

request

PKPass isn’t mutableModifying a Pass

Your Server

request

.pkpass data

Identifying a pass to your serverModifying a Pass

@property NSString *passTypeIdentifier;@property NSString *serialNumber;

Incorporating a changeModifying a Pass

replacementPass = [[PKPass alloc] initWithData:data error:&error];...[passLibrary replacePassWithPass:replacementPass];

DemoUsing PassKit

Eliza Block

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

PKPassDealing with Incoming Pass Data

Recognizing the dataDealing with Incoming Pass Data

UTI

MIME Type

Extension

com.apple.pkpass

application/vnd.apple.pkpass

.pkpass

[[PKPass alloc] initWithData:data error:&error]

Instantiating PKPassDealing with Incoming Pass Data

Displaying the passDealing with Incoming Pass Data

Displaying the passDealing with Incoming Pass Data

icon

organizationName

localizedName

PKAddPassesViewControllerAdd a Pass to Passbook

addPassesVC = [[PKAddPassesViewController alloc] initWithPass:downloadedPass];

[self presentViewController:addPassesVC animated:YES completion:^{}];

Check for Pass Already Present

[passLibrary containsPass:aPass]

Passbook is not available on iPadCheck for Capability

[PKPassLibrary isPassLibraryAvailable]

PassKit

PKPassLibrary

PassKit

PKPassPKAddPassesViewController

AddAdd

ConduitApp

Companion App

Server

Ecosystem

ConduitApp

Companion App

Server

Ecosystem

Passbook from the Server Side

Eliza Block

How to opt inWeb Services

pass.json:{

...“webServiceURL” : “https://www.foo.com/passes/”,...“authenticationToken” : “PZ8GL23T24JEB41X6U”,...

}

Your Server

Apple Push Notification Service

OverviewWeb ServicesWeb Services

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

What serial numbers changed?

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

What serial numbers changed?

8ZA4P2 and 4GR3K9

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

What serial numbers changed?

8ZA4P2 and 4GR3K9

Give me 8ZA4P2

Give me 4GR3K9

Your Server

Apple Push Notification Service

Register

OverviewWeb ServicesWeb Services

What serial numbers changed?

8ZA4P2 and 4GR3K9

Give me 8ZA4P2

.pkpass data

Give me 4GR3K9

.pkpass data

Communication elementsWeb Services

• From pass.json

Communication elementsWeb Services

PassTypeID SerialNo. AuthToken

• From pass.json

• From device

Communication elementsWeb Services

PassTypeID SerialNo. AuthToken

PushTokenDeviceID

• From pass.json

• From device

• From your server

Communication elementsWeb Services

PassTypeID SerialNo. AuthToken

PushTokenDeviceID

UpdateTag

RegistrationWeb Services

Your Server

RegistrationWeb Services

PassTypeID SerialNo.

PushTokenDeviceID

Register

AuthToken Your Server

RegistrationWeb Services

PassTypeID SerialNo.PushTokenDeviceID AuthToken

Your Server

RegistrationWeb Services

PassTypeID SerialNo.PushTokenDeviceID AuthToken

Your Server

RegistrationWeb Services

PassTypeID SerialNo.PushTokenDeviceID

AuthToken

Your Server

RegistrationWeb Services

PassTypeID SerialNo.PushTokenDeviceID

Your Server

Devices

Your Server

Storage on your serverWeb Services

PassTypeID SerialNo.DeviceID PushToken

Devices

Your Server

Storage on your serverWeb Services

PassTypeID SerialNo.DeviceID PushToken

Your Server

Storage on your serverWeb Services

PassTypeID SerialNo.

Device A PushToken A

Device B PushToken B

Devices

DeviceID PushToken

Your Server

Storage on your serverWeb Services

PassTypeID SerialNo.

Device A PushToken A

Device B PushToken B

Devices

DeviceID PushToken

Storage on your serverWeb Services

PassTypeID SerialNo.

Your Server

Device A PushToken A

Device B PushToken B

Devices

PushTokenDeviceID

Storage on your serverWeb Services

PassTypeID SerialNo.

Your Server

Device A PushToken A

Device B PushToken B

Devices

PushTokenDeviceID

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device B pass.oceanic XD28

Registrations

Device A PushToken A

Device B PushToken B

Devices

PushTokenDeviceID

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device B pass.oceanic XD28

Registrations

PassTypeID SerialNo.

Device A PushToken A

Device B PushToken B

Devices

PushTokenDeviceID

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device B pass.oceanic XD28

Registrations

DeviceID

PassTypeID SerialNo.

Device A PushToken A

Device B PushToken B

Devices

PushTokenDeviceID

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device B pass.oceanic XD28

Registrations

DeviceID PassTypeID SerialNo.

Registration endpointWeb Services

Registration endpointWeb Services

• POST/v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.>

Registration endpointWeb Services

• POST/v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>

Registration endpointWeb Services

• POST/v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>

• JSON payload{ “pushToken” : <pushToken> }

Unregistration endpointWeb Services

Unregistration endpointWeb Services

•DELETE/v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.>

Unregistration endpointWeb Services

•DELETE/v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>

Device A PushToken A

Device B PushToken B

Device C PushToken C

Devices

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations Boarding Passes

JA38

EK91

XD28

CL55

Boarding Passes

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device C pass.oceanic XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device C pass.oceanic XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

Storage on your serverWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device C pass.oceanic XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

9/12, 10am

9/12, 10am

8/22, 6pm

9/1, 8pm

Storage on your serverWeb Services

Last Updated

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device C pass.oceanic XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

9/12, 10am

9/12, 10am

8/22, 6pm

9/1, 8pm

Handling a changeWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device Cpass.oceanicpass.oceanicpass.oceanicpass.oceanicpass.ocea

XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

9/12, 10am

9/12, 10am

8/22, 6pm

9/1, 8pm

Handling a changeWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device Cpass.oceanicpass.oceanicpass.oceanicpass.oceanicpass.ocea

XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

9/12, 10am

9/12, 10am

8/22, 6pm

9/1, 8pm

Handling a changeWeb Services

3ADevice A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device Cpass.oceanicpass.oceanicpass.oceanicpass.oceanicpass.ocea

XD28

JA38

EK91

XD28

CL55

Boarding Passes

Hugo Reyes 9/18, 7pm OA177 SYD PER 19C ...

Hugo Reyes 9/21, 9am OA26 PER SYD 6F ...

Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ...

Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ...

9/12, 10am

9/12, 10am

8/22, 6pm

9/1, 8pm

9/18, 5pm

Handling a changeWeb Services

3ADevice A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

Device Cpass.oceanicpass.oceanicpass.oceanicpass.oceanicpass.ocea

XD28

Handling a changeWeb Services

Device A pass.oceanic JA38

Device B pass.oceanic EK91

Device B pass.oceanic XD28

Device B pass.oceanic CL55

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

3A 9/18, 5pm

Device A PushToken A

Device B PushToken B

Device C PushToken C

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Handling a changeWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A PushToken A

Device B PushToken B

Device C PushToken C

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Handling a changeWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A PushToken A

Device B PushToken B

Device C PushToken C

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 8/22, 6pm

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 9/18, 5pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/12, 10am

Boarding Passes

Handling a changeWeb Services

Device A PushToken A

Device B PushToken B

Device C PushToken C

Devices

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 8/22, 6pm

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 9/18, 5pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/12, 10am

Boarding Passes

Handling a changeWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Device A PushToken A

Device B PushToken B

Device C PushToken C

Devices

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/1, 8pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 8/22, 6pm

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 9/18, 5pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/12, 10am

Boarding Passes

Handling a changeWeb Services

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/12, 10am

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Device A PushToken A

Device B PushToken B

Device C PushToken C

Devices

Sending a push notificationWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/12, 10am

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Device A PushToken A

Device B PushToken B

Device C PushToken C

Devices

Sending a push notificationWeb Services

Your Server

Sending a push notificationWeb Services

Your Server

Sending a push notificationWeb Services

Your Server APNSPassTypeID

PushToken

Sending a push notificationWeb Services

Your Server APNSPassTypeID

PushToken

PassTypeID

“What changed?”Web Services

PassTypeID

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

Your Server

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID

Your Server

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID

Your Server

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID UpdateTag

Your Server

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID UpdateTag

SerialNo.

Your Server

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID UpdateTag

SerialNo.UpdateTag

Your Server

Device A pass.oceanic 9/12, 10am

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

“What changed?”Web Services

PassTypeID

What serial numbers changed?

DeviceID UpdateTag

SerialNo.UpdateTag

Your Server

Device A pass.oceanic 9/12, 10am

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Figuring out what changedWeb Services

Your Server

Device A pass.oceanic 9/12, 10am

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Figuring out what changedWeb Services

Your Server

Device A pass.oceanic 9/12, 10am

Device A pass.oceanic JA38

Device A pass.oceanic EK91

Device A pass.oceanic CL55

Device B pass.oceanic XD28

Device C pass.oceanic JA38

Registrations

Figuring out what changedWeb Services

Your Server

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am

9/18, 5pm

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am JA38

Figuring out what changedWeb Services

JA38 Hugo Reyes 9/18, 7pm OA177 SYD PER 3A ... 9/18, 5pm

EK91 Hugo Reyes 9/21, 9am OA26 PER SYD 6F ... 9/12, 10am

XD28 Jack Shephard 9/22, 3pm OA815 SYD LAX 22D ... 8/22, 6pm

CL55 Hugo Reyes 9/22, 3pm OA815 SYD LAX 20G ... 9/1, 8pm

Boarding Passes

Device A pass.oceanic 9/12, 10am JA38 9/18, 5pm

DeviceID

Device A

“What changed?”Web Services

What serial numbers changed?

UpdateTag

pass.oceanic 9/12, 10am

PassTypeID

JA38 9/18, 5pm

Your Server

SerialNo.

DeviceID

Device A

“What changed?”Web Services

What serial numbers changed?

UpdateTag

pass.oceanic 9/12, 10am

PassTypeID

JA38 9/18, 5pm

Your Server

UpdateTag

SerialNo.

DeviceID

Device A

“What changed?”Web Services

What serial numbers changed?

UpdateTag

pass.oceanic 9/12, 10am

PassTypeID

JA389/18, 5pm

Your Server

UpdateTag

“What changed?” endpointWeb Services

“What changed?” endpointWeb Services

•GET/v1/devices/<deviceID>/registrations/<passTypeID>

“What changed?” endpointWeb Services

•GET/v1/devices/<deviceID>/registrations/<passTypeID>?passesUpdatedSince=<tag>

“What changed?” endpointWeb Services

•GET/v1/devices/<deviceID>/registrations/<passTypeID>

• Server responds with JSON payload{ “serialNumbers” : [ <serialNo.>, <serialNo.>, ... ], “lastUpdated” : <tag>}

?passesUpdatedSince=<tag>

“What changed?” endpointWeb Services

•GET/v1/devices/<deviceID>/registrations/<passTypeID>

• Server responds with JSON payload{ “serialNumbers” : [ <serialNo.>, <serialNo.>, ... ], “lastUpdated” : <tag>}

?passesUpdatedSince=<tag>

•GET/v1/devices/<deviceID>/registrations/<passTypeID>?passesUpdatedSince=<tag>

• Server responds with JSON payload{ “serialNumbers” : [ <serialNo.>, <serialNo.>, ... ], “lastUpdated” : <tag>}

“What changed?” endpointWeb Services

“passesUpdatedSince” vs. “if-modified-since”Web Services

“passesUpdatedSince” vs. “if-modified-since”Web Services

• “if-modified-since” applies to a single resource

“passesUpdatedSince” vs. “if-modified-since”Web Services

• “if-modified-since” applies to a single resource■ Returns either the whole resource or 304 (not modified)

“passesUpdatedSince” vs. “if-modified-since”Web Services

• “if-modified-since” applies to a single resource■ Returns either the whole resource or 304 (not modified)

• “passesUpdatedSince” applies to a collection

“passesUpdatedSince” vs. “if-modified-since”Web Services

• “if-modified-since” applies to a single resource■ Returns either the whole resource or 304 (not modified)

• “passesUpdatedSince” applies to a collection■ Picks out the individual elements that have changed

Getting up-to-date passWeb Services

Your Server

Getting up-to-date passWeb Services

Get pass

Your Server

PassTypeID SerialNo. AuthToken

Getting up-to-date passWeb Services

Get pass

Your Server

PassTypeID SerialNo. AuthToken

.pkpass

Get pass endpointWeb Services

•GET/v1/passes/<passTypeID>/<serialNo.>

Get pass endpointWeb Services

•GET/v1/passes/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>

Get pass endpointWeb Services

•GET/v1/passes/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>

Get pass endpointWeb Services

• Server responds with signed, zipped .pkpass data

•GET/v1/passes/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>If-modified-since: <timestamp>

Get pass endpointWeb Services

• Server responds with signed, zipped .pkpass data

•GET/v1/passes/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>If-modified-since: <timestamp>

• Server responds with signed, zipped .pkpass data or 304

Get pass endpointWeb Services

•GET/v1/passes/<passTypeID>/<serialNo.>

• In the HTTP headerAuthorization: ApplePass <authToken>If-modified-since: <timestamp>

• Server responds with signed, zipped .pkpass data or 304

• In the response headerLast-modified: <timestamp>

Get pass endpointWeb Services

Pass signing algorithmWeb Services

Pass signing algorithmWeb Services

• Create a JSON dictionary and save it as manifest.json

Pass signing algorithmWeb Services

• Create a JSON dictionary and save it as manifest.json■ Each key is a relative path in the pass directory

Pass signing algorithmWeb Services

• Create a JSON dictionary and save it as manifest.json■ Each key is a relative path in the pass directory■ Each value is the SHA1 hash of the file data at that path, hex encoded

Pass signing algorithmWeb Services

• Create a JSON dictionary and save it as manifest.json■ Each key is a relative path in the pass directory■ Each value is the SHA1 hash of the file data at that path, hex encoded

• Sign the manifest data with your cert; save the result as signature

Pass signing algorithmWeb Services

• Create a JSON dictionary and save it as manifest.json■ Each key is a relative path in the pass directory■ Each value is the SHA1 hash of the file data at that path, hex encoded

• Sign the manifest data with your cert; save the result as signature

• Zip the contents of the pass directory

DemoRunning the sample web service implementation

Ken Ferry

Rules of the roadWeb Services

Rules of the roadWeb Services

•Don’t send unnecessary push notifications

Rules of the roadWeb Services

•Don’t send unnecessary push notifications■ Only send pushes when something has changed

Rules of the roadWeb Services

•Don’t send unnecessary push notifications■ Only send pushes when something has changed■ Respect unregistration requests: Only send pushes for registered passes

Rules of the roadWeb Services

•Don’t send unnecessary push notifications■ Only send pushes when something has changed■ Respect unregistration requests: Only send pushes for registered passes

• Verify authentication tokens

Rules of the roadWeb Services

•Don’t send unnecessary push notifications■ Only send pushes when something has changed■ Respect unregistration requests: Only send pushes for registered passes

• Verify authentication tokens

• Implement passesUpdatedSince/lastUpdated for the “what changed?” endpoint

Rules of the roadWeb Services

•Don’t send unnecessary push notifications■ Only send pushes when something has changed■ Respect unregistration requests: Only send pushes for registered passes

• Verify authentication tokens

• Implement passesUpdatedSince/lastUpdated for the “what changed?” endpoint

• Implement if-modified-since/last-modified for the “get pass” endpoint

Enforcement and feedbackWeb Services

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse■ Additional “log” endpoint

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse■ Additional “log” endpoint

POST /v1/log

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse■ Additional “log” endpoint

POST /v1/log■ Payload: Human-readable description of the problem

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse■ Additional “log” endpoint

POST /v1/log■ Payload: Human-readable description of the problem

■ We may rate-limit your updates or tell APNS to stop delivering your pushes altogether

Enforcement and feedbackWeb Services

• Standard APNS feedback mechanism applies■ If APNS bounces messages to a device, clear it from your database

• Passbook-specific feedback about Web Services API misuse■ Additional “log” endpoint

POST /v1/log■ Payload: Human-readable description of the problem

■ We may rate-limit your updates or tell APNS to stop delivering your pushes altogether

■ Angry phone call

Summing Up

• PassKit■ PKPass■ PKPassLibrary■ PKAddPassesViewController

•Web Services API /v1/devices/<deviceID>/registrations/<passTypeID>/<serialNo.> /v1/devices/<deviceID>/registrations/<passTypeID>?passesUpdatedSince=<tag> /v1/passes/<passTypeID>/<serialNo.> /v1/log

More Information

Paul MarcosApplication Services [email protected]

DocumentationPass Kit Programming Guidehttp://developer.apple.com

Apple Developer Forumshttp://devforums.apple.com

Related Sessions

Introducing Passbook, Part 1 PresidioWednesday 11:30AM

Passbook Lab App Services Lab BFriday 9:00AM

Labs