Seamless Linking to Your App

Similar documents
Monetize and Promote Your App with iad

What s New in Xcode App Signing

Introducing Search APIs

What s New in Notifications

WatchKit In-Depth, Part 2

Introduction to Siri Shortcuts

Introducing Password AutoFill for Apps

What s New in CloudKit

Using and Extending the Xcode Source Editor

What's New in Core Spotlight

Automatic Strong Passwords and Security Code AutoFill

Accessibility on OS X

Introducing the Modern WebKit API

Extending Your Apps with SiriKit

What s New in tvos 12

Building Watch Apps #WWDC15. Featured. Session 108. Neil Desai watchos Engineer

Implementing UI Designs in Interface Builder

Accessibility on ios. Developing for everyone. Frameworks #WWDC14. Session 210 Clare Kasemset ios Accessibility

Getting the Most Out of HealthKit

Enhancing your apps for the next dimension of touch

App Extension Best Practices

What s New in Core Data?

Mastering Xcode for iphone OS Development Part 2. Marc Verstaen Sr. Manager, iphone Tools

ios Accessibility Developing for everyone Session 201 Ian Fisch ios Accessibility

Your Apps and the Future of macos Security

Creating Extensions for ios and OS X, Part Two

Building for Voice with Siri Shortcuts

Introducing the Photos Frameworks

Advanced Scrollviews and Touch Handling Techniques

Cocoa Touch Best Practices

Mastering Xcode for iphone OS Development Part 1. Todd Fernandez Sr. Manager, IDEs

CloudKit Tips And Tricks

Multitasking Support on the ios Platform

Introducing On Demand Resources

Introducing the Contacts Framework

Creating Complications with ClockKit Session 209

Universal Linking Developer s Guide Release

Media and Gaming Accessibility

Mastering UIKit on tvos

Using Grouped Notifications

Content Protection for HTTP Live Streaming

VMware AirWatch SDK for ios (Swift) v17.5. Technical Implementation Guide Empowering your enterprise applications with MDM capabilities

Data Delivery with Drag and Drop

Mastering Drag and Drop

What s New in tvos #WWDC16. App Frameworks. Session 206. Hans Kim tvos Engineer

What's New in Foundation Networking

Mysteries of Auto Layout, Part 1

Cross Platform Nearby Networking

What s New in Device Configuration, Deployment, and Management

Improving your Existing Apps with Swift

Advanced Debugging and the Address Sanitizer

Introducing SiriKit. Hey Siri, say hello to apps #WWDC16. App Frameworks. Session 217

Introducing MusicKit. Media #WWDC17. Tim Parthemore, MusicKit Services Joel Lopes Da Silva, ios Music

Advances in AVFoundation Playback

Quick Interaction Techniques for watchos

Managing Documents In Your ios Apps

Improving the Accessibility and Usability of Complex Web Applications

Adapting to the New UI of OS X Yosemite

imessage Apps and Stickers, Part 2

Creating Great App Previews

Adopting Advanced Features of the New UI

Core ML in Depth. System Frameworks #WWDC17. Krishna Sridhar, Core ML Zach Nation, Core ML

Creating Extensions for Safari

Networking with NSURLSession

Swift API Design Guidelines

What s New in watchos

Your Apps and Evolving Network Security Standards

Storyboards and Controllers on OS X

What s New in Core Location

ArcGIS Runtime SDK for Java: A Beginner s Guide. Mark Baird JC Malott

Advanced Notifications

MAC BASICS For MacBooks & imacs MacOS Mojave Part 5: WEB BROWSERS

Use the API or contact customer service to provide us with the following: General ios Android App Name (friendly one-word name)

What s New in SiriKit

Introducing Swift Playgrounds

Integrating AirWatch and VMware Identity Manager

ios 9 Day by Day Also by shinobicontrols This version was published Scott Logic Ltd

Settings. Mobile Application Development in ios School of EECS Washington State University Instructor: Larry Holder

Integrating Apps and Content with AR Quick Look

View Controller Advancements for ios8

What s New in NSCollectionView Session 225

Building Faster in Xcode

Getting Published in Apple News

Introducing CloudKit. A how-to guide for icloud for your Apps. Frameworks #WWDC14. Session 208 Olivier Bonnet CloudKit Client Software

Designing for Apple Watch

What s New in HomeKit

Enabling Your App for CarPlay

What's New in UIKit Dynamics and Visual Effects Session 229

What s New in MapKit. App Frameworks #WWDC17. Fredrik Olsson

What s New in Foundation for Swift Session 207

Optimizing Swift Performance Session 409

Thread Sanitizer and Static Analysis

Engineering for Testability

New UIKit Support for International User Interfaces

Introduction to Your First ArcGIS Enterprise Deployment. Thomas Edghill & Jonathan Quinn

Writing Great Alerts. Design #WWDC17. Natalie Calvert, Designer

SDK for ios (Swift) VMware Workspace ONE UEM

VMware AirWatch Integration with Apple School Manager Integrate with Apple's School Manager to automatically enroll devices and manage classes

VMware Workspace ONE UEM Integration with Apple School Manager

Kevin van Vechten Core OS

Transcription:

App Frameworks #WWDC15 Seamless Linking to Your App Session 509 Conrad Shultz Safari and WebKit Software Engineer Jonathan Grynspan Core Services Software Engineer 2015 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

Your App, Your Website

Demo WWDC App Conrad Shultz Safari and WebKit Software Engineer

Building Seamless Integration Have your app handle link to your website Have your website link to your app Help your users log into your app

Building Seamless Integration Have your app handle link to your website Have your website link to your app Help your users log into your app

Building Seamless Integration Have your app handle link to your website Have your website link to your app Help your users log into your app

Building Seamless Integration Have your app handle link to your website Have your website link to your app Help your users log into your app

Linking to Your App Jonathan Grynspan Core Services Software Engineer

Handling URLs in Your App

Handling URLs in Your App Custom URL schemes

Handling URLs in Your App Custom URL schemes Let apps communicate with each other

Handling URLs in Your App Custom URL schemes Let apps communicate with each other Don t always map to your app

Handling URLs in Your App Custom URL schemes Let apps communicate with each other Don t always map to your app Don t work without your app installed

Handling URLs in Your App Custom URL schemes Let apps communicate with each other Don t always map to your app Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other Don t always map to your app Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Don t always map to your app Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Don t always map to your app Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Don t Securely always map map to apps to your app choose Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Securely map to apps you choose Don t work without your app installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Securely map to apps you choose Don t Work universally, work without fall your back app to Safari installed Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Securely map to apps you choose Work universally, fall back to Safari Don t protect users privacy

Handling URLs in Your App A better way? Let apps communicate with each other just as easily Securely map to apps you choose Work universally, fall back to Safari Don t protect users privacy Protect users privacy

Breakdown of a Universal Link

Breakdown of a Universal Link https://developer.apple.com/videos/wwdc/2014/?include=101#101

Breakdown of a Universal Link https://developer.apple.com/videos/wwdc/2014/?include=101#101 Scheme ( https or http )

Breakdown of a Universal Link https://developer.apple.com/videos/wwdc/2014/?include=101#101 Domain

Breakdown of a Universal Link https://developer.apple.com/videos/wwdc/2014/?include=101#101 Path or path prefix

Breakdown of a Universal Link https://developer.apple.com/videos/wwdc/2014/?include=101#101

Getting Your Server Ready

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server

Getting Your Server Ready apple-app-site-association file { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { } "paths": [ "*" ] } } }

Getting Your Server Ready apple-app-site-association file { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { } "paths": [ "*" ] } } }

Getting Your Server Ready apple-app-site-association file { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { } "paths": [ "*" ] } } }

Getting Your Server Ready apple-app-site-association file { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { } "paths": [ "*" ] } } }

Getting Your Server Ready apple-app-site-association file { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { "paths": [ "*" ] "/wwdc/news/", "/videos/wwdc/2015/*" } ] } } }

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server

Getting Your Server Ready Signing your JSON file openssl smime \ -sign \ -nodetach \ -in "unsigned.json" \ -out "apple-app-site-association" \ -outform DER \ -inkey "private-key.pem" \ -signer "certificate.pem"

Getting Your Server Ready Signing your JSON file openssl smime \ -sign \ -nodetach \ -in "unsigned.json" \ -out "apple-app-site-association" \ -outform DER \ -inkey "private-key.pem" \ -signer "certificate.pem"

Getting Your Server Ready Signing your JSON file openssl smime \ -sign \ -nodetach \ -in "unsigned.json" \ -out "apple-app-site-association" \ -outform DER \ -inkey "private-key.pem" \ -signer "certificate.pem"

Getting Your Server Ready Signing your JSON file openssl smime \ -sign \ -nodetach \ -in "unsigned.json" \ -out "apple-app-site-association" \ -outform DER \ -inkey "private-key.pem" \ -signer "certificate.pem" \ -certfile "intermediate-certificate.pem"

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server https://www.example.com/apple-app-site-association

Getting Your Server Ready Create your apple-app-site-association file Generate an SSL certificate Sign your file Upload to your server

Getting Your Server Ready Create your apple-app-site-association file Upload to your server

Getting Your App Ready

Getting Your App Ready UIApplicationDelegate support

Getting Your App Ready UIApplicationDelegate support func application(application: UIApplication, continueuseractivity useractivity: NSUserActivity, restorationhandler: ([AnyObject]!) -> Void) -> Bool

Getting Your App Ready UIApplicationDelegate support func application(application: UIApplication, continueuseractivity useractivity: NSUserActivity, restorationhandler: ([AnyObject]!) -> Void) -> Bool var webpageurl : NSURL?

Getting Your App Ready UIApplicationDelegate support func application(application: UIApplication, continueuseractivity useractivity: NSUserActivity, restorationhandler: ([AnyObject]!) -> Void) -> Bool var webpageurl : NSURL? var activitytype : String

Getting Your App Ready UIApplicationDelegate support func application(application: UIApplication, continueuseractivity useractivity: NSUserActivity, restorationhandler: ([AnyObject]!) -> Void) -> Bool var webpageurl : NSURL? var activitytype : String let NSUserActivityTypeBrowsingWeb : String

Getting Your App Ready UIApplicationDelegate support func application(application: UIApplication, continueuseractivity useractivity: NSUserActivity, restorationhandler: ([AnyObject]!) -> Void) -> Bool var webpageurl : NSURL? var activitytype : String let NSUserActivityTypeBrowsingWeb : String class NSURLComponents : NSObject

Getting Your App Ready Configuring your associated domains

Getting Your App Ready Best practices

Getting Your App Ready Best practices Validate input

Getting Your App Ready Best practices Validate input Fail gracefully

Getting Your App Ready Best practices Validate input Fail gracefully Send data over HTTPS

Getting Your App Ready Best practices Validate input Fail gracefully Send data over HTTPS

Getting Your App Ready Best practices Validate input Fail gracefully Send data over HTTPS Networking with NSURLSession Pacific Heights Thursday 9:00AM

Demo Xcode and ios 9 SDK Jonathan Grynspan Core Services Software Engineer

Linking to Your App Conrad Shultz Safari and WebKit Software Engineer

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Linking to Your App Some advantages of universal links No flashes or bouncing through Safari No code required on your website Graceful fallback to Safari Platform-neutral No extra server round-trips Full user privacy protection

Smart App Banners Promote your app from your website

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners What are smart app banners? Presented by Safari on ios Know whether an app is installed Easy to add to your website Used to index your app More effective than custom URL schemes

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head>

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head>

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head>

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head> Use https://linkmaker.itunes.apple.com to find your App Store ID

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head>

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head> app-argument is passed to application(_:openurl:sourceapplication:annotation:), and is also used to index your app

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name="apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head> app-argument is passed to application(_:openurl:sourceapplication:annotation:), and is also used to index your app Introducing Search APIs Mission Wednesday 11:00AM

Smart App Banners Deploying smart app banners Add a meta tag to your website s head: <head> <meta name= apple-itunes-app" content="app-id=640199958, appargument=https://developer.apple.com/wwdc/schedule, affiliatedata=optionalaffiliatedata"> </head> Smart App Banners will not appear in the ios Simulator

https://developer.apple.com/videos/wwdc/2014/

Shared Web Credentials Help your users log into your app

Saved Passwords and Safari How Safari helps users and you Securely save credentials for users Sync to all devices with icloud Keychain Suggest secure passwords for users AutoFill saved credentials

Saved Passwords and Safari How Safari helps users and you Securely save credentials for users Sync to all devices with icloud Keychain Suggest secure passwords for users AutoFill saved credentials

Saved Passwords and Safari How Safari helps users and you Securely save credentials for users Sync to all devices with icloud Keychain Suggest secure passwords for users AutoFill saved credentials

Saved Passwords and Safari How Safari helps users and you Securely save credentials for users Sync to all devices with icloud Keychain Suggest secure passwords for users AutoFill saved credentials

Saved Passwords and Safari How Safari helps users and you Securely save credentials for users Sync to all devices with icloud Keychain Suggest secure passwords for users AutoFill saved credentials

Shared Web Credentials Adopting shared web credentials Associate your app and your website Teach your app to ask for Shared Web Credentials

Shared Web Credentials Adopting shared web credentials Associate your app and your website Teach your app to ask for Shared Web Credentials

Shared Web Credentials Adopting shared web credentials Associate your app and your website Teach your app to ask for Shared Web Credentials

App-Website Association Server-side

App-Website Association Server-side Add a new top-level dictionary to your apple-app-site-association JSON file: { "applinks": { "apps": [], "details": { "9JA89QQLNQ.com.apple.wwdc": { "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" } ] } } }

App-Website Association Server-side Add a new top-level dictionary to your apple-app-site-association JSON file: { "applinks": { } "webcredentials": { "apps": [ "A1B2C3D4E5.com.example.AppName" ] } }

App-Website Association Server-side Add a new top-level dictionary to your apple-app-site-association JSON file: { "applinks": { } "webcredentials": { "apps": [ "A1B2C3D4E5.com.example.AppName" ] } }

App-Website Association Server-side Add a new top-level dictionary to your apple-app-site-association JSON file: { "applinks": { } "webcredentials": { "apps": [ "A1B2C3D4E5.com.example.AppName" ] } }

App-Website Association App-side

App-Website Association App-side Add a new entry to your app s com.apple.developer.associated-domains entitlement: webcredentials:example.com

App-Website Association App-side Add a new entry to your app s com.apple.developer.associated-domains entitlement: webcredentials:example.com

Shared Web Credentials The app workflow Check for Saved Credentials Check Safari for Credentials Prompt User Save Credentials Log In

Shared Web Credentials The app workflow Check for Saved Credentials Check Safari for Credentials Prompt User Save Credentials Log In

Shared Web Credentials The app workflow Check for Saved Credentials Check Safari for Credentials Prompt User Save Credentials Log In

Shared Web Credentials The app workflow Check for Saved Credentials Check Safari for Credentials Prompt User Save Credentials Log In

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Retrieving Safari s Saved Credentials // Find all matching user names from domains specified in the entitlement. SecRequestSharedWebCredential(nil, nil) { cfcredentials, error in if let cfcredentials = cfcredentials where CFArrayGetCount(cfCredentials)!= 0 { let credentials = cfcredentials as [AnyObject] let credential = credentials[0] let username = credential[ksecattraccount as String] let password = credential[ksecsharedpassword as String] dispatch_async(dispatch_get_main_queue()) { // Log in with the user name and password. } } else { dispatch_async(dispatch_get_main_queue()) { // Show in-app login UI. } } }

Shared Web Credentials Updating Safari s saved credentials SecAddSharedWebCredential("example.com", username, password) { error in }

Shared Web Credentials Generating secure passwords let password: String = SecCreateSharedWebCredentialPassword().takeRetainedValue() as String print("the generated password was: \(password)") // E.g.: The generated password was: ufa-t9c-ard-cdp

Shared Web Credentials Generating secure passwords let password: String = SecCreateSharedWebCredentialPassword().takeRetainedValue() as String print("the generated password was: \(password)") // E.g.: The generated password was: ufa-t9c-ard-cdp Your App, Your Website, and Safari WWDC14

Summary Give your users the best experience by having your app handle link to your website Deploy Smart App Banners to help users of your website discover your app Help your users log into your app by adopting Shared Web Credentials

Summary Give your users the best experience by having your app handle link to your website Deploy Smart App Banners to help users of your website discover your app Help your users log into your app by adopting Shared Web Credentials

Summary Give your users the best experience by having your app handle link to your website Deploy Smart App Banners to help users of your website discover your app Help your users log into your app by adopting Shared Web Credentials

Summary Give your users the best experience by having your app handle links to your website Deploy Smart App Banners to help users of your website discover your app Help your users log into your app by adopting Shared Web Credentials

More Information Technical Support Apple Developer Forums http://developer.apple.com/forums Developer Technical Support http://developer.apple.com/contact Shared Web Credentials Reference http://developer.apple.com/library/ios/documentation/security/reference/ SharedWebCredentialsRef/

More Information General Inquiries Jon Davis Web Technologies Evangelist web-evangelist@apple.com Jake Behrens App Frameworks Evangelist behrens@apple.com

Related Sessions Introducing Safari View Controller Nob Hill Tuesday 1:30PM Privacy and Your App Pacific Heights Tuesday 2:30PM Introducing Search APIs Mission Wednesday 11:00AM Networking with NSURLSession Pacific Heights Thursday 9:00AM Your App, Your Website, and Safari Adopting Handoff on ios and OS X WWDC14 WWDC14

Labs App Search and Spotlight Frameworks Lab E Friday 1:30PM Safari and WebKit Graphics, Games, and Media Lab A Friday 12:00PM