├── LICENSE ├── README.md └── wwdc_sessions ├── subtitles ├── HD │ ├── 102_hd_platforms_state_of_the_union.srt │ ├── 103_hd_apple_design_awards.srt │ ├── 201_hd_internationalization_best_practices.srt │ ├── 202_hd_whats_new_in_accessibility.srt │ ├── 203_hd_whats_new_in_cocoa.srt │ ├── 204_hd_imessage_apps_and_stickers_part_1.srt │ ├── 205_hd_whats_new_in_cocoa_touch.srt │ ├── 206_hd_whats_new_in_tvos.srt │ ├── 207_hd_whats_new_in_foundation_for_swift.srt │ ├── 210_hd_mastering_uikit_on_tvos.srt │ ├── 211_hd_quick_interaction_techniques_for_watchos.srt │ ├── 212_hd_developing_tvos_apps_using_tvmlkit_part_1.srt │ ├── 213_hd_improving_existing_apps_with_modern_best_practices.srt │ ├── 214_hd_extending_your_app_with_safari_app_extensions.srt │ ├── 215_hd_focus_interaction_on_tvos.srt │ ├── 216_hd_advances_in_uikit_animations_and_transitions.srt │ ├── 217_hd_introducing_sirikit.srt │ ├── 222_hd_making_apps_adaptive_part_1.srt │ ├── 223_hd_making_the_most_of_search_apis.srt │ ├── 224_hd_imessage_apps_and_stickers_part_2.srt │ ├── 225_hd_extending_your_apps_with_sirikit.srt │ ├── 226_hd_whats_new_with_cloudkit.srt │ ├── 227_hd_architecting_for_performance_on_watchos_3.srt │ ├── 228_hd_a_peek_at_3d_touch.srt │ ├── 229_hd_developing_tvos_apps_using_tvmlkit_part_2.srt │ ├── 232_hd_whats_new_in_international_user_interfaces.srt │ ├── 234_hd_whats_new_in_researchkit.srt │ ├── 241_hd_public_transit_in_apple_maps.srt │ ├── 301_hd_introducing_expanded_subscriptions_in_itunes_connect.srt │ ├── 302_hd_introducing_search_ads.srt │ ├── 303_hd_whats_new_in_apple_device_management.srt │ ├── 304_hd_best_practices_for_building_apps_used_in_business_and_education.srt │ ├── 401_hd_whats_new_in_xcode_app_signing.srt │ ├── 402_hd_whats_new_in_swift.srt │ ├── 403_hd_swift_api_design_guidelines.srt │ ├── 404_hd_getting_started_with_swift.srt │ ├── 405_hd_whats_new_in_llvm.srt │ ├── 406_hd_optimizing_app_startup_time.srt │ ├── 407_hd_auditing_your_apps_for_accessibility.srt │ ├── 408_hd_introducing_swift_playgrounds.srt │ ├── 409_hd_advanced_testing_and_continuous_integration.srt │ ├── 410_hd_visual_debugging_with_xcode.srt │ ├── 414_hd_using_and_extending_the_xcode_source_editor.srt │ ├── 416_hd_understanding_swift_performance.srt │ ├── 501_hd_advances_in_ios_photography.srt │ ├── 502_hd_getting_published_in_apple_news.srt │ ├── 503_hd_advances_in_avfoundation_playback.srt │ ├── 504_hd_whats_new_in_http_live_streaming.srt │ ├── 505_hd_live_photo_editing_and_raw_processing_with_core_image.srt │ ├── 506_hd_avkit_on_tvos.srt │ ├── 507_hd_delivering_an_exceptional_audio_experience.srt │ ├── 509_hd_speech_recognition_api.srt │ ├── 510_hd_validating_http_live_streams.srt │ ├── 511_hd_avcapturephotooutput__beyond_the_basics.srt │ ├── 601_hd_go_live_with_replaykit.srt │ ├── 602_hd_adopting_metal_part_1.srt │ ├── 603_hd_adopting_metal_part_2.srt │ ├── 604_hd_whats_new_in_metal_part_1.srt │ ├── 605_hd_whats_new_in_metal_part_2.srt │ ├── 606_hd_advanced_metal_shader_optimization.srt │ ├── 607_hd_controlling_game_input_for_apple_tv.srt │ ├── 702_hd_using_store_kit_for_inapp_purchases_with_swift_3.srt │ ├── 703_hd_apple_pay_on_the_web.srt │ ├── 704_hd_whats_new_with_wallet_and_apple_pay.srt │ ├── 705_hd_how_ios_security_really_works.srt │ ├── 706_hd_whats_new_in_security.srt │ ├── 707_hd_introduction_to_notifications.srt │ ├── 708_hd_advanced_notifications.srt │ ├── 710_hd_whats_new_in_homekit.srt │ ├── 711_hd_nsurlsession_new_features_and_best_practices.srt │ ├── 717_hd_beyond_dictation__enhanced_voicecontrol_for_macos_apps.srt │ ├── 722_hd_developing_carplay_systems_part_1.srt │ ├── 723_hd_developing_carplay_systems_part_2.srt │ ├── 724_hd_whats_new_in_the_apple_push_notification_service.srt │ ├── 725_hd_deploying_airprint_in_enterprise.srt │ ├── 801_hd_inclusive_app_design.srt │ ├── 802_hd_designing_for_tvos.srt │ ├── 803_hd_typography_and_fonts.srt │ └── 804_hd_designing_great_apple_watch_experiences.srt └── SD │ ├── 102_sd_platforms_state_of_the_union.srt │ ├── 103_sd_apple_design_awards.srt │ ├── 201_sd_internationalization_best_practices.srt │ ├── 202_sd_whats_new_in_accessibility.srt │ ├── 203_sd_whats_new_in_cocoa.srt │ ├── 204_sd_imessage_apps_and_stickers_part_1.srt │ ├── 205_sd_whats_new_in_cocoa_touch.srt │ ├── 206_sd_whats_new_in_tvos.srt │ ├── 207_sd_whats_new_in_foundation_for_swift.srt │ ├── 210_sd_mastering_uikit_on_tvos.srt │ ├── 211_sd_quick_interaction_techniques_for_watchos.srt │ ├── 212_sd_developing_tvos_apps_using_tvmlkit_part_1.srt │ ├── 213_sd_improving_existing_apps_with_modern_best_practices.srt │ ├── 214_sd_extending_your_app_with_safari_app_extensions.srt │ ├── 215_sd_focus_interaction_on_tvos.srt │ ├── 216_sd_advances_in_uikit_animations_and_transitions.srt │ ├── 217_sd_introducing_sirikit.srt │ ├── 222_sd_making_apps_adaptive_part_1.srt │ ├── 223_sd_making_the_most_of_search_apis.srt │ ├── 224_sd_imessage_apps_and_stickers_part_2.srt │ ├── 225_sd_extending_your_apps_with_sirikit.srt │ ├── 226_sd_whats_new_with_cloudkit.srt │ ├── 227_sd_architecting_for_performance_on_watchos_3.srt │ ├── 228_sd_a_peek_at_3d_touch.srt │ ├── 229_sd_developing_tvos_apps_using_tvmlkit_part_2.srt │ ├── 232_sd_whats_new_in_international_user_interfaces.srt │ ├── 234_sd_whats_new_in_researchkit.srt │ ├── 241_sd_public_transit_in_apple_maps.srt │ ├── 301_sd_introducing_expanded_subscriptions_in_itunes_connect.srt │ ├── 302_sd_introducing_search_ads.srt │ ├── 303_sd_whats_new_in_apple_device_management.srt │ ├── 304_sd_best_practices_for_building_apps_used_in_business_and_education.srt │ ├── 401_sd_whats_new_in_xcode_app_signing.srt │ ├── 402_sd_whats_new_in_swift.srt │ ├── 403_sd_swift_api_design_guidelines.srt │ ├── 404_sd_getting_started_with_swift.srt │ ├── 405_sd_whats_new_in_llvm.srt │ ├── 406_sd_optimizing_app_startup_time.srt │ ├── 407_sd_auditing_your_apps_for_accessibility.srt │ ├── 408_sd_introducing_swift_playgrounds.srt │ ├── 409_sd_advanced_testing_and_continuous_integration.srt │ ├── 410_sd_visual_debugging_with_xcode.srt │ ├── 414_sd_using_and_extending_the_xcode_source_editor.srt │ ├── 416_sd_understanding_swift_performance.srt │ ├── 501_sd_advances_in_ios_photography.srt │ ├── 502_sd_getting_published_in_apple_news.srt │ ├── 503_sd_advances_in_avfoundation_playback.srt │ ├── 504_sd_whats_new_in_http_live_streaming.srt │ ├── 505_sd_live_photo_editing_and_raw_processing_with_core_image.srt │ ├── 506_sd_avkit_on_tvos.srt │ ├── 507_sd_delivering_an_exceptional_audio_experience.srt │ ├── 509_sd_speech_recognition_api.srt │ ├── 510_sd_validating_http_live_streams.srt │ ├── 511_sd_avcapturephotooutput__beyond_the_basics.srt │ ├── 601_sd_go_live_with_replaykit.srt │ ├── 602_sd_adopting_metal_part_1.srt │ ├── 603_sd_adopting_metal_part_2.srt │ ├── 604_sd_whats_new_in_metal_part_1.srt │ ├── 605_sd_whats_new_in_metal_part_2.srt │ ├── 606_sd_advanced_metal_shader_optimization.srt │ ├── 607_sd_controlling_game_input_for_apple_tv.srt │ ├── 702_sd_using_store_kit_for_inapp_purchases_with_swift_3.srt │ ├── 703_sd_apple_pay_on_the_web.srt │ ├── 704_sd_whats_new_with_wallet_and_apple_pay.srt │ ├── 705_sd_how_ios_security_really_works.srt │ ├── 706_sd_whats_new_in_security.srt │ ├── 707_sd_introduction_to_notifications.srt │ ├── 708_sd_advanced_notifications.srt │ ├── 710_sd_whats_new_in_homekit.srt │ ├── 711_sd_nsurlsession_new_features_and_best_practices.srt │ ├── 717_sd_beyond_dictation__enhanced_voicecontrol_for_macos_apps.srt │ ├── 722_sd_developing_carplay_systems_part_1.srt │ ├── 723_sd_developing_carplay_systems_part_2.srt │ ├── 724_sd_whats_new_in_the_apple_push_notification_service.srt │ ├── 725_sd_deploying_airprint_in_enterprise.srt │ ├── 801_sd_inclusive_app_design.srt │ ├── 802_sd_designing_for_tvos.srt │ ├── 803_sd_typography_and_fonts.srt │ └── 804_sd_designing_great_apple_watch_experiences.srt ├── wwdc2016pdf_links.txt └── wwdc2016videos_links.txt /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 jianpx 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wwdc2016 subtitles(英文字幕) are copied from https://github.com/wujichao/WWDC_2016_Video_Subtitle , big thanks to the repo! -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/HD/241_hd_public_transit_in_apple_maps.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:17,500 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:20,346 --> 00:00:23,766 8 | >> Hello. My name is Ellis 9 | Verosub, and I'm responsible 10 | 11 | 12 | 3 13 | 00:00:23,766 --> 00:00:25,726 14 | for public transit 15 | in Apple Maps. 16 | 17 | 18 | 4 19 | 00:00:26,166 --> 00:00:28,086 20 | Our goal here at Apple is always 21 | 22 | 23 | 5 24 | 00:00:28,086 --> 00:00:30,596 25 | to create the best possible 26 | customer experience. 27 | 28 | 29 | 6 30 | 00:00:31,176 --> 00:00:32,996 31 | We believe that design 32 | is not just 33 | 34 | 35 | 7 36 | 00:00:32,996 --> 00:00:35,396 37 | about how something 38 | looks but how it works. 39 | 40 | 41 | 8 42 | 00:00:35,986 --> 00:00:38,776 43 | Great experiences are 44 | intuitive and seamless. 45 | 46 | 47 | 9 48 | 00:00:39,326 --> 00:00:42,486 49 | In this talk, I'd like to 50 | explore how these ideas apply 51 | 52 | 53 | 10 54 | 00:00:42,486 --> 00:00:44,086 55 | to transit in Apple Maps. 56 | 57 | 58 | 11 59 | 00:00:44,446 --> 00:00:45,836 60 | But first, I'd like to start 61 | 62 | 63 | 12 64 | 00:00:45,836 --> 00:00:50,886 65 | by giving you an 66 | overview of our product. 67 | 68 | 69 | 13 70 | 00:00:50,976 --> 00:00:55,156 71 | Transit launched in September 72 | 2015 as part of iOS 9 73 | 74 | 75 | 14 76 | 00:00:55,336 --> 00:00:57,016 77 | and Mac OS X, El Capitan. 78 | 79 | 80 | 15 81 | 00:00:57,016 --> 00:01:02,126 82 | As of today, it is available 83 | in 21 cities around the world 84 | 85 | 86 | 16 87 | 00:01:02,126 --> 00:01:04,385 88 | as well as over 300 89 | cities in China. 90 | 91 | 92 | 17 93 | 00:01:05,616 --> 00:01:09,756 94 | We use transit schedule data 95 | from over 250 transit agencies. 96 | 97 | 98 | 18 99 | 00:01:10,996 --> 00:01:12,286 100 | Here's a bit of a fun fact. 101 | 102 | 103 | 19 104 | 00:01:12,586 --> 00:01:16,576 105 | To date, we've mapped more 106 | than 16,000 station entrances. 107 | 108 | 109 | 20 110 | 00:01:17,726 --> 00:01:19,556 111 | Next, I'd like to 112 | give you an overview 113 | 114 | 115 | 21 116 | 00:01:19,656 --> 00:01:21,856 117 | of the four key features 118 | of our product. 119 | 120 | 121 | 22 122 | 00:01:22,456 --> 00:01:26,586 123 | The first is a beautiful 124 | transit map. 125 | 126 | 127 | 23 128 | 00:01:27,166 --> 00:01:29,926 129 | Roads and other driving-related 130 | elements have been dimmed 131 | 132 | 133 | 24 134 | 00:01:29,926 --> 00:01:32,316 135 | out while transit 136 | lines and key terminus 137 | 138 | 139 | 25 140 | 00:01:32,316 --> 00:01:34,276 141 | and transfer stations 142 | are emphasized. 143 | 144 | 145 | 26 146 | 00:01:38,626 --> 00:01:40,656 147 | The second feature 148 | is a departure board 149 | 150 | 151 | 27 152 | 00:01:40,656 --> 00:01:43,976 153 | for each station showing each 154 | line that services the station. 155 | 156 | 157 | 28 158 | 00:01:49,376 --> 00:01:52,696 159 | The third is detailed point 160 | to point directions along 161 | 162 | 163 | 29 164 | 00:01:52,696 --> 00:01:54,726 165 | with a guided navigation 166 | experience. 167 | 168 | 169 | 30 170 | 00:01:58,556 --> 00:02:01,236 171 | Finally, we show 172 | realtime advisories 173 | 174 | 175 | 31 176 | 00:02:01,236 --> 00:02:04,646 177 | and even modify our recommended 178 | directions in response 179 | 180 | 181 | 32 182 | 00:02:04,766 --> 00:02:07,556 183 | to planned service changes 184 | or unplanned incidents. 185 | 186 | 187 | 33 188 | 00:02:11,216 --> 00:02:13,886 189 | Our goal is to provide 190 | a great experience 191 | 192 | 193 | 34 194 | 00:02:14,176 --> 00:02:15,566 195 | in each city we support. 196 | 197 | 198 | 35 199 | 00:02:16,296 --> 00:02:17,676 200 | So how do we do that? 201 | 202 | 203 | 36 204 | 00:02:17,996 --> 00:02:21,436 205 | We start with agency schedule 206 | data, but we don't stop there. 207 | 208 | 209 | 37 210 | 00:02:21,936 --> 00:02:23,246 211 | We collect additional data 212 | 213 | 214 | 38 215 | 00:02:23,246 --> 00:02:25,566 216 | through original research 217 | and field surveys. 218 | 219 | 220 | 39 221 | 00:02:26,026 --> 00:02:28,486 222 | Then we add in a layer 223 | of curation to surprise 224 | 225 | 226 | 40 227 | 00:02:28,486 --> 00:02:29,916 228 | and delight our customers. 229 | 230 | 231 | 41 232 | 00:02:30,316 --> 00:02:33,556 233 | Our goal is that at every 234 | moment customers should be able 235 | 236 | 237 | 42 238 | 00:02:33,556 --> 00:02:36,466 239 | to match the instruction we're 240 | giving them to what they see 241 | 242 | 243 | 43 244 | 00:02:36,466 --> 00:02:38,636 245 | in the real world around them. 246 | 247 | 248 | 44 249 | 00:02:39,266 --> 00:02:41,416 250 | Gathering these details 251 | takes a long time. 252 | 253 | 254 | 45 255 | 00:02:41,636 --> 00:02:44,766 256 | But as Steve Jobs once 257 | said, "Details matter. 258 | 259 | 260 | 46 261 | 00:02:45,166 --> 00:02:46,896 262 | It's worth waiting 263 | to get it right". 264 | 265 | 266 | 47 267 | 00:02:49,906 --> 00:02:52,136 268 | Here are some examples 269 | of additional data 270 | 271 | 272 | 48 273 | 00:02:52,136 --> 00:02:53,616 274 | that we collect ourselves. 275 | 276 | 277 | 49 278 | 00:02:56,106 --> 00:02:57,976 279 | Station entrances and exits. 280 | 281 | 282 | 50 283 | 00:03:00,126 --> 00:03:02,936 284 | Station footprints or 285 | the outlines of stations. 286 | 287 | 288 | 51 289 | 00:03:04,876 --> 00:03:06,036 290 | Agency signage. 291 | 292 | 293 | 52 294 | 00:03:06,426 --> 00:03:11,436 295 | And the real world 296 | path of transit lines 297 | 298 | 299 | 53 300 | 00:03:11,516 --> 00:03:14,316 301 | by which I mean the path 302 | that trains and buses 303 | 304 | 305 | 54 306 | 00:03:14,316 --> 00:03:20,806 307 | and ferries actually 308 | take in the real world. 309 | 310 | 311 | 55 312 | 00:03:21,056 --> 00:03:23,696 313 | This example shows a 314 | station entrance in London. 315 | 316 | 317 | 56 318 | 00:03:24,126 --> 00:03:26,976 319 | We've individually surveys 320 | every entrance not just 321 | 322 | 323 | 57 324 | 00:03:26,976 --> 00:03:28,746 325 | for location but also type. 326 | 327 | 328 | 58 329 | 00:03:29,076 --> 00:03:31,996 330 | Stairs, escalator, 331 | elevator, and so forth. 332 | 333 | 334 | 59 335 | 00:03:35,626 --> 00:03:38,556 336 | Here is that same entrance 337 | represented on our transit map. 338 | 339 | 340 | 60 341 | 00:03:39,086 --> 00:03:41,106 342 | You can also see the 343 | station outline here. 344 | 345 | 346 | 61 347 | 00:03:41,856 --> 00:03:44,946 348 | This is really helpful in 349 | terms of finding your way into 350 | 351 | 352 | 62 353 | 00:03:44,946 --> 00:03:46,216 354 | and out of train stations. 355 | 356 | 357 | 63 358 | 00:03:49,396 --> 00:03:52,486 359 | Stations have different names 360 | for exits and entrances. 361 | 362 | 363 | 64 364 | 00:03:52,856 --> 00:03:55,506 365 | From the outside, the entrance 366 | might not even have a name. 367 | 368 | 369 | 65 370 | 00:03:55,706 --> 00:03:58,996 371 | But from the inside, there's 372 | often a number or code. 373 | 374 | 375 | 66 376 | 00:04:01,196 --> 00:04:03,476 377 | We show that number 378 | or code on our map 379 | 380 | 381 | 67 382 | 00:04:03,586 --> 00:04:05,346 383 | so that you can be 384 | confident you are going 385 | 386 | 387 | 68 388 | 00:04:05,346 --> 00:04:06,316 389 | in the correct direction. 390 | 391 | 392 | 69 393 | 00:04:10,476 --> 00:04:14,796 394 | We try to match agency signage 395 | as closely as possible not just 396 | 397 | 398 | 70 399 | 00:04:14,796 --> 00:04:18,255 400 | in terms of the signage itself, 401 | but also what gets displayed 402 | 403 | 404 | 71 405 | 00:04:18,255 --> 00:04:19,555 406 | where and in what order. 407 | 408 | 409 | 72 410 | 00:04:19,866 --> 00:04:25,446 411 | Again, you see that 412 | reflected on our map. 413 | 414 | 415 | 73 416 | 00:04:29,716 --> 00:04:32,486 417 | Finally, something that 418 | is very important to us is 419 | 420 | 421 | 74 422 | 00:04:32,486 --> 00:04:33,766 423 | that the transit lines shown 424 | 425 | 426 | 75 427 | 00:04:33,766 --> 00:04:35,886 428 | on the map follow 429 | their actual paths. 430 | 431 | 432 | 76 433 | 00:04:36,386 --> 00:04:40,006 434 | Many iconic transit maps such as 435 | the London underground map are 436 | 437 | 438 | 77 439 | 00:04:40,006 --> 00:04:43,526 440 | schematic, not representative of 441 | the actual path the lines take. 442 | 443 | 444 | 78 445 | 00:04:44,056 --> 00:04:47,506 446 | However, with a digital map on 447 | a mobile device, it's important 448 | 449 | 450 | 79 451 | 00:04:47,506 --> 00:04:50,966 452 | that your location position as 453 | reflected on the map matches 454 | 455 | 456 | 80 457 | 00:04:50,966 --> 00:04:52,696 458 | up with the line you're 459 | actually traveling on. 460 | 461 | 462 | 81 463 | 00:04:53,326 --> 00:04:54,586 464 | This builds confidence 465 | 466 | 467 | 82 468 | 00:04:54,626 --> 00:04:57,286 469 | in the directions the 470 | customer has been given. 471 | 472 | 473 | 83 474 | 00:05:01,056 --> 00:05:03,536 475 | After we've gathered all 476 | of this additional data, 477 | 478 | 479 | 84 480 | 00:05:03,716 --> 00:05:05,796 481 | we go even deeper 482 | into the experience. 483 | 484 | 485 | 85 486 | 00:05:06,046 --> 00:05:09,696 487 | Our belief is that every city 488 | has a unique transit culture, 489 | 490 | 491 | 86 492 | 00:05:10,016 --> 00:05:11,326 493 | and we try to understand 494 | 495 | 496 | 87 497 | 00:05:11,326 --> 00:05:13,726 498 | and respect this culture 499 | reflecting it back 500 | 501 | 502 | 88 503 | 00:05:13,726 --> 00:05:14,756 504 | at our customers. 505 | 506 | 507 | 89 508 | 00:05:15,566 --> 00:05:16,766 509 | In the next few slides, 510 | 511 | 512 | 90 513 | 00:05:16,766 --> 00:05:19,026 514 | I'm going to dive 515 | into a few examples. 516 | 517 | 518 | 91 519 | 00:05:22,286 --> 00:05:25,286 520 | Boarding instructions vary 521 | from system to system. 522 | 523 | 524 | 92 525 | 00:05:26,286 --> 00:05:29,656 526 | For example, in London 527 | you board lines. 528 | 529 | 530 | 93 531 | 00:05:30,496 --> 00:05:32,906 532 | Whereas in New York 533 | you board trains. 534 | 535 | 536 | 94 537 | 00:05:33,896 --> 00:05:36,016 538 | You don't take the 539 | Victoria train in London 540 | 541 | 542 | 95 543 | 00:05:36,146 --> 00:05:37,686 544 | or the A Line in New York. 545 | 546 | 547 | 96 548 | 00:05:37,816 --> 00:05:39,236 549 | That's not a local convention. 550 | 551 | 552 | 97 553 | 00:05:40,476 --> 00:05:42,086 554 | Sometimes the line name matters, 555 | 556 | 557 | 98 558 | 00:05:42,266 --> 00:05:44,366 559 | but sometimes only the 560 | system name matters. 561 | 562 | 563 | 99 564 | 00:05:44,666 --> 00:05:47,696 565 | Here in the Bay Area, for 566 | example, you just take BART. 567 | 568 | 569 | 100 570 | 00:05:47,696 --> 00:05:52,226 571 | Sometimes the local convention 572 | includes the type of vehicle, 573 | 574 | 575 | 101 576 | 00:05:52,396 --> 00:05:53,546 577 | sometimes it's assumed. 578 | 579 | 580 | 102 581 | 00:05:54,026 --> 00:05:57,016 582 | In Mexico City, we specify 583 | that it's the Metro. 584 | 585 | 586 | 103 587 | 00:05:58,216 --> 00:05:59,716 588 | We capture these subtleties 589 | 590 | 591 | 104 592 | 00:05:59,716 --> 00:06:01,226 593 | because that allows 594 | our customers 595 | 596 | 597 | 105 598 | 00:06:01,226 --> 00:06:04,686 599 | to match what we're telling them 600 | to the real world around them. 601 | 602 | 603 | 106 604 | 00:06:06,996 --> 00:06:08,556 605 | Here is a different example. 606 | 607 | 608 | 107 609 | 00:06:09,656 --> 00:06:12,196 610 | In New York, the MTA 611 | doesn't list their lines 612 | 613 | 614 | 108 615 | 00:06:12,196 --> 00:06:13,306 616 | in alphabetical order. 617 | 618 | 619 | 109 620 | 00:06:13,676 --> 00:06:15,236 621 | Instead, they list 622 | them by color. 623 | 624 | 625 | 110 626 | 00:06:15,636 --> 00:06:18,476 627 | A and C are blue, 628 | B and D are orange. 629 | 630 | 631 | 111 632 | 00:06:21,646 --> 00:06:24,446 633 | You see the same ordering 634 | reflected in our product. 635 | 636 | 637 | 112 638 | 00:06:29,276 --> 00:06:32,106 639 | Trams and street cars are 640 | really the same type of vehicle, 641 | 642 | 643 | 113 644 | 00:06:32,466 --> 00:06:34,286 645 | but different cities 646 | specifically refer 647 | 648 | 649 | 114 650 | 00:06:34,286 --> 00:06:35,596 651 | to one or the other. 652 | 653 | 654 | 115 655 | 00:06:35,806 --> 00:06:38,686 656 | For example, in Toronto, 657 | you could tell a customer 658 | 659 | 660 | 116 661 | 00:06:38,686 --> 00:06:42,226 662 | to board the 510 Spadina Tram, 663 | but that's not really correct. 664 | 665 | 666 | 117 667 | 00:06:42,506 --> 00:06:45,136 668 | Everyone calls it the 669 | 510 Spadina streetcar, 670 | 671 | 672 | 118 673 | 00:06:45,616 --> 00:06:48,756 674 | so that's what we 675 | call it as well. 676 | 677 | 678 | 119 679 | 00:06:49,236 --> 00:06:55,296 680 | In Berlin, on the other 681 | hand, you ride trams. 682 | 683 | 684 | 120 685 | 00:06:59,056 --> 00:07:01,166 686 | And that is reflected 687 | in our experience. 688 | 689 | 690 | 121 691 | 00:07:01,636 --> 00:07:06,056 692 | Here's another example. 693 | 694 | 695 | 122 696 | 00:07:06,616 --> 00:07:09,286 697 | In San Francisco, you 698 | ride inbound and outbound. 699 | 700 | 701 | 123 702 | 00:07:09,776 --> 00:07:12,906 703 | Whereas in London or Toronto, 704 | you go northbound, southbound, 705 | 706 | 707 | 124 708 | 00:07:12,906 --> 00:07:13,916 709 | eastbound, and westbound. 710 | 711 | 712 | 125 713 | 00:07:14,316 --> 00:07:20,346 714 | But in New York, you 715 | go uptown and downtown. 716 | 717 | 718 | 126 719 | 00:07:20,446 --> 00:07:22,866 720 | Again, you see this 721 | reflected in our app. 722 | 723 | 724 | 127 725 | 00:07:25,636 --> 00:07:27,046 726 | One final example. 727 | 728 | 729 | 128 730 | 00:07:27,246 --> 00:07:30,486 731 | In Rio, the bus rapid transit 732 | systems are very important. 733 | 734 | 735 | 129 736 | 00:07:31,056 --> 00:07:33,296 737 | In many ways, they are 738 | the equals of the Metro 739 | 740 | 741 | 130 742 | 00:07:33,296 --> 00:07:34,546 743 | and commuter rail systems. 744 | 745 | 746 | 131 747 | 00:07:35,016 --> 00:07:37,716 748 | We raise the prominence of 749 | these bus rapid transit lines 750 | 751 | 752 | 132 753 | 00:07:37,716 --> 00:07:40,076 754 | on our map to reflect 755 | their importance. 756 | 757 | 758 | 133 759 | 00:07:40,586 --> 00:07:43,466 760 | That's the blue and orange lines 761 | 762 | 763 | 134 764 | 00:07:43,466 --> 00:07:45,176 765 | that you see in this 766 | screen shot. 767 | 768 | 769 | 135 770 | 00:07:48,656 --> 00:07:50,556 771 | Here is how we build 772 | up our feature. 773 | 774 | 775 | 136 776 | 00:07:51,296 --> 00:07:55,266 777 | We start with agency data for 778 | schedules, but then we survey 779 | 780 | 781 | 137 782 | 00:07:55,326 --> 00:07:57,096 783 | to add additional curated data. 784 | 785 | 786 | 138 787 | 00:07:57,276 --> 00:07:59,626 788 | For example, station 789 | entrances and line geometry 790 | 791 | 792 | 139 793 | 00:07:59,626 --> 00:08:00,766 794 | as we've previously seen. 795 | 796 | 797 | 140 798 | 00:08:01,836 --> 00:08:03,366 799 | Then we customize the experience 800 | 801 | 802 | 141 803 | 00:08:03,366 --> 00:08:05,806 804 | to respect the unique 805 | culture of each city. 806 | 807 | 808 | 142 809 | 00:08:06,576 --> 00:08:09,576 810 | Finally, this is all 811 | wrapped in our user interface 812 | 813 | 814 | 143 815 | 00:08:09,866 --> 00:08:11,696 816 | to bring delight 817 | to our customers. 818 | 819 | 820 | 144 821 | 00:08:15,596 --> 00:08:16,976 822 | Now, I'd like to give 823 | you a short demo. 824 | 825 | 826 | 145 827 | 00:08:25,106 --> 00:08:28,136 828 | Let's say you just flew into San 829 | Francisco International Airport, 830 | 831 | 832 | 146 833 | 00:08:28,326 --> 00:08:31,486 834 | and you'd like directions 835 | to Moscone West for WWDC. 836 | 837 | 838 | 147 839 | 00:08:32,395 --> 00:08:34,936 840 | First, you can see our 841 | multiagency transit map. 842 | 843 | 844 | 148 845 | 00:08:35,326 --> 00:08:38,336 846 | As I mentioned, transit lines 847 | are highlighted while roads 848 | 849 | 850 | 149 851 | 00:08:38,336 --> 00:08:38,885 852 | are dimmed. 853 | 854 | 855 | 150 856 | 00:08:39,486 --> 00:08:43,166 857 | Now, we're going to 858 | look at the departures 859 | 860 | 861 | 151 862 | 00:08:43,166 --> 00:08:44,376 863 | for Powell Street Station. 864 | 865 | 866 | 152 867 | 00:08:45,086 --> 00:08:48,056 868 | Powell Street is serviced 869 | by both BART and Muni, 870 | 871 | 872 | 153 873 | 00:08:48,056 --> 00:08:50,416 874 | and you can see the upcoming 875 | BART departures as well 876 | 877 | 878 | 154 879 | 00:08:50,446 --> 00:08:51,896 880 | as the upcoming Muni departures. 881 | 882 | 883 | 155 884 | 00:09:00,086 --> 00:09:02,446 885 | Now, at the top I noticed 886 | there was an advisory. 887 | 888 | 889 | 156 890 | 00:09:03,496 --> 00:09:04,556 891 | When I tap on details, 892 | 893 | 894 | 157 895 | 00:09:04,556 --> 00:09:07,366 896 | I see that Muni has some 897 | service changed in effect, 898 | 899 | 900 | 158 901 | 00:09:07,366 --> 00:09:09,476 902 | and we are communicating 903 | those service changes 904 | 905 | 906 | 159 907 | 00:09:09,476 --> 00:09:10,386 908 | to our customers. 909 | 910 | 911 | 160 912 | 00:09:17,836 --> 00:09:20,596 913 | You can zoom out to see 914 | the entire transit network 915 | 916 | 917 | 161 918 | 00:09:20,596 --> 00:09:20,976 919 | of the Bay Area. 920 | 921 | 922 | 162 923 | 00:09:29,506 --> 00:09:32,036 924 | Or you can zoom in 925 | to get more details. 926 | 927 | 928 | 163 929 | 00:09:35,336 --> 00:09:37,896 930 | The information density 931 | and the lines 932 | 933 | 934 | 164 935 | 00:09:37,896 --> 00:09:40,046 936 | that we show changes 937 | at each zoom. 938 | 939 | 940 | 165 941 | 00:09:40,796 --> 00:09:43,756 942 | Now, some people may want 943 | to have different choices. 944 | 945 | 946 | 166 947 | 00:09:44,166 --> 00:09:46,156 948 | So, for example, 949 | they may want to see 950 | 951 | 952 | 167 953 | 00:09:46,156 --> 00:09:47,556 954 | if a bus route is available. 955 | 956 | 957 | 168 958 | 00:09:48,096 --> 00:09:52,636 959 | In our product, you can select 960 | the exact vehicles that you'd 961 | 962 | 963 | 169 964 | 00:09:52,636 --> 00:09:53,806 965 | like to use for your journey. 966 | 967 | 968 | 170 969 | 00:09:54,846 --> 00:09:56,856 970 | Here is a competing bus route. 971 | 972 | 973 | 171 974 | 00:09:57,916 --> 00:09:59,986 975 | Now, we didn't recommend 976 | this because it takes longer. 977 | 978 | 979 | 172 980 | 00:10:00,486 --> 00:10:03,986 981 | But it's an option 982 | that's available to you. 983 | 984 | 985 | 173 986 | 00:10:04,696 --> 00:10:08,536 987 | So let's go back to our 988 | BART route and examine 989 | 990 | 991 | 174 992 | 00:10:08,536 --> 00:10:09,716 993 | that in greater detail. 994 | 995 | 996 | 175 997 | 00:10:13,776 --> 00:10:16,726 998 | The route planner tells you when 999 | to leave, how long it will take, 1000 | 1001 | 1002 | 176 1003 | 00:10:16,726 --> 00:10:17,946 1004 | and gives a summary 1005 | of the route. 1006 | 1007 | 1008 | 177 1009 | 00:10:18,386 --> 00:10:20,636 1010 | Tapping on this, I get 1011 | what we call the list view. 1012 | 1013 | 1014 | 178 1015 | 00:10:21,256 --> 00:10:23,266 1016 | A detailed list of 1017 | instructions to follow. 1018 | 1019 | 1020 | 179 1021 | 00:10:23,956 --> 00:10:26,736 1022 | I can expand the list 1023 | of stops if I'd like. 1024 | 1025 | 1026 | 180 1027 | 00:10:29,796 --> 00:10:33,106 1028 | Now, when I select start, 1029 | I enter guided navigation 1030 | 1031 | 1032 | 181 1033 | 00:10:33,106 --> 00:10:34,416 1034 | with detailed instructions. 1035 | 1036 | 1037 | 182 1038 | 00:10:34,746 --> 00:10:36,056 1039 | Since I'm already 1040 | at the airport, 1041 | 1042 | 1043 | 183 1044 | 00:10:36,096 --> 00:10:37,656 1045 | it just tells me 1046 | to board the train. 1047 | 1048 | 1049 | 184 1050 | 00:10:38,366 --> 00:10:41,346 1051 | Tells me to exit at Powell, and 1052 | shows me the previous station. 1053 | 1054 | 1055 | 185 1056 | 00:10:41,866 --> 00:10:44,896 1057 | Here you can see we're 1058 | recommending a very specific 1059 | 1060 | 1061 | 186 1062 | 00:10:44,896 --> 00:10:49,946 1063 | exit with an exit code, E3, 1064 | that's best for Moscone West. 1065 | 1066 | 1067 | 187 1068 | 00:10:52,256 --> 00:10:54,616 1069 | Finally, I arrive 1070 | at my destination. 1071 | 1072 | 1073 | 188 1074 | 00:10:59,656 --> 00:11:01,086 1075 | That concludes the presentation. 1076 | 1077 | 1078 | 189 1079 | 00:11:01,666 --> 00:11:04,256 1080 | For more information, 1081 | please visit this website 1082 | 1083 | 1084 | 190 1085 | 00:11:04,706 --> 00:11:08,806 1086 | or e mail 1087 | maps-transit@apple.com. 1088 | 1089 | 1090 | 191 1091 | 00:11:08,806 --> 00:11:09,976 1092 | Thanks for listening. 1093 | 1094 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/HD/509_hd_speech_recognition_api.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:19,286 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:19,786 --> 00:00:22,776 8 | >> Hi. I'm Henry Mason, 9 | an engineer working 10 | 11 | 12 | 3 13 | 00:00:22,776 --> 00:00:24,366 14 | on speech recognition for Siri. 15 | 16 | 17 | 4 18 | 00:00:25,486 --> 00:00:28,306 19 | Today we're incredibly excited 20 | to announce a brand new API 21 | 22 | 23 | 5 24 | 00:00:29,006 --> 00:00:31,376 25 | which will let our speech 26 | recognition solve problems 27 | 28 | 29 | 6 30 | 00:00:31,376 --> 00:00:32,386 31 | for your apps too. 32 | 33 | 34 | 7 35 | 00:00:35,246 --> 00:00:37,636 36 | A quick overview of what 37 | speech recognition is. 38 | 39 | 40 | 8 41 | 00:00:38,286 --> 00:00:40,616 42 | Speech recognition is 43 | the automatic process 44 | 45 | 46 | 9 47 | 00:00:40,616 --> 00:00:43,486 48 | of converting audio of 49 | human speech into text. 50 | 51 | 52 | 10 53 | 00:00:44,226 --> 00:00:46,276 54 | It depends on the 55 | language of the speech. 56 | 57 | 58 | 11 59 | 00:00:46,536 --> 00:00:47,976 60 | English will be recognized 61 | differently 62 | 63 | 64 | 12 65 | 00:00:47,976 --> 00:00:49,136 66 | than Chinese, for example. 67 | 68 | 69 | 13 70 | 00:00:50,196 --> 00:00:52,346 71 | On iOS, most people 72 | think of Siri 73 | 74 | 75 | 14 76 | 00:00:52,506 --> 00:00:55,376 77 | but speech recognition is also 78 | useful for many other tasks. 79 | 80 | 81 | 15 82 | 00:00:56,456 --> 00:00:58,776 83 | Since Siri was released 84 | with iPhone 4S, 85 | 86 | 87 | 16 88 | 00:00:59,166 --> 00:01:01,606 89 | iOS has also featured 90 | keyboard dictation. 91 | 92 | 93 | 17 94 | 00:01:02,776 --> 00:01:04,176 95 | That little microphone 96 | button next 97 | 98 | 99 | 18 100 | 00:01:04,176 --> 00:01:07,826 101 | to your iOS keyboard spacebar 102 | triggers speech recognition 103 | 104 | 105 | 19 106 | 00:01:07,826 --> 00:01:10,076 107 | for any UI kit text input. 108 | 109 | 110 | 20 111 | 00:01:11,116 --> 00:01:13,726 112 | Tens of thousands of apps 113 | every day use this feature. 114 | 115 | 116 | 21 117 | 00:01:14,266 --> 00:01:16,176 118 | In fact, about a third 119 | of all requests come 120 | 121 | 122 | 22 123 | 00:01:16,176 --> 00:01:17,286 124 | from third party apps. 125 | 126 | 127 | 23 128 | 00:01:18,356 --> 00:01:19,896 129 | It's extremely easy to use. 130 | 131 | 132 | 24 133 | 00:01:20,236 --> 00:01:23,356 134 | It handles audio recording 135 | and recording interruption. 136 | 137 | 138 | 25 139 | 00:01:23,476 --> 00:01:25,216 140 | It displays a user interface. 141 | 142 | 143 | 26 144 | 00:01:25,686 --> 00:01:28,106 145 | It doesn't require you to write 146 | anymore code than you would 147 | 148 | 149 | 27 150 | 00:01:28,106 --> 00:01:29,686 151 | to support any text input. 152 | 153 | 154 | 28 155 | 00:01:30,666 --> 00:01:32,446 156 | And it's been available 157 | since iOS 5. 158 | 159 | 160 | 29 161 | 00:01:36,026 --> 00:01:38,326 162 | But with its simplicity 163 | comes many limitations. 164 | 165 | 166 | 30 167 | 00:01:40,116 --> 00:01:42,376 168 | It often doesn't make sense 169 | for your user interface 170 | 171 | 172 | 31 173 | 00:01:42,376 --> 00:01:43,576 174 | to require a keyboard. 175 | 176 | 177 | 32 178 | 00:01:44,526 --> 00:01:47,146 179 | You can't control when the 180 | audio recording starts. 181 | 182 | 183 | 33 184 | 00:01:47,736 --> 00:01:49,876 185 | There's no control over 186 | which language is used. 187 | 188 | 189 | 34 190 | 00:01:49,996 --> 00:01:52,386 191 | It just happens to use the 192 | system's keyboard language. 193 | 194 | 195 | 35 196 | 00:01:53,166 --> 00:01:54,506 197 | There isn't even a way to know 198 | 199 | 200 | 36 201 | 00:01:54,506 --> 00:01:56,136 202 | if the dictation 203 | button is available. 204 | 205 | 206 | 37 207 | 00:01:58,176 --> 00:02:00,596 208 | The default audio recording 209 | might not make sense 210 | 211 | 212 | 38 213 | 00:02:00,596 --> 00:02:03,596 214 | for your use case and you 215 | may want more information 216 | 217 | 218 | 39 219 | 00:02:03,596 --> 00:02:06,726 220 | than just text. 221 | 222 | 223 | 40 224 | 00:02:07,166 --> 00:02:09,186 225 | So now in iOS 10, 226 | 227 | 228 | 41 229 | 00:02:09,186 --> 00:02:11,346 230 | we're introducing a 231 | new speech framework. 232 | 233 | 234 | 42 235 | 00:02:14,286 --> 00:02:17,246 236 | It uses the same underlying 237 | technology that we use 238 | 239 | 240 | 43 241 | 00:02:17,296 --> 00:02:18,536 242 | in Siri and Dictation. 243 | 244 | 245 | 44 246 | 00:02:19,576 --> 00:02:21,606 247 | It provides fast 248 | and accurate results 249 | 250 | 251 | 45 252 | 00:02:21,936 --> 00:02:24,166 253 | which are transparently 254 | customized to the user 255 | 256 | 257 | 46 258 | 00:02:24,666 --> 00:02:26,596 259 | without you having to 260 | collect any user data. 261 | 262 | 263 | 47 264 | 00:02:29,106 --> 00:02:31,576 265 | The framework also 266 | provides more information 267 | 268 | 269 | 48 270 | 00:02:33,356 --> 00:02:35,136 271 | about recognition 272 | than just text. 273 | 274 | 275 | 49 276 | 00:02:36,416 --> 00:02:39,066 277 | For example, we also provide 278 | alternative interpretations 279 | 280 | 281 | 50 282 | 00:02:39,066 --> 00:02:41,666 283 | of what your users might 284 | have said, confidence levels, 285 | 286 | 287 | 51 288 | 00:02:41,666 --> 00:02:42,866 289 | and timing information. 290 | 291 | 292 | 52 293 | 00:02:44,166 --> 00:02:46,316 294 | Audio for the API 295 | can be provided 296 | 297 | 298 | 53 299 | 00:02:46,316 --> 00:02:47,856 300 | from either pre-recorded files 301 | 302 | 303 | 54 304 | 00:02:47,966 --> 00:02:49,606 305 | or a live source 306 | like a microphone. 307 | 308 | 309 | 55 310 | 00:02:52,086 --> 00:02:55,616 311 | iOS 10 supports over 50 312 | languages and dialects 313 | 314 | 315 | 56 316 | 00:02:55,616 --> 00:02:56,976 317 | from Arabic to Vietnamese. 318 | 319 | 320 | 57 321 | 00:02:57,206 --> 00:03:01,256 322 | Any device which runs 323 | iOS 10 is supported. 324 | 325 | 326 | 58 327 | 00:03:03,006 --> 00:03:06,326 328 | The speech recognition API 329 | typically does its heavy lifting 330 | 331 | 332 | 59 333 | 00:03:06,326 --> 00:03:09,376 334 | on our big servers which 335 | requires an internet connection. 336 | 337 | 338 | 60 339 | 00:03:10,296 --> 00:03:14,976 340 | However, some newer devices do 341 | support speech recognition all 342 | 343 | 344 | 61 345 | 00:03:14,976 --> 00:03:15,476 346 | the time. 347 | 348 | 349 | 62 350 | 00:03:16,386 --> 00:03:18,906 351 | We provide an availability 352 | API to determine 353 | 354 | 355 | 63 356 | 00:03:18,906 --> 00:03:21,506 357 | if a given language is 358 | available at the moment. 359 | 360 | 361 | 64 362 | 00:03:21,506 --> 00:03:23,056 363 | Use this rather than looking 364 | 365 | 366 | 65 367 | 00:03:23,056 --> 00:03:25,226 368 | for internet connectivity 369 | explicitly. 370 | 371 | 372 | 66 373 | 00:03:28,356 --> 00:03:30,856 374 | Since speech recognition 375 | requires transmitting the user's 376 | 377 | 378 | 67 379 | 00:03:30,856 --> 00:03:32,096 380 | audio over the internet, 381 | 382 | 383 | 68 384 | 00:03:32,716 --> 00:03:34,796 385 | the user must explicitly 386 | provide permission 387 | 388 | 389 | 69 390 | 00:03:34,796 --> 00:03:37,766 391 | to your application before 392 | speech recognition can be used. 393 | 394 | 395 | 70 396 | 00:03:40,846 --> 00:03:42,196 397 | There are four major steps 398 | 399 | 400 | 71 401 | 00:03:42,196 --> 00:03:44,206 402 | to adopting speech 403 | recognition in your app. 404 | 405 | 406 | 72 407 | 00:03:46,726 --> 00:03:48,756 408 | First, provide a 409 | usage description 410 | 411 | 412 | 73 413 | 00:03:48,756 --> 00:03:50,116 414 | in your app's info.plist. 415 | 416 | 417 | 74 418 | 00:03:51,606 --> 00:03:54,636 419 | For example, your 420 | camera app, Phromage, 421 | 422 | 423 | 75 424 | 00:03:55,136 --> 00:03:57,306 425 | might have used a 426 | usage description 427 | 428 | 429 | 76 430 | 00:03:57,506 --> 00:04:01,536 431 | for speech recognition 432 | of this will allow you 433 | 434 | 435 | 77 436 | 00:04:01,736 --> 00:04:03,936 437 | to take a photo just 438 | by saying cheese. 439 | 440 | 441 | 78 442 | 00:04:05,966 --> 00:04:09,546 443 | Second, request authorization 444 | using the request authorization 445 | 446 | 447 | 79 448 | 00:04:09,546 --> 00:04:10,236 449 | class method. 450 | 451 | 452 | 80 453 | 00:04:11,536 --> 00:04:14,146 454 | The explanation you provided 455 | earlier will be presented 456 | 457 | 458 | 81 459 | 00:04:14,426 --> 00:04:16,596 460 | to the user in a 461 | familiar dialogue. 462 | 463 | 464 | 82 465 | 00:04:16,596 --> 00:04:19,346 466 | And the user will be able 467 | to decide if they want 468 | 469 | 470 | 83 471 | 00:04:19,346 --> 00:04:21,495 472 | to provide your app 473 | to speech recognition. 474 | 475 | 476 | 84 477 | 00:04:23,196 --> 00:04:25,336 478 | Next create a speech 479 | recognition request. 480 | 481 | 482 | 85 483 | 00:04:27,126 --> 00:04:29,156 484 | If you already have 485 | recorded audio file, 486 | 487 | 488 | 86 489 | 00:04:29,636 --> 00:04:32,606 490 | use the 491 | SFSpeechURLRecognitionRequest 492 | 493 | 494 | 87 495 | 00:04:32,606 --> 00:04:33,086 496 | class. 497 | 498 | 499 | 88 500 | 00:04:34,066 --> 00:04:34,946 501 | Otherwise, you'll want 502 | 503 | 504 | 89 505 | 00:04:34,946 --> 00:04:38,476 506 | to use the SFSpeechAudioBuffer 507 | RecognitionRequest class. 508 | 509 | 510 | 90 511 | 00:04:40,836 --> 00:04:42,806 512 | Finally hand the 513 | recognition request 514 | 515 | 516 | 91 517 | 00:04:42,806 --> 00:04:45,446 518 | to an SFSpeech recognizer 519 | to begin recognition. 520 | 521 | 522 | 92 523 | 00:04:46,456 --> 00:04:49,066 524 | You can optionally hold onto 525 | the returned recognition task 526 | 527 | 528 | 93 529 | 00:04:49,336 --> 00:04:50,836 530 | which can useful for monitoring 531 | 532 | 533 | 94 534 | 00:04:51,136 --> 00:04:52,856 535 | and controlling recognition 536 | progress. 537 | 538 | 539 | 95 540 | 00:04:56,356 --> 00:04:58,256 541 | Let's see what this 542 | all looks like in code. 543 | 544 | 545 | 96 546 | 00:04:59,286 --> 00:05:01,546 547 | We'll assume we've already 548 | updated our info.plist 549 | 550 | 551 | 97 552 | 00:05:01,546 --> 00:05:04,726 553 | with an accurate description 554 | of how will it be used. 555 | 556 | 557 | 98 558 | 00:05:05,066 --> 00:05:07,496 559 | Our next step is to 560 | request authorization. 561 | 562 | 563 | 99 564 | 00:05:08,486 --> 00:05:10,606 565 | It may be a good idea 566 | to wait to do this 567 | 568 | 569 | 100 570 | 00:05:10,606 --> 00:05:12,886 571 | until the user has invoked 572 | a feature of your app 573 | 574 | 575 | 101 576 | 00:05:12,886 --> 00:05:14,366 577 | which depends on 578 | speech recognition. 579 | 580 | 581 | 102 582 | 00:05:14,866 --> 00:05:20,036 583 | The request authorization class 584 | method takes the completion 585 | 586 | 587 | 103 588 | 00:05:20,036 --> 00:05:23,426 589 | handler which doesn't guarantee 590 | a particular execution context. 591 | 592 | 593 | 104 594 | 00:05:24,596 --> 00:05:26,976 595 | Apps will typically want to 596 | dispatch to the main queue 597 | 598 | 599 | 105 600 | 00:05:27,246 --> 00:05:29,046 601 | if they're going to do 602 | something like enable 603 | 604 | 605 | 106 606 | 00:05:29,046 --> 00:05:31,006 607 | or disable a user 608 | interface button. 609 | 610 | 611 | 107 612 | 00:05:33,636 --> 00:05:37,596 613 | If your authorization handler 614 | has given authorize status, 615 | 616 | 617 | 108 618 | 00:05:38,116 --> 00:05:39,896 619 | you should be ready 620 | to start recognition. 621 | 622 | 623 | 109 624 | 00:05:41,646 --> 00:05:44,296 625 | If not, recognition won't 626 | be available to your app. 627 | 628 | 629 | 110 630 | 00:05:45,586 --> 00:05:48,566 631 | It's important to gracefully 632 | disable necessary functionality 633 | 634 | 635 | 111 636 | 00:05:48,646 --> 00:05:50,106 637 | when the user makes 638 | this decision 639 | 640 | 641 | 112 642 | 00:05:50,886 --> 00:05:52,946 643 | or when the device is 644 | otherwise restricted 645 | 646 | 647 | 113 648 | 00:05:52,946 --> 00:05:54,506 649 | from accessing speech 650 | recognition. 651 | 652 | 653 | 114 654 | 00:05:55,496 --> 00:05:57,436 655 | Authorization can 656 | be changed later 657 | 658 | 659 | 115 660 | 00:05:57,466 --> 00:05:59,156 661 | in the device's privacy 662 | settings. 663 | 664 | 665 | 116 666 | 00:06:01,286 --> 00:06:04,066 667 | Let's see what it looks like 668 | to recognize a prerecorded 669 | 670 | 671 | 117 672 | 00:06:04,066 --> 00:06:04,796 673 | audio file. 674 | 675 | 676 | 118 677 | 00:06:05,956 --> 00:06:07,946 678 | We'll assume we already 679 | have a file url. 680 | 681 | 682 | 119 683 | 00:06:09,886 --> 00:06:12,526 684 | Recognition requires 685 | a speech recognizer 686 | 687 | 688 | 120 689 | 00:06:12,716 --> 00:06:14,716 690 | which only recognizes 691 | a single language. 692 | 693 | 694 | 121 695 | 00:06:15,536 --> 00:06:19,826 696 | The default initializer for 697 | SFSpeechRecognizer is failable. 698 | 699 | 700 | 122 701 | 00:06:20,336 --> 00:06:23,936 702 | So it'll return nil if the 703 | locale is not supported. 704 | 705 | 706 | 123 707 | 00:06:24,906 --> 00:06:27,726 708 | The default initializer uses 709 | device's current locale. 710 | 711 | 712 | 124 713 | 00:06:29,866 --> 00:06:32,236 714 | In this function, we'll just 715 | return one in this case. 716 | 717 | 718 | 125 719 | 00:06:34,586 --> 00:06:36,836 720 | While this speech 721 | recognition may be supported, 722 | 723 | 724 | 126 725 | 00:06:37,016 --> 00:06:39,316 726 | it may not be available, 727 | perhaps due 728 | 729 | 730 | 127 731 | 00:06:39,316 --> 00:06:40,846 732 | to having no internet 733 | connectivity. 734 | 735 | 736 | 128 737 | 00:06:41,966 --> 00:06:45,636 738 | Use the is available property on 739 | your recognizer to monitor this. 740 | 741 | 742 | 129 743 | 00:06:48,916 --> 00:06:50,686 744 | Now we create a recognition 745 | request 746 | 747 | 748 | 130 749 | 00:06:50,686 --> 00:06:52,916 750 | with the recorded 751 | file's url and give 752 | 753 | 754 | 131 755 | 00:06:52,916 --> 00:06:56,976 756 | that to the recognition task 757 | method of the recognizer. 758 | 759 | 760 | 132 761 | 00:07:02,046 --> 00:07:03,906 762 | This method takes 763 | completion handler 764 | 765 | 766 | 133 767 | 00:07:03,956 --> 00:07:06,366 768 | with two optional 769 | arguments, result and error. 770 | 771 | 772 | 134 773 | 00:07:07,696 --> 00:07:10,706 774 | If result is nil, that 775 | means recognition has failed 776 | 777 | 778 | 135 779 | 00:07:10,706 --> 00:07:11,456 780 | for some reason. 781 | 782 | 783 | 136 784 | 00:07:12,086 --> 00:07:14,106 785 | Check the error parameter 786 | for an explanation. 787 | 788 | 789 | 137 790 | 00:07:15,666 --> 00:07:18,896 791 | Otherwise, we can read the 792 | speech we recognize so far 793 | 794 | 795 | 138 796 | 00:07:19,306 --> 00:07:20,356 797 | by looking at results. 798 | 799 | 800 | 139 801 | 00:07:21,706 --> 00:07:24,916 802 | Note that the completion handler 803 | may be called more than once 804 | 805 | 806 | 140 807 | 00:07:25,326 --> 00:07:27,136 808 | as speech is recognized 809 | incrementally. 810 | 811 | 812 | 141 813 | 00:07:28,256 --> 00:07:30,506 814 | You can tell the 815 | recognition is finished 816 | 817 | 818 | 142 819 | 00:07:30,506 --> 00:07:33,746 820 | by checking the is final 821 | property of the result. 822 | 823 | 824 | 143 825 | 00:07:34,656 --> 00:07:37,386 826 | Here we'll just print the 827 | text of the final recognition. 828 | 829 | 830 | 144 831 | 00:07:43,926 --> 00:07:46,876 832 | Recognizing live audio from 833 | the device's microphone is very 834 | 835 | 836 | 145 837 | 00:07:46,876 --> 00:07:49,396 838 | similar but requires 839 | a few changes. 840 | 841 | 842 | 146 843 | 00:07:50,486 --> 00:07:53,176 844 | We'll make an audio buffer 845 | recognition request instead. 846 | 847 | 848 | 147 849 | 00:07:53,926 --> 00:07:55,486 850 | This allows us to 851 | provide a sequence 852 | 853 | 854 | 148 855 | 00:07:55,486 --> 00:07:58,386 856 | of in memory audio buffers 857 | instead of a file on disc. 858 | 859 | 860 | 149 861 | 00:07:59,696 --> 00:08:03,316 862 | Here we'll use AVAudioEngine to 863 | get a stream of audio buffers. 864 | 865 | 866 | 150 867 | 00:08:04,946 --> 00:08:06,306 868 | Then append them to the request. 869 | 870 | 871 | 151 872 | 00:08:07,456 --> 00:08:09,896 873 | Note that it's totally okay 874 | to append audio buffers 875 | 876 | 877 | 152 878 | 00:08:09,896 --> 00:08:11,906 879 | to a recognition 880 | request both before 881 | 882 | 883 | 153 884 | 00:08:11,906 --> 00:08:13,376 885 | and after starting recognition. 886 | 887 | 888 | 154 889 | 00:08:17,346 --> 00:08:20,596 890 | One difference here is that 891 | we no longer ignore the return 892 | 893 | 894 | 155 895 | 00:08:20,596 --> 00:08:22,616 896 | value of the recognition 897 | task method. 898 | 899 | 900 | 156 901 | 00:08:23,466 --> 00:08:25,616 902 | Instead we store it in 903 | a variable property. 904 | 905 | 906 | 157 907 | 00:08:26,366 --> 00:08:27,406 908 | We'll see why in a moment. 909 | 910 | 911 | 158 912 | 00:08:28,626 --> 00:08:32,696 913 | When we're done recording, 914 | we need to inform the request 915 | 916 | 917 | 159 918 | 00:08:32,696 --> 00:08:35,775 919 | that no more audio is coming so 920 | that it can finish recognition. 921 | 922 | 923 | 160 924 | 00:08:37,025 --> 00:08:39,046 925 | Use the end audio 926 | method to do this. 927 | 928 | 929 | 161 930 | 00:08:39,846 --> 00:08:42,076 931 | But what if the user 932 | cancels our recording 933 | 934 | 935 | 162 936 | 00:08:42,076 --> 00:08:43,885 937 | or the audio recording 938 | gets interrupted? 939 | 940 | 941 | 163 942 | 00:08:44,796 --> 00:08:47,236 943 | In this case, we really 944 | don't care about the results 945 | 946 | 947 | 164 948 | 00:08:47,416 --> 00:08:49,686 949 | and we should free up any 950 | resources still being used 951 | 952 | 953 | 165 954 | 00:08:49,686 --> 00:08:50,746 955 | by speech recognition. 956 | 957 | 958 | 166 959 | 00:08:52,786 --> 00:08:54,996 960 | Just cancel the recognition 961 | task that we started -- 962 | 963 | 964 | 167 965 | 00:08:55,196 --> 00:08:56,646 966 | we stored when we 967 | started recognition. 968 | 969 | 970 | 168 971 | 00:08:57,446 --> 00:08:59,856 972 | This can also be done for 973 | prerecorded audio recognition. 974 | 975 | 976 | 169 977 | 00:09:02,216 --> 00:09:04,516 978 | Now just a quick talk 979 | about some best practices. 980 | 981 | 982 | 170 983 | 00:09:07,276 --> 00:09:10,676 984 | We're making speech recognition 985 | available for free to all apps 986 | 987 | 988 | 171 989 | 00:09:11,256 --> 00:09:13,166 990 | but we do have some 991 | reasonable limits in place 992 | 993 | 994 | 172 995 | 00:09:13,166 --> 00:09:15,306 996 | so that the service remains 997 | available to everyone. 998 | 999 | 1000 | 173 1001 | 00:09:17,176 --> 00:09:19,426 1002 | Individual devices may 1003 | be limited in the amount 1004 | 1005 | 1006 | 174 1007 | 00:09:19,426 --> 00:09:21,416 1008 | of recognitions that can 1009 | be performed per day. 1010 | 1011 | 1012 | 175 1013 | 00:09:23,046 --> 00:09:25,216 1014 | Apps may also be 1015 | throttled globally 1016 | 1017 | 1018 | 176 1019 | 00:09:25,216 --> 00:09:26,886 1020 | on a request per day basis. 1021 | 1022 | 1023 | 177 1024 | 00:09:28,606 --> 00:09:32,986 1025 | Like other service backed 1026 | APIs, for example CLGO Coder, 1027 | 1028 | 1029 | 178 1030 | 00:09:33,656 --> 00:09:36,586 1031 | be prepared to handle network 1032 | and rate limiting failures. 1033 | 1034 | 1035 | 179 1036 | 00:09:38,326 --> 00:09:39,806 1037 | If you find that you're 1038 | routinely hitting your 1039 | 1040 | 1041 | 180 1042 | 00:09:39,806 --> 00:09:41,566 1043 | throttling limits, 1044 | please let us know. 1045 | 1046 | 1047 | 181 1048 | 00:09:42,576 --> 00:09:45,876 1049 | It's also important to be aware 1050 | 1051 | 1052 | 182 1053 | 00:09:45,876 --> 00:09:48,376 1054 | that speech recognition can 1055 | have a high cost in terms 1056 | 1057 | 1058 | 183 1059 | 00:09:48,376 --> 00:09:50,196 1060 | of battery drain 1061 | and network traffic. 1062 | 1063 | 1064 | 184 1065 | 00:09:52,336 --> 00:09:55,536 1066 | For iOS 10 we're starting with 1067 | a strict audio duration limit 1068 | 1069 | 1070 | 185 1071 | 00:09:55,536 --> 00:09:57,936 1072 | of about one minute 1073 | which is similar to that 1074 | 1075 | 1076 | 186 1077 | 00:09:57,936 --> 00:09:58,976 1078 | of keyboard dictation. 1079 | 1080 | 1081 | 187 1082 | 00:10:02,506 --> 00:10:04,576 1083 | A few words about 1084 | being transparent 1085 | 1086 | 1087 | 188 1088 | 00:10:04,576 --> 00:10:06,316 1089 | and respecting your 1090 | user's privacy. 1091 | 1092 | 1093 | 189 1094 | 00:10:07,676 --> 00:10:10,316 1095 | If you're recording the user's 1096 | speech, it's a great idea 1097 | 1098 | 1099 | 190 1100 | 00:10:10,316 --> 00:10:12,696 1101 | to make this crystal clear 1102 | in your user interface. 1103 | 1104 | 1105 | 191 1106 | 00:10:13,606 --> 00:10:16,706 1107 | Playing recording sounds and/or 1108 | displaying a visual recording 1109 | 1110 | 1111 | 192 1112 | 00:10:16,706 --> 00:10:18,536 1113 | indicator makes it 1114 | clear to your users 1115 | 1116 | 1117 | 193 1118 | 00:10:18,756 --> 00:10:19,866 1119 | that they're being recorded. 1120 | 1121 | 1122 | 194 1123 | 00:10:22,186 --> 00:10:24,726 1124 | Some speech is a bad 1125 | candidate for recognition. 1126 | 1127 | 1128 | 195 1129 | 00:10:25,556 --> 00:10:28,056 1130 | Passwords, health data, 1131 | financial information, 1132 | 1133 | 1134 | 196 1135 | 00:10:28,056 --> 00:10:30,086 1136 | and other sensitive 1137 | speech should not be given 1138 | 1139 | 1140 | 197 1141 | 00:10:30,086 --> 00:10:31,106 1142 | to speech recognition. 1143 | 1144 | 1145 | 198 1146 | 00:10:33,796 --> 00:10:36,396 1147 | Displaying speech as it 1148 | is recognized like Siri 1149 | 1150 | 1151 | 199 1152 | 00:10:36,396 --> 00:10:39,516 1153 | and Dictation do can also help 1154 | users understand what your app 1155 | 1156 | 1157 | 200 1158 | 00:10:39,516 --> 00:10:40,036 1159 | is doing. 1160 | 1161 | 1162 | 201 1163 | 00:10:40,966 --> 00:10:43,666 1164 | It can also be helpful for 1165 | users so that they can see 1166 | 1167 | 1168 | 202 1169 | 00:10:43,666 --> 00:10:45,146 1170 | when recognition errors occur. 1171 | 1172 | 1173 | 203 1174 | 00:10:47,896 --> 00:10:49,026 1175 | So developers. 1176 | 1177 | 1178 | 204 1179 | 00:10:49,456 --> 00:10:51,026 1180 | Your apps now have free access 1181 | 1182 | 1183 | 205 1184 | 00:10:51,026 --> 00:10:54,086 1185 | to high performance speech 1186 | recognition dozens of languages. 1187 | 1188 | 1189 | 206 1190 | 00:10:54,996 --> 00:10:56,826 1191 | But it's important to 1192 | gracefully handle cases 1193 | 1194 | 1195 | 207 1196 | 00:10:56,826 --> 00:10:57,756 1197 | where it's not available 1198 | 1199 | 1200 | 208 1201 | 00:10:57,756 --> 00:10:59,656 1202 | or the user doesn't 1203 | want your app to use it. 1204 | 1205 | 1206 | 209 1207 | 00:11:01,136 --> 00:11:02,966 1208 | Transparency is the best policy. 1209 | 1210 | 1211 | 210 1212 | 00:11:03,456 --> 00:11:04,396 1213 | Make it clear to the user 1214 | 1215 | 1216 | 211 1217 | 00:11:04,396 --> 00:11:06,246 1218 | when speech recognition 1219 | is being used. 1220 | 1221 | 1222 | 212 1223 | 00:11:07,916 --> 00:11:09,976 1224 | We're incredibly excited 1225 | to see what new uses 1226 | 1227 | 1228 | 213 1229 | 00:11:09,976 --> 00:11:11,946 1230 | for speech recognition 1231 | you come up with. 1232 | 1233 | 1234 | 214 1235 | 00:11:14,186 --> 00:11:16,416 1236 | For more information 1237 | and some sample code, 1238 | 1239 | 1240 | 215 1241 | 00:11:16,526 --> 00:11:18,096 1242 | check out this session's 1243 | webpage. 1244 | 1245 | 1246 | 216 1247 | 00:11:18,996 --> 00:11:21,396 1248 | You might also be interested 1249 | in some sessions on SiriKit. 1250 | 1251 | 1252 | 217 1253 | 00:11:21,956 --> 00:11:24,786 1254 | There's one on Wednesday and 1255 | the more advanced one later 1256 | 1257 | 1258 | 218 1259 | 00:11:24,786 --> 00:11:25,436 1260 | on Thursday. 1261 | 1262 | 1263 | 219 1264 | 00:11:26,706 --> 00:11:28,976 1265 | Thank you for your time 1266 | and have a great WWDC. 1267 | 1268 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/HD/724_hd_whats_new_in_the_apple_push_notification_service.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:17,500 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:21,606 --> 00:00:25,336 8 | >> Welcome to the 9 | session 724 on What's New 10 | 11 | 12 | 3 13 | 00:00:25,486 --> 00:00:27,516 14 | in Apple Push Notification 15 | Service. 16 | 17 | 18 | 4 19 | 00:00:28,136 --> 00:00:29,886 20 | My name is Mayur Mahajan. 21 | 22 | 23 | 5 24 | 00:00:30,426 --> 00:00:35,006 25 | And I work on the Apple Push 26 | Notification Service, or APNS. 27 | 28 | 29 | 6 30 | 00:00:35,426 --> 00:00:39,846 31 | And I'm excited to share with 32 | you what's coming to APNS. 33 | 34 | 35 | 7 36 | 00:00:40,366 --> 00:00:45,716 37 | Let's get started with a review 38 | of important enhancements 39 | 40 | 41 | 8 42 | 00:00:45,716 --> 00:00:47,036 43 | that were released last year. 44 | 45 | 46 | 9 47 | 00:00:48,106 --> 00:00:52,416 48 | First, we introduced a brand 49 | new provider protocol based 50 | 51 | 52 | 10 53 | 00:00:52,646 --> 00:00:55,236 54 | on HTTP/2 persistent Pushes. 55 | 56 | 57 | 11 58 | 00:00:56,076 --> 00:01:01,166 59 | HTTP/2 is a binary protocol 60 | that supports multiple streams 61 | 62 | 63 | 12 64 | 00:01:01,166 --> 00:01:04,836 65 | over a single connection 66 | and is extremely fast. 67 | 68 | 69 | 13 70 | 00:01:05,636 --> 00:01:08,506 71 | The new protocol has 72 | made it very easy 73 | 74 | 75 | 14 76 | 00:01:09,026 --> 00:01:11,436 77 | to send Push notifications 78 | to their devices. 79 | 80 | 81 | 15 82 | 00:01:11,976 --> 00:01:16,456 83 | The new protocol supports 84 | providing instant feedback 85 | 86 | 87 | 16 88 | 00:01:17,066 --> 00:01:20,576 89 | to indicate which device 90 | tokens are no longer active. 91 | 92 | 93 | 17 94 | 00:01:22,096 --> 00:01:25,466 95 | It is also possible to 96 | send larger payloads, 97 | 98 | 99 | 18 100 | 00:01:26,066 --> 00:01:29,226 101 | up to four kilobytes, that 102 | you can take advantage 103 | 104 | 105 | 19 106 | 00:01:29,226 --> 00:01:31,706 107 | of for creating rich 108 | applications. 109 | 110 | 111 | 20 112 | 00:01:32,216 --> 00:01:36,696 113 | In addition, we'll simplify 114 | the certificate handling 115 | 116 | 117 | 21 118 | 00:01:37,526 --> 00:01:41,996 119 | so you will now have to maintain 120 | fewer client certificates used 121 | 122 | 123 | 22 124 | 00:01:41,996 --> 00:01:43,786 125 | to connect to APNS. 126 | 127 | 128 | 23 129 | 00:01:44,316 --> 00:01:48,026 130 | We have received a lot 131 | of positive feedback 132 | 133 | 134 | 24 135 | 00:01:48,026 --> 00:01:49,366 136 | from the developer community. 137 | 138 | 139 | 25 140 | 00:01:50,676 --> 00:01:52,776 141 | We deliver hundreds of thousands 142 | 143 | 144 | 26 145 | 00:01:52,776 --> 00:01:55,786 146 | of notifications per second 147 | using this new protocol. 148 | 149 | 150 | 27 151 | 00:01:56,756 --> 00:01:59,796 152 | If you are not using this 153 | already you should definitely 154 | 155 | 156 | 28 157 | 00:01:59,796 --> 00:02:00,766 158 | try it. 159 | 160 | 161 | 29 162 | 00:02:03,446 --> 00:02:07,436 163 | So let's recap the sequence 164 | of steps that are involved 165 | 166 | 167 | 30 168 | 00:02:07,436 --> 00:02:09,076 169 | in sending Push notifications. 170 | 171 | 172 | 31 173 | 00:02:09,756 --> 00:02:12,956 174 | On the bottom right is 175 | your client application. 176 | 177 | 178 | 32 179 | 00:02:13,386 --> 00:02:16,736 180 | And on the top right 181 | is the provider, 182 | 183 | 184 | 33 185 | 00:02:17,116 --> 00:02:20,836 186 | which is the server component 187 | that connects to APNS 188 | 189 | 190 | 34 191 | 00:02:21,356 --> 00:02:23,156 192 | and sends Push notifications. 193 | 194 | 195 | 35 196 | 00:02:24,746 --> 00:02:27,166 197 | Now, before you start 198 | sending notifications, 199 | 200 | 201 | 36 202 | 00:02:27,866 --> 00:02:30,356 203 | you should register 204 | for Push notifications 205 | 206 | 207 | 37 208 | 00:02:30,506 --> 00:02:31,826 209 | in the developer account. 210 | 211 | 212 | 38 213 | 00:02:32,296 --> 00:02:37,216 214 | The application will register 215 | with the operating system, 216 | 217 | 218 | 39 219 | 00:02:37,776 --> 00:02:39,916 220 | running on the device 221 | on the bottom left. 222 | 223 | 224 | 40 225 | 00:02:41,156 --> 00:02:44,836 226 | The device will request 227 | a token from APNS 228 | 229 | 230 | 41 231 | 00:02:45,126 --> 00:02:46,936 232 | on behalf of the application. 233 | 234 | 235 | 42 236 | 00:02:47,726 --> 00:02:49,686 237 | And then return it back 238 | to your application. 239 | 240 | 241 | 43 242 | 00:02:50,236 --> 00:02:53,846 243 | This device token will be unique 244 | 245 | 246 | 44 247 | 00:02:53,846 --> 00:02:56,606 248 | for your application 249 | running on this device. 250 | 251 | 252 | 45 253 | 00:02:57,126 --> 00:03:02,056 254 | Your application should forward 255 | this token to the provider. 256 | 257 | 258 | 46 259 | 00:03:03,216 --> 00:03:06,286 260 | Now, the provider 261 | service will connect 262 | 263 | 264 | 47 265 | 00:03:06,286 --> 00:03:09,566 266 | to APNS using the 267 | client certificate 268 | 269 | 270 | 48 271 | 00:03:09,886 --> 00:03:14,166 272 | and then use standard 273 | HTTP/2 post request 274 | 275 | 276 | 49 277 | 00:03:15,016 --> 00:03:17,076 278 | to send a Push to 279 | that device token. 280 | 281 | 282 | 50 283 | 00:03:20,196 --> 00:03:26,616 284 | HTTP/2 provider API will provide 285 | an immediate response indicating 286 | 287 | 288 | 51 289 | 00:03:26,616 --> 00:03:28,866 290 | success if everything was okay. 291 | 292 | 293 | 52 294 | 00:03:29,766 --> 00:03:32,686 295 | And APNS has received 296 | and validated 297 | 298 | 299 | 53 300 | 00:03:32,826 --> 00:03:35,686 301 | that the Push request 302 | is [inaudible]. 303 | 304 | 305 | 54 306 | 00:03:36,576 --> 00:03:42,296 307 | Now, if there was an error, say 308 | the device token is not valid, 309 | 310 | 311 | 55 312 | 00:03:42,296 --> 00:03:47,456 313 | APNS will return an error 314 | status 400, or "invalid request" 315 | 316 | 317 | 56 318 | 00:03:48,156 --> 00:03:50,856 319 | with adjacent payload 320 | indicating the reason. 321 | 322 | 323 | 57 324 | 00:03:51,676 --> 00:03:54,356 325 | For example, a bad device token. 326 | 327 | 328 | 58 329 | 00:03:54,916 --> 00:04:00,486 330 | The new provider protocol also 331 | provides instant feedback. 332 | 333 | 334 | 59 335 | 00:04:01,056 --> 00:04:03,726 336 | So if a device token 337 | has been removed, 338 | 339 | 340 | 60 341 | 00:04:04,436 --> 00:04:10,276 342 | you will get an HTTP/2 response 343 | with status 410, or "removed." 344 | 345 | 346 | 61 347 | 00:04:10,896 --> 00:04:15,386 348 | It will have a time stamp 349 | in payload indicating 350 | 351 | 352 | 62 353 | 00:04:15,576 --> 00:04:20,396 354 | when APNS last learned that the 355 | device token has been removed. 356 | 357 | 358 | 63 359 | 00:04:24,116 --> 00:04:27,306 360 | We also simplified 361 | certificate handling as part 362 | 363 | 364 | 64 365 | 00:04:27,306 --> 00:04:29,006 366 | of the new provider protocol. 367 | 368 | 369 | 65 370 | 00:04:30,246 --> 00:04:33,196 371 | You can now provision 372 | a single certificate 373 | 374 | 375 | 66 376 | 00:04:33,546 --> 00:04:38,536 377 | for your application, 378 | complication, and VoiP Pushes. 379 | 380 | 381 | 67 382 | 00:04:39,056 --> 00:04:44,176 383 | The same certificate can 384 | be used in both development 385 | 386 | 387 | 68 388 | 00:04:44,446 --> 00:04:46,016 389 | and production environments. 390 | 391 | 392 | 69 393 | 00:04:47,246 --> 00:04:51,046 394 | This has reduced the 395 | headaches of managing, renewing 396 | 397 | 398 | 70 399 | 00:04:51,366 --> 00:04:54,046 400 | and revocation of 401 | multiple certificates 402 | 403 | 404 | 71 405 | 00:04:54,076 --> 00:04:55,386 406 | for many developers. 407 | 408 | 409 | 72 410 | 00:04:55,926 --> 00:04:58,966 411 | Now, we are listening 412 | to feedback 413 | 414 | 415 | 73 416 | 00:04:58,996 --> 00:05:00,436 417 | from developers like you. 418 | 419 | 420 | 74 421 | 00:05:01,076 --> 00:05:02,936 422 | And we understand the importance 423 | 424 | 425 | 75 426 | 00:05:03,036 --> 00:05:05,966 427 | of simplifying the work 428 | flow that's involved 429 | 430 | 431 | 76 432 | 00:05:06,106 --> 00:05:07,786 433 | in sending Push notifications. 434 | 435 | 436 | 77 437 | 00:05:09,046 --> 00:05:12,696 438 | We understand that managing 439 | certificates is too complex 440 | 441 | 442 | 78 443 | 00:05:12,846 --> 00:05:14,036 444 | for some applications. 445 | 446 | 447 | 79 448 | 00:05:14,606 --> 00:05:20,246 449 | So today we are thrilled 450 | to announce a brand new 451 | 452 | 453 | 80 454 | 00:05:20,596 --> 00:05:24,726 455 | and a simple way of 456 | authenticating against APNS. 457 | 458 | 459 | 81 460 | 00:05:25,976 --> 00:05:28,706 461 | Introducing token authentication 462 | 463 | 464 | 82 465 | 00:05:28,916 --> 00:05:31,566 466 | for Apple Push notification 467 | service. 468 | 469 | 470 | 83 471 | 00:05:32,006 --> 00:05:40,596 472 | Token authentication is a way 473 | of using provider tokens instead 474 | 475 | 476 | 84 477 | 00:05:40,596 --> 00:05:44,186 478 | of client certificate when 479 | sending notifications. 480 | 481 | 482 | 85 483 | 00:05:47,546 --> 00:05:50,466 484 | The authentication 485 | tokens are intended 486 | 487 | 488 | 86 489 | 00:05:50,466 --> 00:05:54,056 490 | to simplify how services 491 | connect to APNS. 492 | 493 | 494 | 87 495 | 00:05:55,176 --> 00:05:59,606 496 | In addition, the tokens are easy 497 | to generate programmatically, 498 | 499 | 500 | 88 501 | 00:06:00,446 --> 00:06:03,316 502 | so there is no need 503 | to worry about having 504 | 505 | 506 | 89 507 | 00:06:03,316 --> 00:06:05,596 508 | to reissue expiring 509 | certificates. 510 | 511 | 512 | 90 513 | 00:06:06,916 --> 00:06:11,086 514 | This is enabled through 515 | the use of JSON Web tokens 516 | 517 | 518 | 91 519 | 00:06:11,566 --> 00:06:15,396 520 | as a mechanism to generate 521 | authentication credentials. 522 | 523 | 524 | 92 525 | 00:06:15,396 --> 00:06:20,826 526 | There are a number of libraries 527 | widely available for use 528 | 529 | 530 | 93 531 | 00:06:20,986 --> 00:06:23,536 532 | with the programming 533 | language of your choice 534 | 535 | 536 | 94 537 | 00:06:23,736 --> 00:06:25,076 538 | to generate these tokens. 539 | 540 | 541 | 95 542 | 00:06:25,626 --> 00:06:29,746 543 | Now, before we get 544 | into the details 545 | 546 | 547 | 96 548 | 00:06:30,336 --> 00:06:32,326 549 | of how token authentication 550 | works, 551 | 552 | 553 | 97 554 | 00:06:32,326 --> 00:06:36,436 555 | let's first recap how 556 | certificate authentication 557 | 558 | 559 | 98 560 | 00:06:36,436 --> 00:06:37,306 561 | will work. 562 | 563 | 564 | 99 565 | 00:06:39,696 --> 00:06:40,546 566 | You opt in. 567 | 568 | 569 | 100 570 | 00:06:41,036 --> 00:06:46,746 571 | Provide a client certificate 572 | from your developer account. 573 | 574 | 575 | 101 576 | 00:06:48,066 --> 00:06:52,056 577 | When connecting to APNS 578 | using mutual authentication, 579 | 580 | 581 | 102 582 | 00:06:53,026 --> 00:06:56,156 583 | APNS will provide a 584 | server certificate 585 | 586 | 587 | 103 588 | 00:06:56,646 --> 00:06:58,786 589 | that you will trust 590 | and validate. 591 | 592 | 593 | 104 594 | 00:06:59,256 --> 00:07:01,666 595 | As part of the handshake, 596 | 597 | 598 | 105 599 | 00:07:02,276 --> 00:07:05,816 600 | your provider will also 601 | sign the client certificate, 602 | 603 | 604 | 106 605 | 00:07:06,316 --> 00:07:11,306 606 | which APNS will validate and 607 | use to establish credentials. 608 | 609 | 610 | 107 611 | 00:07:12,096 --> 00:07:16,216 612 | At this point, there is a 613 | trusted connection established 614 | 615 | 616 | 108 617 | 00:07:16,216 --> 00:07:19,066 618 | between APNS and the provider. 619 | 620 | 621 | 109 622 | 00:07:20,576 --> 00:07:24,076 623 | Any Pushes you send on this 624 | connection are attached 625 | 626 | 627 | 110 628 | 00:07:24,266 --> 00:07:28,000 629 | to the application identified 630 | by the client certificate. 631 | 632 | 633 | 111 634 | 00:07:32,436 --> 00:07:35,716 635 | When using token 636 | authentication, you should opt 637 | 638 | 639 | 112 640 | 00:07:35,716 --> 00:07:38,606 641 | in a token sign-in 642 | key from the account. 643 | 644 | 645 | 113 646 | 00:07:40,246 --> 00:07:43,676 647 | Your provider will then 648 | establish a PLS connection 649 | 650 | 651 | 114 652 | 00:07:44,316 --> 00:07:45,816 653 | without a client certificate. 654 | 655 | 656 | 115 657 | 00:07:46,806 --> 00:07:49,526 658 | However, before sending 659 | notifications 660 | 661 | 662 | 116 663 | 00:07:49,526 --> 00:07:54,176 664 | on this connection, the provider 665 | will construct an authentication 666 | 667 | 668 | 117 669 | 00:07:54,176 --> 00:07:57,286 670 | token that includes 671 | your team ID. 672 | 673 | 674 | 118 675 | 00:07:58,086 --> 00:08:02,066 676 | And then sign it using 677 | the key opt indicator. 678 | 679 | 680 | 119 681 | 00:08:06,686 --> 00:08:10,046 682 | Now it's possible to 683 | send notifications 684 | 685 | 686 | 120 687 | 00:08:10,046 --> 00:08:10,926 688 | on this connection. 689 | 690 | 691 | 121 692 | 00:08:12,146 --> 00:08:16,996 693 | Every notification message 694 | that's signed must include the 695 | 696 | 697 | 122 698 | 00:08:16,996 --> 00:08:18,026 699 | authentication token. 700 | 701 | 702 | 123 703 | 00:08:19,226 --> 00:08:23,766 704 | Also, the application topic 705 | should be part of this request. 706 | 707 | 708 | 124 709 | 00:08:24,146 --> 00:08:29,976 710 | APNS will first authenticate 711 | the provider using the token 712 | 713 | 714 | 125 715 | 00:08:30,566 --> 00:08:32,486 716 | and then process the request. 717 | 718 | 719 | 126 720 | 00:08:33,076 --> 00:08:37,716 721 | If this request is 722 | processed successfully, 723 | 724 | 725 | 127 726 | 00:08:37,716 --> 00:08:43,566 727 | APNS will send a response 728 | back indicating success. 729 | 730 | 731 | 128 732 | 00:08:44,155 --> 00:08:47,896 733 | If no token was provided 734 | with the request 735 | 736 | 737 | 129 738 | 00:08:48,036 --> 00:08:50,236 739 | or if the token was invalid, 740 | 741 | 742 | 130 743 | 00:08:51,266 --> 00:08:54,616 744 | a response will be sent 745 | back indicating the error. 746 | 747 | 748 | 131 749 | 00:08:55,166 --> 00:09:01,796 750 | As a reminder, APNS will not 751 | close the connection on error. 752 | 753 | 754 | 132 755 | 00:09:03,346 --> 00:09:06,926 756 | So let's take a look at how 757 | to generate a provider token. 758 | 759 | 760 | 133 761 | 00:09:08,606 --> 00:09:11,926 762 | You should start with 763 | provisioning a sign-in key 764 | 765 | 766 | 134 767 | 00:09:12,626 --> 00:09:15,616 768 | from the certificates, 769 | identities 770 | 771 | 772 | 135 773 | 00:09:15,886 --> 00:09:18,126 774 | and profile section 775 | in the account. 776 | 777 | 778 | 136 779 | 00:09:18,626 --> 00:09:23,716 780 | A public-private 781 | keypad is generated. 782 | 783 | 784 | 137 785 | 00:09:24,326 --> 00:09:27,456 786 | And the private key 787 | can then be used 788 | 789 | 790 | 138 791 | 00:09:27,766 --> 00:09:31,366 792 | to cryptographically 793 | sign the token data. 794 | 795 | 796 | 139 797 | 00:09:32,656 --> 00:09:35,196 798 | Apple will use the 799 | corresponding public key 800 | 801 | 802 | 140 803 | 00:09:35,966 --> 00:09:37,576 804 | for validating the token. 805 | 806 | 807 | 141 808 | 00:09:38,036 --> 00:09:42,206 809 | Next, let's look at how 810 | you construct the token. 811 | 812 | 813 | 142 814 | 00:09:42,816 --> 00:09:51,336 815 | At the top is an example of what 816 | a JSON Web token that's part 817 | 818 | 819 | 143 820 | 00:09:51,336 --> 00:09:53,766 821 | of the request might look like. 822 | 823 | 824 | 144 825 | 00:09:55,416 --> 00:09:58,566 826 | Let's go over the structure 827 | of this JSON Web token. 828 | 829 | 830 | 145 831 | 00:10:01,086 --> 00:10:02,786 832 | You can see it has three parts. 833 | 834 | 835 | 146 836 | 00:10:03,386 --> 00:10:09,606 837 | Each part is a URL friendly 838 | base-64 encoded string that's 839 | 840 | 841 | 147 842 | 00:10:09,606 --> 00:10:11,906 843 | delimited by a period. 844 | 845 | 846 | 148 847 | 00:10:13,106 --> 00:10:15,566 848 | Below is the decoded 849 | representation 850 | 851 | 852 | 149 853 | 00:10:15,566 --> 00:10:16,636 854 | of this Web token. 855 | 856 | 857 | 150 858 | 00:10:17,166 --> 00:10:20,616 859 | The first part is the header. 860 | 861 | 862 | 151 863 | 00:10:21,826 --> 00:10:23,856 864 | And it includes attributes 865 | 866 | 867 | 152 868 | 00:10:24,016 --> 00:10:27,936 869 | that specify the algorithm 870 | used to sign the token. 871 | 872 | 873 | 153 874 | 00:10:28,746 --> 00:10:31,866 875 | In our case, it's ES256. 876 | 877 | 878 | 154 879 | 00:10:32,636 --> 00:10:38,036 880 | It will also include the 881 | key identifier for the key 882 | 883 | 884 | 155 885 | 00:10:38,586 --> 00:10:40,116 886 | that is used to sign the token. 887 | 888 | 889 | 156 890 | 00:10:40,696 --> 00:10:47,076 891 | The claims section will 892 | include an assurer tribute, 893 | 894 | 895 | 157 896 | 00:10:47,556 --> 00:10:50,596 897 | which is your developer team ID 898 | 899 | 900 | 158 901 | 00:10:51,156 --> 00:10:53,226 902 | that can be obtained 903 | from the account. 904 | 905 | 906 | 159 907 | 00:10:53,696 --> 00:11:00,016 908 | The next attribute in the claims 909 | is initial time stamp that's 910 | 911 | 912 | 160 913 | 00:11:00,016 --> 00:11:03,066 914 | expressed as seconds 915 | since epoch. 916 | 917 | 918 | 161 919 | 00:11:04,536 --> 00:11:07,696 920 | The last part of the token 921 | is simply the signature 922 | 923 | 924 | 162 925 | 00:11:07,896 --> 00:11:11,726 926 | in base 64 obtained by 927 | applying the signing algorithm 928 | 929 | 930 | 163 931 | 00:11:12,286 --> 00:11:14,146 932 | to the header and the claims. 933 | 934 | 935 | 164 936 | 00:11:15,436 --> 00:11:17,856 937 | This prevents any 938 | unauthorized tampering 939 | 940 | 941 | 165 942 | 00:11:18,366 --> 00:11:21,000 943 | of the token once 944 | it is generated. 945 | 946 | 947 | 166 948 | 00:11:25,326 --> 00:11:28,666 949 | Here is what an HTTP/2 creates 950 | 951 | 952 | 167 953 | 00:11:28,776 --> 00:11:31,866 954 | for a request using token 955 | authentication will look like. 956 | 957 | 958 | 168 959 | 00:11:33,036 --> 00:11:37,036 960 | As you can see, this 961 | request contains a header 962 | 963 | 964 | 169 965 | 00:11:37,116 --> 00:11:38,036 966 | and a data frame. 967 | 968 | 969 | 170 970 | 00:11:39,136 --> 00:11:40,586 971 | The header frame consists 972 | 973 | 974 | 171 975 | 00:11:40,586 --> 00:11:44,306 976 | of various header fields 977 | including APNS topic. 978 | 979 | 980 | 172 981 | 00:11:45,566 --> 00:11:50,016 982 | Now, you will notice that the 983 | header frame now includes an 984 | 985 | 986 | 173 987 | 00:11:50,016 --> 00:11:54,896 988 | authorization header with 989 | the value "bearer" followed 990 | 991 | 992 | 174 993 | 00:11:54,896 --> 00:11:56,476 994 | by the signed provider token. 995 | 996 | 997 | 175 998 | 00:11:57,036 --> 00:12:02,896 999 | If the request including the 1000 | authentication token is valid, 1001 | 1002 | 1003 | 176 1004 | 00:12:03,816 --> 00:12:07,386 1005 | the response will be 1006 | status 200 or "OK." 1007 | 1008 | 1009 | 177 1010 | 00:12:11,426 --> 00:12:13,106 1011 | Here is what the 1012 | response will look 1013 | 1014 | 1015 | 178 1016 | 00:12:13,636 --> 00:12:16,316 1017 | if the provider token 1018 | was not valid. 1019 | 1020 | 1021 | 179 1022 | 00:12:17,576 --> 00:12:21,876 1023 | In this case, it is 1024 | status 403, or "Forbidden." 1025 | 1026 | 1027 | 180 1028 | 00:12:23,346 --> 00:12:28,186 1029 | Now, APNS will require 1030 | that new tokens be 1031 | 1032 | 1033 | 181 1034 | 00:12:28,186 --> 00:12:29,506 1035 | periodically generated. 1036 | 1037 | 1038 | 182 1039 | 00:12:30,096 --> 00:12:36,926 1040 | If the token is too old, 1041 | the response will, again, 1042 | 1043 | 1044 | 183 1045 | 00:12:37,056 --> 00:12:42,096 1046 | be a 403 "Forbidden" error 1047 | with reason indicating 1048 | 1049 | 1050 | 184 1051 | 00:12:42,366 --> 00:12:44,036 1052 | that the token has expired. 1053 | 1054 | 1055 | 185 1056 | 00:12:44,526 --> 00:12:51,406 1057 | APNS will require that the 1058 | token creation time must be 1059 | 1060 | 1061 | 186 1062 | 00:12:51,406 --> 00:12:53,396 1063 | within the last hour. 1064 | 1065 | 1066 | 187 1067 | 00:12:54,376 --> 00:12:59,196 1068 | However, a new token should not 1069 | be generated on every request. 1070 | 1071 | 1072 | 188 1073 | 00:13:00,126 --> 00:13:03,176 1074 | In fact, for performance 1075 | we recommend 1076 | 1077 | 1078 | 189 1079 | 00:13:03,516 --> 00:13:07,486 1080 | that the token be reused 1081 | as long as it is valid. 1082 | 1083 | 1084 | 190 1085 | 00:13:11,486 --> 00:13:15,226 1086 | So here are a few more details 1087 | regarding token authentication. 1088 | 1089 | 1090 | 191 1091 | 00:13:16,506 --> 00:13:20,676 1092 | As mentioned earlier, 1093 | the provider tokens need 1094 | 1095 | 1096 | 192 1097 | 00:13:20,676 --> 00:13:22,286 1098 | to be generated periodically. 1099 | 1100 | 1101 | 193 1102 | 00:13:23,346 --> 00:13:27,296 1103 | However, note that the 1104 | sign-in key does not expire. 1105 | 1106 | 1107 | 194 1108 | 00:13:28,656 --> 00:13:32,356 1109 | Now, if you suspect that the 1110 | sign-in key may have been 1111 | 1112 | 1113 | 195 1114 | 00:13:32,356 --> 00:13:36,556 1115 | compromised, you can revoke 1116 | the key from your account 1117 | 1118 | 1119 | 196 1120 | 00:13:36,976 --> 00:13:38,826 1121 | and provision a new key. 1122 | 1123 | 1124 | 197 1125 | 00:13:39,386 --> 00:13:44,166 1126 | As a reminder, APNS 1127 | will continue 1128 | 1129 | 1130 | 198 1131 | 00:13:44,486 --> 00:13:46,236 1132 | to support certificate 1133 | authentication. 1134 | 1135 | 1136 | 199 1137 | 00:13:46,826 --> 00:13:50,716 1138 | So that is token authentication. 1139 | 1140 | 1141 | 200 1142 | 00:13:51,806 --> 00:13:54,366 1143 | And it's coming later this year. 1144 | 1145 | 1146 | 201 1147 | 00:13:54,946 --> 00:14:01,196 1148 | For more information visit 1149 | the Website for this session 1150 | 1151 | 1152 | 202 1153 | 00:14:01,876 --> 00:14:10,246 1154 | at 1155 | developer.apple.com/wwdc16/724. 1156 | 1157 | 1158 | 203 1159 | 00:14:12,856 --> 00:14:15,586 1160 | Here are relevant 1161 | sessions on notifications 1162 | 1163 | 1164 | 204 1165 | 00:14:15,786 --> 00:14:19,116 1166 | that you might be 1167 | interested in: Introduction 1168 | 1169 | 1170 | 205 1171 | 00:14:19,116 --> 00:14:23,476 1172 | to Notifications will be in 1173 | Pacific Heights on Wednesday 1174 | 1175 | 1176 | 206 1177 | 00:14:23,846 --> 00:14:27,086 1178 | at 9:00 a.m. followed 1179 | by a session 1180 | 1181 | 1182 | 207 1183 | 00:14:27,256 --> 00:14:31,416 1184 | on Advanced Notifications in 1185 | Pacific Heights on Wednesday 1186 | 1187 | 1188 | 208 1189 | 00:14:31,696 --> 00:14:34,496 1190 | at 10:00 a.m. And we 1191 | hope to see you there. 1192 | 1193 | 1194 | 209 1195 | 00:14:35,126 --> 00:14:36,136 1196 | Thank you very much. 1197 | 1198 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/HD/725_hd_deploying_airprint_in_enterprise.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:06,516 --> 00:00:19,106 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:19,606 --> 00:00:21,376 8 | >> Hi. I'm Todd Ritland, 9 | AirPrint engineer 10 | 11 | 12 | 3 13 | 00:00:21,786 --> 00:00:23,606 14 | and the lead engineer 15 | on iOS printing. 16 | 17 | 18 | 4 19 | 00:00:24,646 --> 00:00:27,166 20 | And this is Deploying 21 | AirPrint in Enterprise. 22 | 23 | 24 | 5 25 | 00:00:30,296 --> 00:00:32,356 26 | AirPrint is Apple's 27 | total printing solution. 28 | 29 | 30 | 6 31 | 00:00:32,976 --> 00:00:34,556 32 | It's a technology that helps you 33 | 34 | 35 | 7 36 | 00:00:34,556 --> 00:00:37,476 37 | to create full-quality 38 | printed output without the need 39 | 40 | 41 | 8 42 | 00:00:37,476 --> 00:00:39,236 43 | to download or install drivers. 44 | 45 | 46 | 9 47 | 00:00:40,546 --> 00:00:42,516 48 | If you're an app developer 49 | and want to add printing 50 | 51 | 52 | 10 53 | 00:00:42,516 --> 00:00:46,426 54 | to your app, see 55 | developer.apple.com/airprint 56 | 57 | 58 | 11 59 | 00:00:46,516 --> 00:00:51,106 60 | for a previous talk I gave at 61 | WWDC titled Advances in AirPrint 62 | 63 | 64 | 12 65 | 00:00:51,806 --> 00:00:53,566 66 | and download the sample 67 | code to get started. 68 | 69 | 70 | 13 71 | 00:00:54,806 --> 00:00:56,326 72 | If you are a printer 73 | manufacturer 74 | 75 | 76 | 14 77 | 00:00:56,666 --> 00:00:58,566 78 | or a print server 79 | developer and wish 80 | 81 | 82 | 15 83 | 00:00:58,566 --> 00:01:00,726 84 | to license AirPrint 85 | technology for your product, 86 | 87 | 88 | 16 89 | 00:01:01,506 --> 00:01:03,766 90 | please email airprint@apple.com. 91 | 92 | 93 | 17 94 | 00:01:05,325 --> 00:01:07,636 95 | This talk will focus on 96 | those who are responsible 97 | 98 | 99 | 18 100 | 00:01:07,636 --> 00:01:09,516 101 | for deploying AirPrint 102 | and want to learn more 103 | 104 | 105 | 19 106 | 00:01:09,516 --> 00:01:11,056 107 | about all the enterprise 108 | features 109 | 110 | 111 | 20 112 | 00:01:11,216 --> 00:01:13,616 113 | that make AirPrint work great 114 | in enterprise environments. 115 | 116 | 117 | 21 118 | 00:01:16,426 --> 00:01:18,626 119 | Printing in enterprise has 120 | many unique requirements. 121 | 122 | 123 | 22 124 | 00:01:19,206 --> 00:01:22,026 125 | Our enterprise customers 126 | are dealing with a fleet 127 | 128 | 129 | 23 130 | 00:01:22,026 --> 00:01:24,226 131 | of printers, often 132 | from many manufacturers 133 | 134 | 135 | 24 136 | 00:01:24,226 --> 00:01:27,376 137 | and with different features, 138 | across floors of buildings 139 | 140 | 141 | 25 142 | 00:01:27,376 --> 00:01:28,926 143 | or across many different 144 | buildings, 145 | 146 | 147 | 26 148 | 00:01:29,436 --> 00:01:30,536 149 | and in many locations. 150 | 151 | 152 | 27 153 | 00:01:31,666 --> 00:01:33,716 154 | These can be hugely 155 | complex printers as well. 156 | 157 | 158 | 28 159 | 00:01:35,786 --> 00:01:38,316 160 | The network infrastructure 161 | is often very complex. 162 | 163 | 164 | 29 165 | 00:01:39,576 --> 00:01:41,756 166 | Often they're wireless 167 | and wired clients 168 | 169 | 170 | 30 171 | 00:01:42,616 --> 00:01:45,076 172 | and their network 173 | structure may be unrelated 174 | 175 | 176 | 31 177 | 00:01:45,076 --> 00:01:46,806 178 | to the physical location 179 | in a building. 180 | 181 | 182 | 32 183 | 00:01:48,936 --> 00:01:51,706 184 | IT departments also have 185 | varying network requirements, 186 | 187 | 188 | 33 189 | 00:01:51,706 --> 00:01:53,756 190 | such as no access 191 | to software update, 192 | 193 | 194 | 34 195 | 00:01:54,296 --> 00:01:56,286 196 | no multicast packet 197 | traffic allowed, 198 | 199 | 200 | 35 201 | 00:01:56,816 --> 00:02:00,366 202 | and certain ports blocks, which 203 | all have impact on printers. 204 | 205 | 206 | 36 207 | 00:02:01,616 --> 00:02:04,596 208 | Enterprise customers also may 209 | have accounting requirements 210 | 211 | 212 | 37 213 | 00:02:05,046 --> 00:02:06,906 214 | since every page 215 | printed costs money. 216 | 217 | 218 | 38 219 | 00:02:08,466 --> 00:02:12,436 220 | And of course security 221 | requirements are essential 222 | 223 | 224 | 39 225 | 00:02:12,436 --> 00:02:14,516 226 | and are increasingly important 227 | in enterprise printing. 228 | 229 | 230 | 40 231 | 00:02:18,046 --> 00:02:22,446 232 | The top requests we get from 233 | enterprise are the ability 234 | 235 | 236 | 41 237 | 00:02:22,446 --> 00:02:27,276 238 | to create PDF and have more 239 | paper-free workflows, security, 240 | 241 | 242 | 42 243 | 00:02:27,986 --> 00:02:29,436 244 | access control and accounting, 245 | 246 | 247 | 43 248 | 00:02:30,376 --> 00:02:31,806 249 | and better discovery 250 | of printers. 251 | 252 | 253 | 44 254 | 00:02:33,036 --> 00:02:34,596 255 | So let's go into 256 | what AirPrint offers 257 | 258 | 259 | 45 260 | 00:02:34,596 --> 00:02:35,836 261 | for each of these in detail. 262 | 263 | 264 | 46 265 | 00:02:38,236 --> 00:02:40,386 266 | First, create PDF 267 | from the Print panel. 268 | 269 | 270 | 47 271 | 00:02:41,896 --> 00:02:43,646 272 | Mac OS has long had the ability 273 | 274 | 275 | 48 276 | 00:02:43,646 --> 00:02:46,056 277 | to get a PDF anywhere 278 | you can print. 279 | 280 | 281 | 49 282 | 00:02:46,896 --> 00:02:49,666 283 | And now in iOS 10, all iOS 284 | devices have this ability 285 | 286 | 287 | 50 288 | 00:02:49,666 --> 00:02:50,976 289 | as well and I'd like to 290 | show you how this works. 291 | 292 | 293 | 51 294 | 00:02:56,116 --> 00:03:00,716 295 | Here we have an iPad running 296 | iOS 10, and when I tap Print, 297 | 298 | 299 | 52 300 | 00:03:01,626 --> 00:03:04,576 301 | I just pinch out with my two 302 | fingers on the Print Preview. 303 | 304 | 305 | 53 306 | 00:03:07,746 --> 00:03:09,976 307 | And from here, I have a Share 308 | button at the top corner. 309 | 310 | 311 | 54 312 | 00:03:11,966 --> 00:03:14,756 313 | Any app can accept PDFs will 314 | appear under the Share menu, 315 | 316 | 317 | 55 318 | 00:03:14,876 --> 00:03:17,486 319 | as well as AirDrop and other 320 | system-sharing options. 321 | 322 | 323 | 56 324 | 00:03:18,746 --> 00:03:22,166 325 | This also works with the Managed 326 | Open In Enterprise feature 327 | 328 | 329 | 57 330 | 00:03:22,166 --> 00:03:24,736 331 | that keeps business items 332 | and personal items separate. 333 | 334 | 335 | 58 336 | 00:03:26,416 --> 00:03:29,966 337 | On devices with 3D Touch, you 338 | can alternatively use the Peek 339 | 340 | 341 | 59 342 | 00:03:29,966 --> 00:03:32,776 343 | and Pop gesture to 344 | access this same view 345 | 346 | 347 | 60 348 | 00:03:32,776 --> 00:03:33,696 349 | from the Print Preview. 350 | 351 | 352 | 61 353 | 00:03:34,916 --> 00:03:37,586 354 | We think enterprise users will 355 | love having this new paper-free 356 | 357 | 358 | 62 359 | 00:03:37,586 --> 00:03:40,206 360 | workflow on all of 361 | their iOS devices. 362 | 363 | 364 | 63 365 | 00:03:43,406 --> 00:03:46,496 366 | Next onto a hugely 367 | important topic, security. 368 | 369 | 370 | 64 371 | 00:03:49,356 --> 00:03:52,546 372 | AirPrint on iOS and Mac 373 | OS support full end-to-end 374 | 375 | 376 | 65 377 | 00:03:52,546 --> 00:03:55,126 378 | encryption so your documents 379 | are protected on the network. 380 | 381 | 382 | 66 383 | 00:03:56,986 --> 00:04:00,386 384 | AirPrint supports the latest 385 | industry standard TLS 1.2 386 | 387 | 388 | 67 389 | 00:04:00,386 --> 00:04:02,206 390 | encryption on top of HTTP. 391 | 392 | 393 | 68 394 | 00:04:03,726 --> 00:04:06,066 395 | This encryption technology 396 | is a requirement 397 | 398 | 399 | 69 400 | 00:04:06,066 --> 00:04:08,206 401 | for all new AirPrint 402 | printers and servers. 403 | 404 | 405 | 70 406 | 00:04:11,516 --> 00:04:13,366 407 | Next, for additional security, 408 | 409 | 410 | 71 411 | 00:04:13,916 --> 00:04:16,565 412 | many enterprise customers don't 413 | want printed pages sitting 414 | 415 | 416 | 72 417 | 00:04:16,565 --> 00:04:18,156 418 | around in the output 419 | bin of a printer, 420 | 421 | 422 | 73 423 | 00:04:18,776 --> 00:04:23,496 424 | where an unauthorized person 425 | can pick it up and view it. 426 | 427 | 428 | 74 429 | 00:04:23,496 --> 00:04:26,516 430 | iOS and Mac OS support PIN 431 | Release for printers and servers 432 | 433 | 434 | 75 435 | 00:04:26,516 --> 00:04:30,316 436 | that support it, where the user 437 | will enter a PIN at the printer 438 | 439 | 440 | 76 441 | 00:04:30,556 --> 00:04:31,606 442 | to receive their output. 443 | 444 | 445 | 77 446 | 00:04:33,526 --> 00:04:35,576 447 | On iOS, when a PIN is required, 448 | 449 | 450 | 78 451 | 00:04:36,496 --> 00:04:38,686 452 | the Print panel has a 453 | label explaining that. 454 | 455 | 456 | 79 457 | 00:04:38,686 --> 00:04:42,896 458 | And when the user taps 459 | Print, an alert is displayed 460 | 461 | 462 | 80 463 | 00:04:42,896 --> 00:04:43,976 464 | with the PIN to release the job. 465 | 466 | 467 | 81 468 | 00:04:49,896 --> 00:04:53,646 469 | On Mac OS, the user can 470 | type the PIN they want 471 | 472 | 473 | 82 474 | 00:04:53,646 --> 00:04:55,726 475 | to use to release the job. 476 | 477 | 478 | 83 479 | 00:04:55,936 --> 00:04:59,496 480 | Mac OS also supports 481 | PIN when PIN is optional 482 | 483 | 484 | 84 485 | 00:04:59,496 --> 00:05:00,706 486 | and not required to print. 487 | 488 | 489 | 85 490 | 00:05:01,496 --> 00:05:03,506 491 | Next, Access Control 492 | and Accounting. 493 | 494 | 495 | 86 496 | 00:05:05,456 --> 00:05:07,726 497 | AirPrint has always 498 | supported printers and servers 499 | 500 | 501 | 87 502 | 00:05:07,726 --> 00:05:10,446 503 | that require authentication 504 | with a username and password. 505 | 506 | 507 | 88 508 | 00:05:11,846 --> 00:05:14,456 509 | We store the username and 510 | password entered in the keychain 511 | 512 | 513 | 89 514 | 00:05:14,896 --> 00:05:16,616 515 | so the user never has 516 | to enter it again. 517 | 518 | 519 | 90 520 | 00:05:17,896 --> 00:05:20,836 521 | iOS 10 now supports 522 | the ability to forget 523 | 524 | 525 | 91 526 | 00:05:20,836 --> 00:05:23,876 527 | that stored authentication 528 | information to support workflows 529 | 530 | 531 | 92 532 | 00:05:23,876 --> 00:05:24,976 533 | where a different 534 | user name is needed. 535 | 536 | 537 | 93 538 | 00:05:30,646 --> 00:05:33,836 539 | Also new this year is support 540 | for password-only authentication 541 | 542 | 543 | 94 544 | 00:05:33,836 --> 00:05:35,246 545 | so printer can be protected 546 | 547 | 548 | 95 549 | 00:05:35,246 --> 00:05:36,976 550 | with just a simple 551 | password, as shown here. 552 | 553 | 554 | 96 555 | 00:05:41,896 --> 00:05:43,756 556 | When an enterprise 557 | needs to have billing 558 | 559 | 560 | 97 561 | 00:05:43,946 --> 00:05:46,736 562 | or account information 563 | added to each print job, 564 | 565 | 566 | 98 567 | 00:05:47,166 --> 00:05:50,596 568 | iOS and Mac OS both support 569 | printers and servers that take 570 | 571 | 572 | 99 573 | 00:05:50,596 --> 00:05:51,776 574 | that account information. 575 | 576 | 577 | 100 578 | 00:05:52,446 --> 00:05:55,456 579 | If the account information 580 | is required for every job, 581 | 582 | 583 | 101 584 | 00:05:56,076 --> 00:05:57,676 585 | the user will be 586 | required to enter 587 | 588 | 589 | 102 590 | 00:05:57,676 --> 00:05:58,946 591 | that information before 592 | the job continues. 593 | 594 | 595 | 103 596 | 00:06:04,056 --> 00:06:06,816 597 | And iOS and Mac OS 598 | support either optional 599 | 600 | 601 | 104 602 | 00:06:06,816 --> 00:06:09,186 603 | or required account 604 | ID for print jobs, 605 | 606 | 607 | 105 608 | 00:06:09,706 --> 00:06:10,976 609 | and this is what the UI 610 | looks like on Mac OS X. 611 | 612 | 613 | 106 614 | 00:06:18,556 --> 00:06:19,886 615 | Next, Better Discovery. 616 | 617 | 618 | 107 619 | 00:06:22,786 --> 00:06:25,426 620 | AirPrint has many supportive 621 | ways to find and use printers. 622 | 623 | 624 | 108 625 | 00:06:25,946 --> 00:06:27,926 626 | The main method which 627 | most people associate 628 | 629 | 630 | 109 631 | 00:06:27,926 --> 00:06:29,586 632 | with AirPrint is Local Bonjour. 633 | 634 | 635 | 110 636 | 00:06:30,786 --> 00:06:31,976 637 | There is no setup required. 638 | 639 | 640 | 111 641 | 00:06:32,726 --> 00:06:35,056 642 | The printer automatically 643 | appears as an available printer 644 | 645 | 646 | 112 647 | 00:06:35,056 --> 00:06:36,336 648 | in the list without any setup. 649 | 650 | 651 | 113 652 | 00:06:38,536 --> 00:06:41,516 653 | AirPrint has also always 654 | supported Wide-Area Bonjour. 655 | 656 | 657 | 114 658 | 00:06:42,656 --> 00:06:45,546 659 | Bonjour is based on 660 | DNS Service Discovery. 661 | 662 | 663 | 115 664 | 00:06:45,966 --> 00:06:47,556 665 | And if a DNS server 666 | is configured 667 | 668 | 669 | 116 670 | 00:06:47,556 --> 00:06:48,636 671 | with the correct records, 672 | 673 | 674 | 117 675 | 00:06:49,476 --> 00:06:50,946 676 | printers can be discovered 677 | this way 678 | 679 | 680 | 118 681 | 00:06:51,386 --> 00:06:52,616 682 | and I'll go over how to do this. 683 | 684 | 685 | 119 686 | 00:06:53,586 --> 00:06:58,526 687 | Both iOS and Mac OS also now 688 | support Mobile Device Management 689 | 690 | 691 | 120 692 | 00:06:58,526 --> 00:07:01,836 693 | or MDM profiles with a 694 | configured AirPrint payload. 695 | 696 | 697 | 121 698 | 00:07:03,996 --> 00:07:07,816 699 | And new in iOS 10, we have 700 | AirPrint Bluetooth Beacons 701 | 702 | 703 | 122 704 | 00:07:07,816 --> 00:07:09,976 705 | as a way to discover 706 | printers using Bluetooth 707 | 708 | 709 | 123 710 | 00:07:09,976 --> 00:07:11,796 711 | low-energy beacons. 712 | 713 | 714 | 124 715 | 00:07:15,116 --> 00:07:16,336 716 | Configuring a DNS server 717 | 718 | 719 | 125 720 | 00:07:16,336 --> 00:07:18,176 721 | to advertise AirPrint 722 | printers is easy. 723 | 724 | 725 | 126 726 | 00:07:19,046 --> 00:07:22,516 727 | First, the configured DNS 728 | server must be in the list 729 | 730 | 731 | 127 732 | 00:07:22,516 --> 00:07:24,956 733 | of DNS servers used 734 | by the iOS devices 735 | 736 | 737 | 128 738 | 00:07:24,956 --> 00:07:26,566 739 | and Macs you want 740 | printers to appear. 741 | 742 | 743 | 129 744 | 00:07:27,146 --> 00:07:30,186 745 | There are lots of ways to 746 | manage which DNS servers 747 | 748 | 749 | 130 750 | 00:07:30,186 --> 00:07:34,686 751 | and search domains are used, 752 | such as DHCP or MDM profiles. 753 | 754 | 755 | 131 756 | 00:07:35,266 --> 00:07:41,446 757 | And next you want to add A 758 | or AAAA records to the name 759 | 760 | 761 | 132 762 | 00:07:41,446 --> 00:07:44,876 763 | of the printer and the printer 764 | setup with a static IP address. 765 | 766 | 767 | 133 768 | 00:07:46,936 --> 00:07:50,066 769 | Add a PTR record for the 770 | main IPPS service type 771 | 772 | 773 | 134 774 | 00:07:50,066 --> 00:07:53,136 775 | and one additional PTR record 776 | for the universal subtype. 777 | 778 | 779 | 135 780 | 00:07:54,106 --> 00:07:57,046 781 | This is key for AirPrint 782 | because AirPrint isn't just an 783 | 784 | 785 | 136 786 | 00:07:57,046 --> 00:07:57,916 787 | IPPS service. 788 | 789 | 790 | 137 791 | 00:07:58,436 --> 00:08:00,316 792 | It has a subtype of universal 793 | 794 | 795 | 138 796 | 00:08:00,916 --> 00:08:03,126 797 | and that's what iOS 798 | devices and Mac search for. 799 | 800 | 801 | 139 802 | 00:08:04,546 --> 00:08:09,526 803 | You'll add a SRV record for 804 | the service and than a TXT 805 | 806 | 807 | 140 808 | 00:08:09,526 --> 00:08:12,406 809 | or text record that 810 | describes many capabilities 811 | 812 | 813 | 141 814 | 00:08:12,406 --> 00:08:13,556 815 | and information about 816 | the printer. 817 | 818 | 819 | 142 820 | 00:08:14,936 --> 00:08:18,336 821 | It's super important to 822 | find the TXT or text record 823 | 824 | 825 | 143 826 | 00:08:18,336 --> 00:08:19,426 827 | of the printer or server, 828 | 829 | 830 | 144 831 | 00:08:19,926 --> 00:08:22,626 832 | which can easily be accomplished 833 | using the Command Line tool Mac 834 | 835 | 836 | 145 837 | 00:08:22,626 --> 00:08:24,116 838 | OS, dns-sd. 839 | 840 | 841 | 146 842 | 00:08:24,116 --> 00:08:30,796 843 | To use dns-sd to figure out the 844 | records, just run this command 845 | 846 | 847 | 147 848 | 00:08:30,796 --> 00:08:33,006 849 | on the same subnet as the 850 | printer you're setting up. 851 | 852 | 853 | 148 854 | 00:08:33,936 --> 00:08:37,076 855 | You run with the -Z option 856 | to display the records 857 | 858 | 859 | 149 860 | 00:08:37,076 --> 00:08:41,405 861 | in zone file format and 862 | you'll use the underscore tcp. 863 | 864 | 865 | 150 866 | 00:08:41,405 --> 00:08:45,916 867 | underscore ipps.service 868 | type in the local domain, 869 | 870 | 871 | 151 872 | 00:08:46,226 --> 00:08:47,256 873 | like shown here in blue. 874 | 875 | 876 | 152 877 | 00:08:49,606 --> 00:08:50,806 878 | This is the output you'll get 879 | 880 | 881 | 153 882 | 00:08:50,806 --> 00:08:52,676 883 | for each printer that's 884 | discovered locally. 885 | 886 | 887 | 154 888 | 00:08:53,996 --> 00:08:58,176 889 | These are almost the PTR, SRV, 890 | and TXT records you'll need 891 | 892 | 893 | 155 894 | 00:08:58,176 --> 00:09:00,996 895 | to add to DNS server 896 | with a couple additions. 897 | 898 | 899 | 156 900 | 00:09:03,546 --> 00:09:05,246 901 | The changes are highlighted 902 | here in green. 903 | 904 | 905 | 157 906 | 00:09:05,716 --> 00:09:08,456 907 | As I mentioned, you'll add 908 | an additional PTR record 909 | 910 | 911 | 158 912 | 00:09:08,456 --> 00:09:11,836 913 | for the universal subtype, like 914 | this one on the second line. 915 | 916 | 917 | 159 918 | 00:09:13,086 --> 00:09:16,086 919 | You'll also replace the local 920 | printer name in the SRV record 921 | 922 | 923 | 160 924 | 00:09:16,366 --> 00:09:18,116 925 | with the fully-qualified 926 | domain name, 927 | 928 | 929 | 161 930 | 00:09:18,956 --> 00:09:22,326 931 | the A record I mentioned 932 | earlier, and you'll also need 933 | 934 | 935 | 162 936 | 00:09:22,326 --> 00:09:25,296 937 | to replace any other instances 938 | of the local Bonjour name 939 | 940 | 941 | 163 942 | 00:09:25,296 --> 00:09:28,706 943 | with this fully-qualified domain 944 | name, like I have shown here 945 | 946 | 947 | 164 948 | 00:09:28,706 --> 00:09:31,026 949 | in green, with the 950 | printer's administration URL. 951 | 952 | 953 | 165 954 | 00:09:32,966 --> 00:09:35,846 955 | If this isn't fixed, users 956 | won't be able to use the button 957 | 958 | 959 | 166 960 | 00:09:35,846 --> 00:09:38,116 961 | in Mac OS that quickly 962 | takes them 963 | 964 | 965 | 167 966 | 00:09:38,116 --> 00:09:39,786 967 | to the printer's admin webpage. 968 | 969 | 970 | 168 971 | 00:09:41,286 --> 00:09:43,766 972 | And so this is the text here 973 | that could be copied right 974 | 975 | 976 | 169 977 | 00:09:43,766 --> 00:09:46,616 978 | into a zone file and a 979 | printer will appear in the list 980 | 981 | 982 | 170 983 | 00:09:46,616 --> 00:09:47,836 984 | of printers for your users, 985 | 986 | 987 | 171 988 | 00:09:47,836 --> 00:09:50,056 989 | if they have this 990 | DNS server configured 991 | 992 | 993 | 172 994 | 00:09:50,056 --> 00:09:51,816 995 | as one of their DNS servers. 996 | 997 | 998 | 173 999 | 00:09:52,456 --> 00:09:55,166 1000 | So the key to setting up 1001 | Wide-Area Bonjour printers is 1002 | 1003 | 1004 | 174 1005 | 00:09:55,166 --> 00:09:58,246 1006 | to get some help from the 1007 | dns-sd Command Line tool. 1008 | 1009 | 1010 | 175 1011 | 00:10:01,696 --> 00:10:04,796 1012 | MDM profiles are very 1013 | popular and a super easy way 1014 | 1015 | 1016 | 176 1017 | 00:10:04,796 --> 00:10:06,376 1018 | to configure printers 1019 | for your users. 1020 | 1021 | 1022 | 177 1023 | 00:10:07,506 --> 00:10:09,736 1024 | The AirPrint payload can 1025 | be added to any profile 1026 | 1027 | 1028 | 178 1029 | 00:10:09,996 --> 00:10:12,016 1030 | and that payload 1031 | consists of a host 1032 | 1033 | 1034 | 179 1035 | 00:10:12,016 --> 00:10:14,336 1036 | or IP address and 1037 | a resource path. 1038 | 1039 | 1040 | 180 1041 | 00:10:15,866 --> 00:10:20,036 1042 | The resource path is ipp/print 1043 | for most AirPrint printers, 1044 | 1045 | 1046 | 181 1047 | 00:10:20,896 --> 00:10:22,866 1048 | and for an AirPrint server, 1049 | this will be the queue. 1050 | 1051 | 1052 | 182 1053 | 00:10:24,616 --> 00:10:27,846 1054 | And the screenshot shown 1055 | here is Apple Configurator, 1056 | 1057 | 1058 | 183 1059 | 00:10:28,286 --> 00:10:31,016 1060 | one of the most popular Mobile 1061 | Device Management tools. 1062 | 1063 | 1064 | 184 1065 | 00:10:31,286 --> 00:10:35,746 1066 | Next we have a new 1067 | technology we're really excited 1068 | 1069 | 1070 | 185 1071 | 00:10:35,746 --> 00:10:37,306 1072 | about that's new in iOS 10 1073 | 1074 | 1075 | 186 1076 | 00:10:37,666 --> 00:10:39,266 1077 | and that's the AirPrint 1078 | Bluetooth Beacon. 1079 | 1080 | 1081 | 187 1082 | 00:10:42,046 --> 00:10:44,766 1083 | So what is an AirPrint Bluetooth 1084 | Beacon, and how does it work? 1085 | 1086 | 1087 | 188 1088 | 00:10:46,046 --> 00:10:47,476 1089 | Well, it can be configured 1090 | using one 1091 | 1092 | 1093 | 189 1094 | 00:10:47,476 --> 00:10:49,936 1095 | of the many third-party 1096 | Bluetooth beacon devices 1097 | 1098 | 1099 | 190 1100 | 00:10:49,936 --> 00:10:53,806 1101 | available on the market and 1102 | set next to or near a printer 1103 | 1104 | 1105 | 191 1106 | 00:10:54,746 --> 00:10:57,116 1107 | or can it be built into the 1108 | printer itself using the 1109 | 1110 | 1111 | 192 1112 | 00:10:57,116 --> 00:10:59,036 1113 | printer's built-in 1114 | radios and antennas. 1115 | 1116 | 1117 | 193 1118 | 00:10:59,546 --> 00:11:02,226 1119 | And future AirPrint printers 1120 | will have this capability built 1121 | 1122 | 1123 | 194 1124 | 00:11:02,226 --> 00:11:03,986 1125 | right in. 1126 | 1127 | 1128 | 195 1129 | 00:11:04,906 --> 00:11:07,336 1130 | What it does is beacon out 1131 | the connection information. 1132 | 1133 | 1134 | 196 1135 | 00:11:08,026 --> 00:11:11,546 1136 | And if the iPhone can 1137 | reach that IP address, 1138 | 1139 | 1140 | 197 1141 | 00:11:11,886 --> 00:11:14,686 1142 | the printer will be 1143 | accessible to send jobs to. 1144 | 1145 | 1146 | 198 1147 | 00:11:15,826 --> 00:11:18,436 1148 | This is really powerful 1149 | because the network complexities 1150 | 1151 | 1152 | 199 1153 | 00:11:18,436 --> 00:11:19,096 1154 | don't matter. 1155 | 1156 | 1157 | 200 1158 | 00:11:19,156 --> 00:11:21,666 1159 | All that matters is that 1160 | the IP address is reachable. 1161 | 1162 | 1163 | 201 1164 | 00:11:22,926 --> 00:11:25,146 1165 | This could even be a public 1166 | IP address on the Internet. 1167 | 1168 | 1169 | 202 1170 | 00:11:25,686 --> 00:11:28,206 1171 | So long as the iOS device 1172 | is in Bluetooth range 1173 | 1174 | 1175 | 203 1176 | 00:11:28,366 --> 00:11:30,206 1177 | and the IP address 1178 | is accessible, 1179 | 1180 | 1181 | 204 1182 | 00:11:30,206 --> 00:11:31,836 1183 | the printer will show up 1184 | as an available printer 1185 | 1186 | 1187 | 205 1188 | 00:11:31,836 --> 00:11:32,996 1189 | on the list for users. 1190 | 1191 | 1192 | 206 1193 | 00:11:35,286 --> 00:11:38,546 1194 | And the AirPrint Beacon works 1195 | great with print servers too. 1196 | 1197 | 1198 | 207 1199 | 00:11:38,916 --> 00:11:44,046 1200 | Here we have an AirPrint server 1201 | on the right, and each printer 1202 | 1203 | 1204 | 208 1205 | 00:11:44,046 --> 00:11:46,266 1206 | on the network has an 1207 | AirPrint Bluetooth Beacon 1208 | 1209 | 1210 | 209 1211 | 00:11:46,636 --> 00:11:49,076 1212 | which is advertising 1213 | the server's IP address 1214 | 1215 | 1216 | 210 1217 | 00:11:49,546 --> 00:11:51,616 1218 | and the Queue ID 1219 | associated with that printer. 1220 | 1221 | 1222 | 211 1223 | 00:11:52,616 --> 00:11:56,726 1224 | When the user prints, the 1225 | job goes to the print server 1226 | 1227 | 1228 | 212 1229 | 00:11:57,696 --> 00:12:02,716 1230 | with the queue information, and 1231 | then the server sends the job 1232 | 1233 | 1234 | 213 1235 | 00:12:02,786 --> 00:12:05,496 1236 | to the associated printer that 1237 | the user has chosen in the UI. 1238 | 1239 | 1240 | 214 1241 | 00:12:09,166 --> 00:12:11,816 1242 | Let's go into detail about what 1243 | the AirPrint Bluetooth Beacon 1244 | 1245 | 1246 | 215 1247 | 00:12:11,816 --> 00:12:14,356 1248 | format is so you can set 1249 | these up for your printers. 1250 | 1251 | 1252 | 216 1253 | 00:12:17,236 --> 00:12:18,316 1254 | First, we have a header. 1255 | 1256 | 1257 | 217 1258 | 00:12:19,046 --> 00:12:23,516 1259 | This is what identifies this BLE 1260 | beacon as an AirPrint Beacon. 1261 | 1262 | 1263 | 218 1264 | 00:12:24,696 --> 00:12:27,046 1265 | It's the same for all 1266 | AirPrint Bluetooth Beacons, 1267 | 1268 | 1269 | 219 1270 | 00:12:27,046 --> 00:12:28,306 1271 | so this can just be copied. 1272 | 1273 | 1274 | 220 1275 | 00:12:29,756 --> 00:12:32,486 1276 | Next, we have the 1277 | connection information. 1278 | 1279 | 1280 | 221 1281 | 00:12:33,006 --> 00:12:35,036 1282 | This tells whether the 1283 | IP address found later 1284 | 1285 | 1286 | 222 1287 | 00:12:35,036 --> 00:12:38,586 1288 | in the beacon is an IPv4 1289 | address or an IPv6 address. 1290 | 1291 | 1292 | 223 1293 | 00:12:39,506 --> 00:12:42,216 1294 | It also tells whether the 1295 | IP address is for a server 1296 | 1297 | 1298 | 224 1299 | 00:12:42,216 --> 00:12:44,836 1300 | or identifies a printer 1301 | and this byte identifies 1302 | 1303 | 1304 | 225 1305 | 00:12:44,836 --> 00:12:47,026 1306 | if the connection 1307 | must be TLS encrypted. 1308 | 1309 | 1310 | 226 1311 | 00:12:47,656 --> 00:12:51,006 1312 | For this example, the 1313 | connection is TLS encrypted, 1314 | 1315 | 1316 | 227 1317 | 00:12:51,046 --> 00:12:54,186 1318 | the IP address is 1319 | an IPv6 address, 1320 | 1321 | 1322 | 228 1323 | 00:12:54,706 --> 00:12:55,816 1324 | and this is not a server. 1325 | 1326 | 1327 | 229 1328 | 00:12:57,496 --> 00:13:00,786 1329 | See the specification 1330 | published on developer.apple.com 1331 | 1332 | 1333 | 230 1334 | 00:13:01,486 --> 00:13:02,646 1335 | for how this byte is set up. 1336 | 1337 | 1338 | 231 1339 | 00:13:05,696 --> 00:13:07,976 1340 | Next we have a printer 1341 | ID if this job should go 1342 | 1343 | 1344 | 232 1345 | 00:13:07,976 --> 00:13:11,896 1346 | to a print server or information 1347 | about the resource path 1348 | 1349 | 1350 | 233 1351 | 00:13:11,896 --> 00:13:13,266 1352 | if this is directly 1353 | to a printer. 1354 | 1355 | 1356 | 234 1357 | 00:13:14,936 --> 00:13:18,156 1358 | This printer has ipp/print 1359 | as the resource path. 1360 | 1361 | 1362 | 235 1363 | 00:13:19,356 --> 00:13:22,936 1364 | Again, see the specification 1365 | published for more details 1366 | 1367 | 1368 | 236 1369 | 00:13:22,936 --> 00:13:25,356 1370 | about specifying resource paths. 1371 | 1372 | 1373 | 237 1374 | 00:13:28,076 --> 00:13:29,906 1375 | Next we have the port 1376 | for the connection; 1377 | 1378 | 1379 | 238 1380 | 00:13:30,946 --> 00:13:33,536 1381 | 631 is the standard IPP port. 1382 | 1383 | 1384 | 239 1385 | 00:13:34,176 --> 00:13:37,736 1386 | Port 443 is often used for 1387 | TLS secure connections. 1388 | 1389 | 1390 | 240 1391 | 00:13:38,376 --> 00:13:43,456 1392 | For this example, 277 1393 | is hexadecimal for 631, 1394 | 1395 | 1396 | 241 1397 | 00:13:43,456 --> 00:13:45,466 1398 | which is the standard IPP port. 1399 | 1400 | 1401 | 242 1402 | 00:13:47,886 --> 00:13:50,186 1403 | And next we have the IP address. 1404 | 1405 | 1406 | 243 1407 | 00:13:50,676 --> 00:13:55,326 1408 | If you're using a non-updatable 1409 | external beacon for the printer, 1410 | 1411 | 1412 | 244 1413 | 00:13:55,746 --> 00:13:57,716 1414 | make sure the printer 1415 | has a static IP address. 1416 | 1417 | 1418 | 245 1419 | 00:13:58,396 --> 00:14:01,036 1420 | Otherwise, this IP in the 1421 | beacon will become stale 1422 | 1423 | 1424 | 246 1425 | 00:14:01,036 --> 00:14:02,486 1426 | when the IP address changes. 1427 | 1428 | 1429 | 247 1430 | 00:14:05,446 --> 00:14:09,276 1431 | And last, like iBeacon, we have 1432 | a measured signal strength value 1433 | 1434 | 1435 | 248 1436 | 00:14:09,276 --> 00:14:10,076 1437 | at 1 meter. 1438 | 1439 | 1440 | 249 1441 | 00:14:10,916 --> 00:14:14,536 1442 | This uses the same methodology 1443 | as Apple iBeacon measured power. 1444 | 1445 | 1446 | 250 1447 | 00:14:15,256 --> 00:14:17,606 1448 | This gives the iOS 1449 | device better information 1450 | 1451 | 1452 | 251 1453 | 00:14:17,606 --> 00:14:19,216 1454 | about the physical 1455 | distance of the printer. 1456 | 1457 | 1458 | 252 1459 | 00:14:20,266 --> 00:14:23,536 1460 | For this example, the 1461 | transmission power was found 1462 | 1463 | 1464 | 253 1465 | 00:14:23,536 --> 00:14:27,666 1466 | to be on average 64 decibels, 1467 | which is 40 in hexadecimal. 1468 | 1469 | 1470 | 254 1471 | 00:14:30,016 --> 00:14:32,106 1472 | The format of the AirPrint 1473 | Bluetooth Beacon is somewhat 1474 | 1475 | 1476 | 255 1477 | 00:14:32,106 --> 00:14:33,116 1478 | similar to iBeacon. 1479 | 1480 | 1481 | 256 1482 | 00:14:35,496 --> 00:14:37,406 1483 | iBeacon format is 1484 | one byte shorter, 1485 | 1486 | 1487 | 257 1488 | 00:14:37,926 --> 00:14:39,556 1489 | but the beginning 1490 | header is very similar. 1491 | 1492 | 1493 | 258 1494 | 00:14:41,236 --> 00:14:43,396 1495 | If you're following setup 1496 | instructions for a device 1497 | 1498 | 1499 | 259 1500 | 00:14:43,396 --> 00:14:46,636 1501 | with iBeacon technology, 1502 | you may be able to adjust 1503 | 1504 | 1505 | 260 1506 | 00:14:46,636 --> 00:14:49,436 1507 | and use a similar setup for 1508 | the AirPrint Bluetooth Beacon, 1509 | 1510 | 1511 | 261 1512 | 00:14:50,516 --> 00:14:54,036 1513 | and many manufacturers of 1514 | Bluetooth hardware have 1515 | 1516 | 1517 | 262 1518 | 00:14:54,036 --> 00:14:56,406 1519 | or will have specific 1520 | AirPrint Bluetooth Beacon 1521 | 1522 | 1523 | 263 1524 | 00:14:56,406 --> 00:14:57,536 1525 | setup procedures. 1526 | 1527 | 1528 | 264 1529 | 00:15:00,016 --> 00:15:02,016 1530 | So for enterprise users, iOS 1531 | 1532 | 1533 | 265 1534 | 00:15:02,016 --> 00:15:04,286 1535 | and Mac OS provides 1536 | many great technologies 1537 | 1538 | 1539 | 266 1540 | 00:15:04,286 --> 00:15:07,576 1541 | to support PDF workflows for 1542 | an increasingly digital world. 1543 | 1544 | 1545 | 267 1546 | 00:15:07,876 --> 00:15:11,856 1547 | And AirPrint provides great 1548 | security, access control, 1549 | 1550 | 1551 | 268 1552 | 00:15:11,956 --> 00:15:14,486 1553 | accounting, and new 1554 | discovery technologies 1555 | 1556 | 1557 | 269 1558 | 00:15:14,486 --> 00:15:16,456 1559 | to make printing great 1560 | in any environment. 1561 | 1562 | 1563 | 270 1564 | 00:15:17,796 --> 00:15:19,736 1565 | And as always, let 1566 | us know your feedback 1567 | 1568 | 1569 | 271 1570 | 00:15:19,736 --> 00:15:22,556 1571 | about what specific enterprise 1572 | needs are by submitting feedback 1573 | 1574 | 1575 | 272 1576 | 00:15:22,556 --> 00:15:24,386 1577 | on apple.com/feedback. 1578 | 1579 | 1580 | 273 1581 | 00:15:25,986 --> 00:15:28,256 1582 | For more information 1583 | about this presentation 1584 | 1585 | 1586 | 274 1587 | 00:15:29,066 --> 00:15:32,246 1588 | and for referenced 1589 | specs, please check 1590 | 1591 | 1592 | 275 1593 | 00:15:32,246 --> 00:15:37,286 1594 | out 1595 | developer.apple.com/wwdc16/725. 1596 | 1597 | 1598 | 276 1599 | 00:15:39,056 --> 00:15:41,406 1600 | You may also want to 1601 | check out the What's New 1602 | 1603 | 1604 | 277 1605 | 00:15:41,406 --> 00:15:44,316 1606 | in Apple Device Management 1607 | session in Nob Hill 1608 | 1609 | 1610 | 278 1611 | 00:15:44,586 --> 00:15:50,266 1612 | at Wednesday 11:00 a.m. and also 1613 | Taking Core Location Indoors 1614 | 1615 | 1616 | 279 1617 | 00:15:50,846 --> 00:15:54,636 1618 | in the Marina at 1619 | Wednesday at 3:15 p.m. 1620 | 1621 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/SD/241_sd_public_transit_in_apple_maps.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:17,500 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:20,346 --> 00:00:23,766 8 | >> Hello. My name is Ellis 9 | Verosub, and I'm responsible 10 | 11 | 12 | 3 13 | 00:00:23,766 --> 00:00:25,726 14 | for public transit 15 | in Apple Maps. 16 | 17 | 18 | 4 19 | 00:00:26,166 --> 00:00:28,086 20 | Our goal here at Apple is always 21 | 22 | 23 | 5 24 | 00:00:28,086 --> 00:00:30,596 25 | to create the best possible 26 | customer experience. 27 | 28 | 29 | 6 30 | 00:00:31,176 --> 00:00:32,996 31 | We believe that design 32 | is not just 33 | 34 | 35 | 7 36 | 00:00:32,996 --> 00:00:35,396 37 | about how something 38 | looks but how it works. 39 | 40 | 41 | 8 42 | 00:00:35,986 --> 00:00:38,776 43 | Great experiences are 44 | intuitive and seamless. 45 | 46 | 47 | 9 48 | 00:00:39,326 --> 00:00:42,486 49 | In this talk, I'd like to 50 | explore how these ideas apply 51 | 52 | 53 | 10 54 | 00:00:42,486 --> 00:00:44,086 55 | to transit in Apple Maps. 56 | 57 | 58 | 11 59 | 00:00:44,446 --> 00:00:45,836 60 | But first, I'd like to start 61 | 62 | 63 | 12 64 | 00:00:45,836 --> 00:00:50,886 65 | by giving you an 66 | overview of our product. 67 | 68 | 69 | 13 70 | 00:00:50,976 --> 00:00:55,156 71 | Transit launched in September 72 | 2015 as part of iOS 9 73 | 74 | 75 | 14 76 | 00:00:55,336 --> 00:00:57,016 77 | and Mac OS X, El Capitan. 78 | 79 | 80 | 15 81 | 00:00:57,016 --> 00:01:02,126 82 | As of today, it is available 83 | in 21 cities around the world 84 | 85 | 86 | 16 87 | 00:01:02,126 --> 00:01:04,385 88 | as well as over 300 89 | cities in China. 90 | 91 | 92 | 17 93 | 00:01:05,616 --> 00:01:09,756 94 | We use transit schedule data 95 | from over 250 transit agencies. 96 | 97 | 98 | 18 99 | 00:01:10,996 --> 00:01:12,286 100 | Here's a bit of a fun fact. 101 | 102 | 103 | 19 104 | 00:01:12,586 --> 00:01:16,576 105 | To date, we've mapped more 106 | than 16,000 station entrances. 107 | 108 | 109 | 20 110 | 00:01:17,726 --> 00:01:19,556 111 | Next, I'd like to 112 | give you an overview 113 | 114 | 115 | 21 116 | 00:01:19,656 --> 00:01:21,856 117 | of the four key features 118 | of our product. 119 | 120 | 121 | 22 122 | 00:01:22,456 --> 00:01:26,586 123 | The first is a beautiful 124 | transit map. 125 | 126 | 127 | 23 128 | 00:01:27,166 --> 00:01:29,926 129 | Roads and other driving-related 130 | elements have been dimmed 131 | 132 | 133 | 24 134 | 00:01:29,926 --> 00:01:32,316 135 | out while transit 136 | lines and key terminus 137 | 138 | 139 | 25 140 | 00:01:32,316 --> 00:01:34,276 141 | and transfer stations 142 | are emphasized. 143 | 144 | 145 | 26 146 | 00:01:38,626 --> 00:01:40,656 147 | The second feature 148 | is a departure board 149 | 150 | 151 | 27 152 | 00:01:40,656 --> 00:01:43,976 153 | for each station showing each 154 | line that services the station. 155 | 156 | 157 | 28 158 | 00:01:49,376 --> 00:01:52,696 159 | The third is detailed point 160 | to point directions along 161 | 162 | 163 | 29 164 | 00:01:52,696 --> 00:01:54,726 165 | with a guided navigation 166 | experience. 167 | 168 | 169 | 30 170 | 00:01:58,556 --> 00:02:01,236 171 | Finally, we show 172 | realtime advisories 173 | 174 | 175 | 31 176 | 00:02:01,236 --> 00:02:04,646 177 | and even modify our recommended 178 | directions in response 179 | 180 | 181 | 32 182 | 00:02:04,766 --> 00:02:07,556 183 | to planned service changes 184 | or unplanned incidents. 185 | 186 | 187 | 33 188 | 00:02:11,216 --> 00:02:13,886 189 | Our goal is to provide 190 | a great experience 191 | 192 | 193 | 34 194 | 00:02:14,176 --> 00:02:15,566 195 | in each city we support. 196 | 197 | 198 | 35 199 | 00:02:16,296 --> 00:02:17,676 200 | So how do we do that? 201 | 202 | 203 | 36 204 | 00:02:17,996 --> 00:02:21,436 205 | We start with agency schedule 206 | data, but we don't stop there. 207 | 208 | 209 | 37 210 | 00:02:21,936 --> 00:02:23,246 211 | We collect additional data 212 | 213 | 214 | 38 215 | 00:02:23,246 --> 00:02:25,566 216 | through original research 217 | and field surveys. 218 | 219 | 220 | 39 221 | 00:02:26,026 --> 00:02:28,486 222 | Then we add in a layer 223 | of curation to surprise 224 | 225 | 226 | 40 227 | 00:02:28,486 --> 00:02:29,916 228 | and delight our customers. 229 | 230 | 231 | 41 232 | 00:02:30,316 --> 00:02:33,556 233 | Our goal is that at every 234 | moment customers should be able 235 | 236 | 237 | 42 238 | 00:02:33,556 --> 00:02:36,466 239 | to match the instruction we're 240 | giving them to what they see 241 | 242 | 243 | 43 244 | 00:02:36,466 --> 00:02:38,636 245 | in the real world around them. 246 | 247 | 248 | 44 249 | 00:02:39,266 --> 00:02:41,416 250 | Gathering these details 251 | takes a long time. 252 | 253 | 254 | 45 255 | 00:02:41,636 --> 00:02:44,766 256 | But as Steve Jobs once 257 | said, "Details matter. 258 | 259 | 260 | 46 261 | 00:02:45,166 --> 00:02:46,896 262 | It's worth waiting 263 | to get it right". 264 | 265 | 266 | 47 267 | 00:02:49,906 --> 00:02:52,136 268 | Here are some examples 269 | of additional data 270 | 271 | 272 | 48 273 | 00:02:52,136 --> 00:02:53,616 274 | that we collect ourselves. 275 | 276 | 277 | 49 278 | 00:02:56,106 --> 00:02:57,976 279 | Station entrances and exits. 280 | 281 | 282 | 50 283 | 00:03:00,126 --> 00:03:02,936 284 | Station footprints or 285 | the outlines of stations. 286 | 287 | 288 | 51 289 | 00:03:04,876 --> 00:03:06,036 290 | Agency signage. 291 | 292 | 293 | 52 294 | 00:03:06,426 --> 00:03:11,436 295 | And the real world 296 | path of transit lines 297 | 298 | 299 | 53 300 | 00:03:11,516 --> 00:03:14,316 301 | by which I mean the path 302 | that trains and buses 303 | 304 | 305 | 54 306 | 00:03:14,316 --> 00:03:20,806 307 | and ferries actually 308 | take in the real world. 309 | 310 | 311 | 55 312 | 00:03:21,056 --> 00:03:23,696 313 | This example shows a 314 | station entrance in London. 315 | 316 | 317 | 56 318 | 00:03:24,126 --> 00:03:26,976 319 | We've individually surveys 320 | every entrance not just 321 | 322 | 323 | 57 324 | 00:03:26,976 --> 00:03:28,746 325 | for location but also type. 326 | 327 | 328 | 58 329 | 00:03:29,076 --> 00:03:31,996 330 | Stairs, escalator, 331 | elevator, and so forth. 332 | 333 | 334 | 59 335 | 00:03:35,626 --> 00:03:38,556 336 | Here is that same entrance 337 | represented on our transit map. 338 | 339 | 340 | 60 341 | 00:03:39,086 --> 00:03:41,106 342 | You can also see the 343 | station outline here. 344 | 345 | 346 | 61 347 | 00:03:41,856 --> 00:03:44,946 348 | This is really helpful in 349 | terms of finding your way into 350 | 351 | 352 | 62 353 | 00:03:44,946 --> 00:03:46,216 354 | and out of train stations. 355 | 356 | 357 | 63 358 | 00:03:49,396 --> 00:03:52,486 359 | Stations have different names 360 | for exits and entrances. 361 | 362 | 363 | 64 364 | 00:03:52,856 --> 00:03:55,506 365 | From the outside, the entrance 366 | might not even have a name. 367 | 368 | 369 | 65 370 | 00:03:55,706 --> 00:03:58,996 371 | But from the inside, there's 372 | often a number or code. 373 | 374 | 375 | 66 376 | 00:04:01,196 --> 00:04:03,476 377 | We show that number 378 | or code on our map 379 | 380 | 381 | 67 382 | 00:04:03,586 --> 00:04:05,346 383 | so that you can be 384 | confident you are going 385 | 386 | 387 | 68 388 | 00:04:05,346 --> 00:04:06,316 389 | in the correct direction. 390 | 391 | 392 | 69 393 | 00:04:10,476 --> 00:04:14,796 394 | We try to match agency signage 395 | as closely as possible not just 396 | 397 | 398 | 70 399 | 00:04:14,796 --> 00:04:18,255 400 | in terms of the signage itself, 401 | but also what gets displayed 402 | 403 | 404 | 71 405 | 00:04:18,255 --> 00:04:19,555 406 | where and in what order. 407 | 408 | 409 | 72 410 | 00:04:19,866 --> 00:04:25,446 411 | Again, you see that 412 | reflected on our map. 413 | 414 | 415 | 73 416 | 00:04:29,716 --> 00:04:32,486 417 | Finally, something that 418 | is very important to us is 419 | 420 | 421 | 74 422 | 00:04:32,486 --> 00:04:33,766 423 | that the transit lines shown 424 | 425 | 426 | 75 427 | 00:04:33,766 --> 00:04:35,886 428 | on the map follow 429 | their actual paths. 430 | 431 | 432 | 76 433 | 00:04:36,386 --> 00:04:40,006 434 | Many iconic transit maps such as 435 | the London underground map are 436 | 437 | 438 | 77 439 | 00:04:40,006 --> 00:04:43,526 440 | schematic, not representative of 441 | the actual path the lines take. 442 | 443 | 444 | 78 445 | 00:04:44,056 --> 00:04:47,506 446 | However, with a digital map on 447 | a mobile device, it's important 448 | 449 | 450 | 79 451 | 00:04:47,506 --> 00:04:50,966 452 | that your location position as 453 | reflected on the map matches 454 | 455 | 456 | 80 457 | 00:04:50,966 --> 00:04:52,696 458 | up with the line you're 459 | actually traveling on. 460 | 461 | 462 | 81 463 | 00:04:53,326 --> 00:04:54,586 464 | This builds confidence 465 | 466 | 467 | 82 468 | 00:04:54,626 --> 00:04:57,286 469 | in the directions the 470 | customer has been given. 471 | 472 | 473 | 83 474 | 00:05:01,056 --> 00:05:03,536 475 | After we've gathered all 476 | of this additional data, 477 | 478 | 479 | 84 480 | 00:05:03,716 --> 00:05:05,796 481 | we go even deeper 482 | into the experience. 483 | 484 | 485 | 85 486 | 00:05:06,046 --> 00:05:09,696 487 | Our belief is that every city 488 | has a unique transit culture, 489 | 490 | 491 | 86 492 | 00:05:10,016 --> 00:05:11,326 493 | and we try to understand 494 | 495 | 496 | 87 497 | 00:05:11,326 --> 00:05:13,726 498 | and respect this culture 499 | reflecting it back 500 | 501 | 502 | 88 503 | 00:05:13,726 --> 00:05:14,756 504 | at our customers. 505 | 506 | 507 | 89 508 | 00:05:15,566 --> 00:05:16,766 509 | In the next few slides, 510 | 511 | 512 | 90 513 | 00:05:16,766 --> 00:05:19,026 514 | I'm going to dive 515 | into a few examples. 516 | 517 | 518 | 91 519 | 00:05:22,286 --> 00:05:25,286 520 | Boarding instructions vary 521 | from system to system. 522 | 523 | 524 | 92 525 | 00:05:26,286 --> 00:05:29,656 526 | For example, in London 527 | you board lines. 528 | 529 | 530 | 93 531 | 00:05:30,496 --> 00:05:32,906 532 | Whereas in New York 533 | you board trains. 534 | 535 | 536 | 94 537 | 00:05:33,896 --> 00:05:36,016 538 | You don't take the 539 | Victoria train in London 540 | 541 | 542 | 95 543 | 00:05:36,146 --> 00:05:37,686 544 | or the A Line in New York. 545 | 546 | 547 | 96 548 | 00:05:37,816 --> 00:05:39,236 549 | That's not a local convention. 550 | 551 | 552 | 97 553 | 00:05:40,476 --> 00:05:42,086 554 | Sometimes the line name matters, 555 | 556 | 557 | 98 558 | 00:05:42,266 --> 00:05:44,366 559 | but sometimes only the 560 | system name matters. 561 | 562 | 563 | 99 564 | 00:05:44,666 --> 00:05:47,696 565 | Here in the Bay Area, for 566 | example, you just take BART. 567 | 568 | 569 | 100 570 | 00:05:47,696 --> 00:05:52,226 571 | Sometimes the local convention 572 | includes the type of vehicle, 573 | 574 | 575 | 101 576 | 00:05:52,396 --> 00:05:53,546 577 | sometimes it's assumed. 578 | 579 | 580 | 102 581 | 00:05:54,026 --> 00:05:57,016 582 | In Mexico City, we specify 583 | that it's the Metro. 584 | 585 | 586 | 103 587 | 00:05:58,216 --> 00:05:59,716 588 | We capture these subtleties 589 | 590 | 591 | 104 592 | 00:05:59,716 --> 00:06:01,226 593 | because that allows 594 | our customers 595 | 596 | 597 | 105 598 | 00:06:01,226 --> 00:06:04,686 599 | to match what we're telling them 600 | to the real world around them. 601 | 602 | 603 | 106 604 | 00:06:06,996 --> 00:06:08,556 605 | Here is a different example. 606 | 607 | 608 | 107 609 | 00:06:09,656 --> 00:06:12,196 610 | In New York, the MTA 611 | doesn't list their lines 612 | 613 | 614 | 108 615 | 00:06:12,196 --> 00:06:13,306 616 | in alphabetical order. 617 | 618 | 619 | 109 620 | 00:06:13,676 --> 00:06:15,236 621 | Instead, they list 622 | them by color. 623 | 624 | 625 | 110 626 | 00:06:15,636 --> 00:06:18,476 627 | A and C are blue, 628 | B and D are orange. 629 | 630 | 631 | 111 632 | 00:06:21,646 --> 00:06:24,446 633 | You see the same ordering 634 | reflected in our product. 635 | 636 | 637 | 112 638 | 00:06:29,276 --> 00:06:32,106 639 | Trams and street cars are 640 | really the same type of vehicle, 641 | 642 | 643 | 113 644 | 00:06:32,466 --> 00:06:34,286 645 | but different cities 646 | specifically refer 647 | 648 | 649 | 114 650 | 00:06:34,286 --> 00:06:35,596 651 | to one or the other. 652 | 653 | 654 | 115 655 | 00:06:35,806 --> 00:06:38,686 656 | For example, in Toronto, 657 | you could tell a customer 658 | 659 | 660 | 116 661 | 00:06:38,686 --> 00:06:42,226 662 | to board the 510 Spadina Tram, 663 | but that's not really correct. 664 | 665 | 666 | 117 667 | 00:06:42,506 --> 00:06:45,136 668 | Everyone calls it the 669 | 510 Spadina streetcar, 670 | 671 | 672 | 118 673 | 00:06:45,616 --> 00:06:48,756 674 | so that's what we 675 | call it as well. 676 | 677 | 678 | 119 679 | 00:06:49,236 --> 00:06:55,296 680 | In Berlin, on the other 681 | hand, you ride trams. 682 | 683 | 684 | 120 685 | 00:06:59,056 --> 00:07:01,166 686 | And that is reflected 687 | in our experience. 688 | 689 | 690 | 121 691 | 00:07:01,636 --> 00:07:06,056 692 | Here's another example. 693 | 694 | 695 | 122 696 | 00:07:06,616 --> 00:07:09,286 697 | In San Francisco, you 698 | ride inbound and outbound. 699 | 700 | 701 | 123 702 | 00:07:09,776 --> 00:07:12,906 703 | Whereas in London or Toronto, 704 | you go northbound, southbound, 705 | 706 | 707 | 124 708 | 00:07:12,906 --> 00:07:13,916 709 | eastbound, and westbound. 710 | 711 | 712 | 125 713 | 00:07:14,316 --> 00:07:20,346 714 | But in New York, you 715 | go uptown and downtown. 716 | 717 | 718 | 126 719 | 00:07:20,446 --> 00:07:22,866 720 | Again, you see this 721 | reflected in our app. 722 | 723 | 724 | 127 725 | 00:07:25,636 --> 00:07:27,046 726 | One final example. 727 | 728 | 729 | 128 730 | 00:07:27,246 --> 00:07:30,486 731 | In Rio, the bus rapid transit 732 | systems are very important. 733 | 734 | 735 | 129 736 | 00:07:31,056 --> 00:07:33,296 737 | In many ways, they are 738 | the equals of the Metro 739 | 740 | 741 | 130 742 | 00:07:33,296 --> 00:07:34,546 743 | and commuter rail systems. 744 | 745 | 746 | 131 747 | 00:07:35,016 --> 00:07:37,716 748 | We raise the prominence of 749 | these bus rapid transit lines 750 | 751 | 752 | 132 753 | 00:07:37,716 --> 00:07:40,076 754 | on our map to reflect 755 | their importance. 756 | 757 | 758 | 133 759 | 00:07:40,586 --> 00:07:43,466 760 | That's the blue and orange lines 761 | 762 | 763 | 134 764 | 00:07:43,466 --> 00:07:45,176 765 | that you see in this 766 | screen shot. 767 | 768 | 769 | 135 770 | 00:07:48,656 --> 00:07:50,556 771 | Here is how we build 772 | up our feature. 773 | 774 | 775 | 136 776 | 00:07:51,296 --> 00:07:55,266 777 | We start with agency data for 778 | schedules, but then we survey 779 | 780 | 781 | 137 782 | 00:07:55,326 --> 00:07:57,096 783 | to add additional curated data. 784 | 785 | 786 | 138 787 | 00:07:57,276 --> 00:07:59,626 788 | For example, station 789 | entrances and line geometry 790 | 791 | 792 | 139 793 | 00:07:59,626 --> 00:08:00,766 794 | as we've previously seen. 795 | 796 | 797 | 140 798 | 00:08:01,836 --> 00:08:03,366 799 | Then we customize the experience 800 | 801 | 802 | 141 803 | 00:08:03,366 --> 00:08:05,806 804 | to respect the unique 805 | culture of each city. 806 | 807 | 808 | 142 809 | 00:08:06,576 --> 00:08:09,576 810 | Finally, this is all 811 | wrapped in our user interface 812 | 813 | 814 | 143 815 | 00:08:09,866 --> 00:08:11,696 816 | to bring delight 817 | to our customers. 818 | 819 | 820 | 144 821 | 00:08:15,596 --> 00:08:16,976 822 | Now, I'd like to give 823 | you a short demo. 824 | 825 | 826 | 145 827 | 00:08:25,106 --> 00:08:28,136 828 | Let's say you just flew into San 829 | Francisco International Airport, 830 | 831 | 832 | 146 833 | 00:08:28,326 --> 00:08:31,486 834 | and you'd like directions 835 | to Moscone West for WWDC. 836 | 837 | 838 | 147 839 | 00:08:32,395 --> 00:08:34,936 840 | First, you can see our 841 | multiagency transit map. 842 | 843 | 844 | 148 845 | 00:08:35,326 --> 00:08:38,336 846 | As I mentioned, transit lines 847 | are highlighted while roads 848 | 849 | 850 | 149 851 | 00:08:38,336 --> 00:08:38,885 852 | are dimmed. 853 | 854 | 855 | 150 856 | 00:08:39,486 --> 00:08:43,166 857 | Now, we're going to 858 | look at the departures 859 | 860 | 861 | 151 862 | 00:08:43,166 --> 00:08:44,376 863 | for Powell Street Station. 864 | 865 | 866 | 152 867 | 00:08:45,086 --> 00:08:48,056 868 | Powell Street is serviced 869 | by both BART and Muni, 870 | 871 | 872 | 153 873 | 00:08:48,056 --> 00:08:50,416 874 | and you can see the upcoming 875 | BART departures as well 876 | 877 | 878 | 154 879 | 00:08:50,446 --> 00:08:51,896 880 | as the upcoming Muni departures. 881 | 882 | 883 | 155 884 | 00:09:00,086 --> 00:09:02,446 885 | Now, at the top I noticed 886 | there was an advisory. 887 | 888 | 889 | 156 890 | 00:09:03,496 --> 00:09:04,556 891 | When I tap on details, 892 | 893 | 894 | 157 895 | 00:09:04,556 --> 00:09:07,366 896 | I see that Muni has some 897 | service changed in effect, 898 | 899 | 900 | 158 901 | 00:09:07,366 --> 00:09:09,476 902 | and we are communicating 903 | those service changes 904 | 905 | 906 | 159 907 | 00:09:09,476 --> 00:09:10,386 908 | to our customers. 909 | 910 | 911 | 160 912 | 00:09:17,836 --> 00:09:20,596 913 | You can zoom out to see 914 | the entire transit network 915 | 916 | 917 | 161 918 | 00:09:20,596 --> 00:09:20,976 919 | of the Bay Area. 920 | 921 | 922 | 162 923 | 00:09:29,506 --> 00:09:32,036 924 | Or you can zoom in 925 | to get more details. 926 | 927 | 928 | 163 929 | 00:09:35,336 --> 00:09:37,896 930 | The information density 931 | and the lines 932 | 933 | 934 | 164 935 | 00:09:37,896 --> 00:09:40,046 936 | that we show changes 937 | at each zoom. 938 | 939 | 940 | 165 941 | 00:09:40,796 --> 00:09:43,756 942 | Now, some people may want 943 | to have different choices. 944 | 945 | 946 | 166 947 | 00:09:44,166 --> 00:09:46,156 948 | So, for example, 949 | they may want to see 950 | 951 | 952 | 167 953 | 00:09:46,156 --> 00:09:47,556 954 | if a bus route is available. 955 | 956 | 957 | 168 958 | 00:09:48,096 --> 00:09:52,636 959 | In our product, you can select 960 | the exact vehicles that you'd 961 | 962 | 963 | 169 964 | 00:09:52,636 --> 00:09:53,806 965 | like to use for your journey. 966 | 967 | 968 | 170 969 | 00:09:54,846 --> 00:09:56,856 970 | Here is a competing bus route. 971 | 972 | 973 | 171 974 | 00:09:57,916 --> 00:09:59,986 975 | Now, we didn't recommend 976 | this because it takes longer. 977 | 978 | 979 | 172 980 | 00:10:00,486 --> 00:10:03,986 981 | But it's an option 982 | that's available to you. 983 | 984 | 985 | 173 986 | 00:10:04,696 --> 00:10:08,536 987 | So let's go back to our 988 | BART route and examine 989 | 990 | 991 | 174 992 | 00:10:08,536 --> 00:10:09,716 993 | that in greater detail. 994 | 995 | 996 | 175 997 | 00:10:13,776 --> 00:10:16,726 998 | The route planner tells you when 999 | to leave, how long it will take, 1000 | 1001 | 1002 | 176 1003 | 00:10:16,726 --> 00:10:17,946 1004 | and gives a summary 1005 | of the route. 1006 | 1007 | 1008 | 177 1009 | 00:10:18,386 --> 00:10:20,636 1010 | Tapping on this, I get 1011 | what we call the list view. 1012 | 1013 | 1014 | 178 1015 | 00:10:21,256 --> 00:10:23,266 1016 | A detailed list of 1017 | instructions to follow. 1018 | 1019 | 1020 | 179 1021 | 00:10:23,956 --> 00:10:26,736 1022 | I can expand the list 1023 | of stops if I'd like. 1024 | 1025 | 1026 | 180 1027 | 00:10:29,796 --> 00:10:33,106 1028 | Now, when I select start, 1029 | I enter guided navigation 1030 | 1031 | 1032 | 181 1033 | 00:10:33,106 --> 00:10:34,416 1034 | with detailed instructions. 1035 | 1036 | 1037 | 182 1038 | 00:10:34,746 --> 00:10:36,056 1039 | Since I'm already 1040 | at the airport, 1041 | 1042 | 1043 | 183 1044 | 00:10:36,096 --> 00:10:37,656 1045 | it just tells me 1046 | to board the train. 1047 | 1048 | 1049 | 184 1050 | 00:10:38,366 --> 00:10:41,346 1051 | Tells me to exit at Powell, and 1052 | shows me the previous station. 1053 | 1054 | 1055 | 185 1056 | 00:10:41,866 --> 00:10:44,896 1057 | Here you can see we're 1058 | recommending a very specific 1059 | 1060 | 1061 | 186 1062 | 00:10:44,896 --> 00:10:49,946 1063 | exit with an exit code, E3, 1064 | that's best for Moscone West. 1065 | 1066 | 1067 | 187 1068 | 00:10:52,256 --> 00:10:54,616 1069 | Finally, I arrive 1070 | at my destination. 1071 | 1072 | 1073 | 188 1074 | 00:10:59,656 --> 00:11:01,086 1075 | That concludes the presentation. 1076 | 1077 | 1078 | 189 1079 | 00:11:01,666 --> 00:11:04,256 1080 | For more information, 1081 | please visit this website 1082 | 1083 | 1084 | 190 1085 | 00:11:04,706 --> 00:11:08,806 1086 | or e mail 1087 | maps-transit@apple.com. 1088 | 1089 | 1090 | 191 1091 | 00:11:08,806 --> 00:11:09,976 1092 | Thanks for listening. 1093 | 1094 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/SD/509_sd_speech_recognition_api.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:19,286 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:19,786 --> 00:00:22,776 8 | >> Hi. I'm Henry Mason, 9 | an engineer working 10 | 11 | 12 | 3 13 | 00:00:22,776 --> 00:00:24,366 14 | on speech recognition for Siri. 15 | 16 | 17 | 4 18 | 00:00:25,486 --> 00:00:28,306 19 | Today we're incredibly excited 20 | to announce a brand new API 21 | 22 | 23 | 5 24 | 00:00:29,006 --> 00:00:31,376 25 | which will let our speech 26 | recognition solve problems 27 | 28 | 29 | 6 30 | 00:00:31,376 --> 00:00:32,386 31 | for your apps too. 32 | 33 | 34 | 7 35 | 00:00:35,246 --> 00:00:37,636 36 | A quick overview of what 37 | speech recognition is. 38 | 39 | 40 | 8 41 | 00:00:38,286 --> 00:00:40,616 42 | Speech recognition is 43 | the automatic process 44 | 45 | 46 | 9 47 | 00:00:40,616 --> 00:00:43,486 48 | of converting audio of 49 | human speech into text. 50 | 51 | 52 | 10 53 | 00:00:44,226 --> 00:00:46,276 54 | It depends on the 55 | language of the speech. 56 | 57 | 58 | 11 59 | 00:00:46,536 --> 00:00:47,976 60 | English will be recognized 61 | differently 62 | 63 | 64 | 12 65 | 00:00:47,976 --> 00:00:49,136 66 | than Chinese, for example. 67 | 68 | 69 | 13 70 | 00:00:50,196 --> 00:00:52,346 71 | On iOS, most people 72 | think of Siri 73 | 74 | 75 | 14 76 | 00:00:52,506 --> 00:00:55,376 77 | but speech recognition is also 78 | useful for many other tasks. 79 | 80 | 81 | 15 82 | 00:00:56,456 --> 00:00:58,776 83 | Since Siri was released 84 | with iPhone 4S, 85 | 86 | 87 | 16 88 | 00:00:59,166 --> 00:01:01,606 89 | iOS has also featured 90 | keyboard dictation. 91 | 92 | 93 | 17 94 | 00:01:02,776 --> 00:01:04,176 95 | That little microphone 96 | button next 97 | 98 | 99 | 18 100 | 00:01:04,176 --> 00:01:07,826 101 | to your iOS keyboard spacebar 102 | triggers speech recognition 103 | 104 | 105 | 19 106 | 00:01:07,826 --> 00:01:10,076 107 | for any UI kit text input. 108 | 109 | 110 | 20 111 | 00:01:11,116 --> 00:01:13,726 112 | Tens of thousands of apps 113 | every day use this feature. 114 | 115 | 116 | 21 117 | 00:01:14,266 --> 00:01:16,176 118 | In fact, about a third 119 | of all requests come 120 | 121 | 122 | 22 123 | 00:01:16,176 --> 00:01:17,286 124 | from third party apps. 125 | 126 | 127 | 23 128 | 00:01:18,356 --> 00:01:19,896 129 | It's extremely easy to use. 130 | 131 | 132 | 24 133 | 00:01:20,236 --> 00:01:23,356 134 | It handles audio recording 135 | and recording interruption. 136 | 137 | 138 | 25 139 | 00:01:23,476 --> 00:01:25,216 140 | It displays a user interface. 141 | 142 | 143 | 26 144 | 00:01:25,686 --> 00:01:28,106 145 | It doesn't require you to write 146 | anymore code than you would 147 | 148 | 149 | 27 150 | 00:01:28,106 --> 00:01:29,686 151 | to support any text input. 152 | 153 | 154 | 28 155 | 00:01:30,666 --> 00:01:32,446 156 | And it's been available 157 | since iOS 5. 158 | 159 | 160 | 29 161 | 00:01:36,026 --> 00:01:38,326 162 | But with its simplicity 163 | comes many limitations. 164 | 165 | 166 | 30 167 | 00:01:40,116 --> 00:01:42,376 168 | It often doesn't make sense 169 | for your user interface 170 | 171 | 172 | 31 173 | 00:01:42,376 --> 00:01:43,576 174 | to require a keyboard. 175 | 176 | 177 | 32 178 | 00:01:44,526 --> 00:01:47,146 179 | You can't control when the 180 | audio recording starts. 181 | 182 | 183 | 33 184 | 00:01:47,736 --> 00:01:49,876 185 | There's no control over 186 | which language is used. 187 | 188 | 189 | 34 190 | 00:01:49,996 --> 00:01:52,386 191 | It just happens to use the 192 | system's keyboard language. 193 | 194 | 195 | 35 196 | 00:01:53,166 --> 00:01:54,506 197 | There isn't even a way to know 198 | 199 | 200 | 36 201 | 00:01:54,506 --> 00:01:56,136 202 | if the dictation 203 | button is available. 204 | 205 | 206 | 37 207 | 00:01:58,176 --> 00:02:00,596 208 | The default audio recording 209 | might not make sense 210 | 211 | 212 | 38 213 | 00:02:00,596 --> 00:02:03,596 214 | for your use case and you 215 | may want more information 216 | 217 | 218 | 39 219 | 00:02:03,596 --> 00:02:06,726 220 | than just text. 221 | 222 | 223 | 40 224 | 00:02:07,166 --> 00:02:09,186 225 | So now in iOS 10, 226 | 227 | 228 | 41 229 | 00:02:09,186 --> 00:02:11,346 230 | we're introducing a 231 | new speech framework. 232 | 233 | 234 | 42 235 | 00:02:14,286 --> 00:02:17,246 236 | It uses the same underlying 237 | technology that we use 238 | 239 | 240 | 43 241 | 00:02:17,296 --> 00:02:18,536 242 | in Siri and Dictation. 243 | 244 | 245 | 44 246 | 00:02:19,576 --> 00:02:21,606 247 | It provides fast 248 | and accurate results 249 | 250 | 251 | 45 252 | 00:02:21,936 --> 00:02:24,166 253 | which are transparently 254 | customized to the user 255 | 256 | 257 | 46 258 | 00:02:24,666 --> 00:02:26,596 259 | without you having to 260 | collect any user data. 261 | 262 | 263 | 47 264 | 00:02:29,106 --> 00:02:31,576 265 | The framework also 266 | provides more information 267 | 268 | 269 | 48 270 | 00:02:33,356 --> 00:02:35,136 271 | about recognition 272 | than just text. 273 | 274 | 275 | 49 276 | 00:02:36,416 --> 00:02:39,066 277 | For example, we also provide 278 | alternative interpretations 279 | 280 | 281 | 50 282 | 00:02:39,066 --> 00:02:41,666 283 | of what your users might 284 | have said, confidence levels, 285 | 286 | 287 | 51 288 | 00:02:41,666 --> 00:02:42,866 289 | and timing information. 290 | 291 | 292 | 52 293 | 00:02:44,166 --> 00:02:46,316 294 | Audio for the API 295 | can be provided 296 | 297 | 298 | 53 299 | 00:02:46,316 --> 00:02:47,856 300 | from either pre-recorded files 301 | 302 | 303 | 54 304 | 00:02:47,966 --> 00:02:49,606 305 | or a live source 306 | like a microphone. 307 | 308 | 309 | 55 310 | 00:02:52,086 --> 00:02:55,616 311 | iOS 10 supports over 50 312 | languages and dialects 313 | 314 | 315 | 56 316 | 00:02:55,616 --> 00:02:56,976 317 | from Arabic to Vietnamese. 318 | 319 | 320 | 57 321 | 00:02:57,206 --> 00:03:01,256 322 | Any device which runs 323 | iOS 10 is supported. 324 | 325 | 326 | 58 327 | 00:03:03,006 --> 00:03:06,326 328 | The speech recognition API 329 | typically does its heavy lifting 330 | 331 | 332 | 59 333 | 00:03:06,326 --> 00:03:09,376 334 | on our big servers which 335 | requires an internet connection. 336 | 337 | 338 | 60 339 | 00:03:10,296 --> 00:03:14,976 340 | However, some newer devices do 341 | support speech recognition all 342 | 343 | 344 | 61 345 | 00:03:14,976 --> 00:03:15,476 346 | the time. 347 | 348 | 349 | 62 350 | 00:03:16,386 --> 00:03:18,906 351 | We provide an availability 352 | API to determine 353 | 354 | 355 | 63 356 | 00:03:18,906 --> 00:03:21,506 357 | if a given language is 358 | available at the moment. 359 | 360 | 361 | 64 362 | 00:03:21,506 --> 00:03:23,056 363 | Use this rather than looking 364 | 365 | 366 | 65 367 | 00:03:23,056 --> 00:03:25,226 368 | for internet connectivity 369 | explicitly. 370 | 371 | 372 | 66 373 | 00:03:28,356 --> 00:03:30,856 374 | Since speech recognition 375 | requires transmitting the user's 376 | 377 | 378 | 67 379 | 00:03:30,856 --> 00:03:32,096 380 | audio over the internet, 381 | 382 | 383 | 68 384 | 00:03:32,716 --> 00:03:34,796 385 | the user must explicitly 386 | provide permission 387 | 388 | 389 | 69 390 | 00:03:34,796 --> 00:03:37,766 391 | to your application before 392 | speech recognition can be used. 393 | 394 | 395 | 70 396 | 00:03:40,846 --> 00:03:42,196 397 | There are four major steps 398 | 399 | 400 | 71 401 | 00:03:42,196 --> 00:03:44,206 402 | to adopting speech 403 | recognition in your app. 404 | 405 | 406 | 72 407 | 00:03:46,726 --> 00:03:48,756 408 | First, provide a 409 | usage description 410 | 411 | 412 | 73 413 | 00:03:48,756 --> 00:03:50,116 414 | in your app's info.plist. 415 | 416 | 417 | 74 418 | 00:03:51,606 --> 00:03:54,636 419 | For example, your 420 | camera app, Phromage, 421 | 422 | 423 | 75 424 | 00:03:55,136 --> 00:03:57,306 425 | might have used a 426 | usage description 427 | 428 | 429 | 76 430 | 00:03:57,506 --> 00:04:01,536 431 | for speech recognition 432 | of this will allow you 433 | 434 | 435 | 77 436 | 00:04:01,736 --> 00:04:03,936 437 | to take a photo just 438 | by saying cheese. 439 | 440 | 441 | 78 442 | 00:04:05,966 --> 00:04:09,546 443 | Second, request authorization 444 | using the request authorization 445 | 446 | 447 | 79 448 | 00:04:09,546 --> 00:04:10,236 449 | class method. 450 | 451 | 452 | 80 453 | 00:04:11,536 --> 00:04:14,146 454 | The explanation you provided 455 | earlier will be presented 456 | 457 | 458 | 81 459 | 00:04:14,426 --> 00:04:16,596 460 | to the user in a 461 | familiar dialogue. 462 | 463 | 464 | 82 465 | 00:04:16,596 --> 00:04:19,346 466 | And the user will be able 467 | to decide if they want 468 | 469 | 470 | 83 471 | 00:04:19,346 --> 00:04:21,495 472 | to provide your app 473 | to speech recognition. 474 | 475 | 476 | 84 477 | 00:04:23,196 --> 00:04:25,336 478 | Next create a speech 479 | recognition request. 480 | 481 | 482 | 85 483 | 00:04:27,126 --> 00:04:29,156 484 | If you already have 485 | recorded audio file, 486 | 487 | 488 | 86 489 | 00:04:29,636 --> 00:04:32,606 490 | use the 491 | SFSpeechURLRecognitionRequest 492 | 493 | 494 | 87 495 | 00:04:32,606 --> 00:04:33,086 496 | class. 497 | 498 | 499 | 88 500 | 00:04:34,066 --> 00:04:34,946 501 | Otherwise, you'll want 502 | 503 | 504 | 89 505 | 00:04:34,946 --> 00:04:38,476 506 | to use the SFSpeechAudioBuffer 507 | RecognitionRequest class. 508 | 509 | 510 | 90 511 | 00:04:40,836 --> 00:04:42,806 512 | Finally hand the 513 | recognition request 514 | 515 | 516 | 91 517 | 00:04:42,806 --> 00:04:45,446 518 | to an SFSpeech recognizer 519 | to begin recognition. 520 | 521 | 522 | 92 523 | 00:04:46,456 --> 00:04:49,066 524 | You can optionally hold onto 525 | the returned recognition task 526 | 527 | 528 | 93 529 | 00:04:49,336 --> 00:04:50,836 530 | which can useful for monitoring 531 | 532 | 533 | 94 534 | 00:04:51,136 --> 00:04:52,856 535 | and controlling recognition 536 | progress. 537 | 538 | 539 | 95 540 | 00:04:56,356 --> 00:04:58,256 541 | Let's see what this 542 | all looks like in code. 543 | 544 | 545 | 96 546 | 00:04:59,286 --> 00:05:01,546 547 | We'll assume we've already 548 | updated our info.plist 549 | 550 | 551 | 97 552 | 00:05:01,546 --> 00:05:04,726 553 | with an accurate description 554 | of how will it be used. 555 | 556 | 557 | 98 558 | 00:05:05,066 --> 00:05:07,496 559 | Our next step is to 560 | request authorization. 561 | 562 | 563 | 99 564 | 00:05:08,486 --> 00:05:10,606 565 | It may be a good idea 566 | to wait to do this 567 | 568 | 569 | 100 570 | 00:05:10,606 --> 00:05:12,886 571 | until the user has invoked 572 | a feature of your app 573 | 574 | 575 | 101 576 | 00:05:12,886 --> 00:05:14,366 577 | which depends on 578 | speech recognition. 579 | 580 | 581 | 102 582 | 00:05:14,866 --> 00:05:20,036 583 | The request authorization class 584 | method takes the completion 585 | 586 | 587 | 103 588 | 00:05:20,036 --> 00:05:23,426 589 | handler which doesn't guarantee 590 | a particular execution context. 591 | 592 | 593 | 104 594 | 00:05:24,596 --> 00:05:26,976 595 | Apps will typically want to 596 | dispatch to the main queue 597 | 598 | 599 | 105 600 | 00:05:27,246 --> 00:05:29,046 601 | if they're going to do 602 | something like enable 603 | 604 | 605 | 106 606 | 00:05:29,046 --> 00:05:31,006 607 | or disable a user 608 | interface button. 609 | 610 | 611 | 107 612 | 00:05:33,636 --> 00:05:37,596 613 | If your authorization handler 614 | has given authorize status, 615 | 616 | 617 | 108 618 | 00:05:38,116 --> 00:05:39,896 619 | you should be ready 620 | to start recognition. 621 | 622 | 623 | 109 624 | 00:05:41,646 --> 00:05:44,296 625 | If not, recognition won't 626 | be available to your app. 627 | 628 | 629 | 110 630 | 00:05:45,586 --> 00:05:48,566 631 | It's important to gracefully 632 | disable necessary functionality 633 | 634 | 635 | 111 636 | 00:05:48,646 --> 00:05:50,106 637 | when the user makes 638 | this decision 639 | 640 | 641 | 112 642 | 00:05:50,886 --> 00:05:52,946 643 | or when the device is 644 | otherwise restricted 645 | 646 | 647 | 113 648 | 00:05:52,946 --> 00:05:54,506 649 | from accessing speech 650 | recognition. 651 | 652 | 653 | 114 654 | 00:05:55,496 --> 00:05:57,436 655 | Authorization can 656 | be changed later 657 | 658 | 659 | 115 660 | 00:05:57,466 --> 00:05:59,156 661 | in the device's privacy 662 | settings. 663 | 664 | 665 | 116 666 | 00:06:01,286 --> 00:06:04,066 667 | Let's see what it looks like 668 | to recognize a prerecorded 669 | 670 | 671 | 117 672 | 00:06:04,066 --> 00:06:04,796 673 | audio file. 674 | 675 | 676 | 118 677 | 00:06:05,956 --> 00:06:07,946 678 | We'll assume we already 679 | have a file url. 680 | 681 | 682 | 119 683 | 00:06:09,886 --> 00:06:12,526 684 | Recognition requires 685 | a speech recognizer 686 | 687 | 688 | 120 689 | 00:06:12,716 --> 00:06:14,716 690 | which only recognizes 691 | a single language. 692 | 693 | 694 | 121 695 | 00:06:15,536 --> 00:06:19,826 696 | The default initializer for 697 | SFSpeechRecognizer is failable. 698 | 699 | 700 | 122 701 | 00:06:20,336 --> 00:06:23,936 702 | So it'll return nil if the 703 | locale is not supported. 704 | 705 | 706 | 123 707 | 00:06:24,906 --> 00:06:27,726 708 | The default initializer uses 709 | device's current locale. 710 | 711 | 712 | 124 713 | 00:06:29,866 --> 00:06:32,236 714 | In this function, we'll just 715 | return one in this case. 716 | 717 | 718 | 125 719 | 00:06:34,586 --> 00:06:36,836 720 | While this speech 721 | recognition may be supported, 722 | 723 | 724 | 126 725 | 00:06:37,016 --> 00:06:39,316 726 | it may not be available, 727 | perhaps due 728 | 729 | 730 | 127 731 | 00:06:39,316 --> 00:06:40,846 732 | to having no internet 733 | connectivity. 734 | 735 | 736 | 128 737 | 00:06:41,966 --> 00:06:45,636 738 | Use the is available property on 739 | your recognizer to monitor this. 740 | 741 | 742 | 129 743 | 00:06:48,916 --> 00:06:50,686 744 | Now we create a recognition 745 | request 746 | 747 | 748 | 130 749 | 00:06:50,686 --> 00:06:52,916 750 | with the recorded 751 | file's url and give 752 | 753 | 754 | 131 755 | 00:06:52,916 --> 00:06:56,976 756 | that to the recognition task 757 | method of the recognizer. 758 | 759 | 760 | 132 761 | 00:07:02,046 --> 00:07:03,906 762 | This method takes 763 | completion handler 764 | 765 | 766 | 133 767 | 00:07:03,956 --> 00:07:06,366 768 | with two optional 769 | arguments, result and error. 770 | 771 | 772 | 134 773 | 00:07:07,696 --> 00:07:10,706 774 | If result is nil, that 775 | means recognition has failed 776 | 777 | 778 | 135 779 | 00:07:10,706 --> 00:07:11,456 780 | for some reason. 781 | 782 | 783 | 136 784 | 00:07:12,086 --> 00:07:14,106 785 | Check the error parameter 786 | for an explanation. 787 | 788 | 789 | 137 790 | 00:07:15,666 --> 00:07:18,896 791 | Otherwise, we can read the 792 | speech we recognize so far 793 | 794 | 795 | 138 796 | 00:07:19,306 --> 00:07:20,356 797 | by looking at results. 798 | 799 | 800 | 139 801 | 00:07:21,706 --> 00:07:24,916 802 | Note that the completion handler 803 | may be called more than once 804 | 805 | 806 | 140 807 | 00:07:25,326 --> 00:07:27,136 808 | as speech is recognized 809 | incrementally. 810 | 811 | 812 | 141 813 | 00:07:28,256 --> 00:07:30,506 814 | You can tell the 815 | recognition is finished 816 | 817 | 818 | 142 819 | 00:07:30,506 --> 00:07:33,746 820 | by checking the is final 821 | property of the result. 822 | 823 | 824 | 143 825 | 00:07:34,656 --> 00:07:37,386 826 | Here we'll just print the 827 | text of the final recognition. 828 | 829 | 830 | 144 831 | 00:07:43,926 --> 00:07:46,876 832 | Recognizing live audio from 833 | the device's microphone is very 834 | 835 | 836 | 145 837 | 00:07:46,876 --> 00:07:49,396 838 | similar but requires 839 | a few changes. 840 | 841 | 842 | 146 843 | 00:07:50,486 --> 00:07:53,176 844 | We'll make an audio buffer 845 | recognition request instead. 846 | 847 | 848 | 147 849 | 00:07:53,926 --> 00:07:55,486 850 | This allows us to 851 | provide a sequence 852 | 853 | 854 | 148 855 | 00:07:55,486 --> 00:07:58,386 856 | of in memory audio buffers 857 | instead of a file on disc. 858 | 859 | 860 | 149 861 | 00:07:59,696 --> 00:08:03,316 862 | Here we'll use AVAudioEngine to 863 | get a stream of audio buffers. 864 | 865 | 866 | 150 867 | 00:08:04,946 --> 00:08:06,306 868 | Then append them to the request. 869 | 870 | 871 | 151 872 | 00:08:07,456 --> 00:08:09,896 873 | Note that it's totally okay 874 | to append audio buffers 875 | 876 | 877 | 152 878 | 00:08:09,896 --> 00:08:11,906 879 | to a recognition 880 | request both before 881 | 882 | 883 | 153 884 | 00:08:11,906 --> 00:08:13,376 885 | and after starting recognition. 886 | 887 | 888 | 154 889 | 00:08:17,346 --> 00:08:20,596 890 | One difference here is that 891 | we no longer ignore the return 892 | 893 | 894 | 155 895 | 00:08:20,596 --> 00:08:22,616 896 | value of the recognition 897 | task method. 898 | 899 | 900 | 156 901 | 00:08:23,466 --> 00:08:25,616 902 | Instead we store it in 903 | a variable property. 904 | 905 | 906 | 157 907 | 00:08:26,366 --> 00:08:27,406 908 | We'll see why in a moment. 909 | 910 | 911 | 158 912 | 00:08:28,626 --> 00:08:32,696 913 | When we're done recording, 914 | we need to inform the request 915 | 916 | 917 | 159 918 | 00:08:32,696 --> 00:08:35,775 919 | that no more audio is coming so 920 | that it can finish recognition. 921 | 922 | 923 | 160 924 | 00:08:37,025 --> 00:08:39,046 925 | Use the end audio 926 | method to do this. 927 | 928 | 929 | 161 930 | 00:08:39,846 --> 00:08:42,076 931 | But what if the user 932 | cancels our recording 933 | 934 | 935 | 162 936 | 00:08:42,076 --> 00:08:43,885 937 | or the audio recording 938 | gets interrupted? 939 | 940 | 941 | 163 942 | 00:08:44,796 --> 00:08:47,236 943 | In this case, we really 944 | don't care about the results 945 | 946 | 947 | 164 948 | 00:08:47,416 --> 00:08:49,686 949 | and we should free up any 950 | resources still being used 951 | 952 | 953 | 165 954 | 00:08:49,686 --> 00:08:50,746 955 | by speech recognition. 956 | 957 | 958 | 166 959 | 00:08:52,786 --> 00:08:54,996 960 | Just cancel the recognition 961 | task that we started -- 962 | 963 | 964 | 167 965 | 00:08:55,196 --> 00:08:56,646 966 | we stored when we 967 | started recognition. 968 | 969 | 970 | 168 971 | 00:08:57,446 --> 00:08:59,856 972 | This can also be done for 973 | prerecorded audio recognition. 974 | 975 | 976 | 169 977 | 00:09:02,216 --> 00:09:04,516 978 | Now just a quick talk 979 | about some best practices. 980 | 981 | 982 | 170 983 | 00:09:07,276 --> 00:09:10,676 984 | We're making speech recognition 985 | available for free to all apps 986 | 987 | 988 | 171 989 | 00:09:11,256 --> 00:09:13,166 990 | but we do have some 991 | reasonable limits in place 992 | 993 | 994 | 172 995 | 00:09:13,166 --> 00:09:15,306 996 | so that the service remains 997 | available to everyone. 998 | 999 | 1000 | 173 1001 | 00:09:17,176 --> 00:09:19,426 1002 | Individual devices may 1003 | be limited in the amount 1004 | 1005 | 1006 | 174 1007 | 00:09:19,426 --> 00:09:21,416 1008 | of recognitions that can 1009 | be performed per day. 1010 | 1011 | 1012 | 175 1013 | 00:09:23,046 --> 00:09:25,216 1014 | Apps may also be 1015 | throttled globally 1016 | 1017 | 1018 | 176 1019 | 00:09:25,216 --> 00:09:26,886 1020 | on a request per day basis. 1021 | 1022 | 1023 | 177 1024 | 00:09:28,606 --> 00:09:32,986 1025 | Like other service backed 1026 | APIs, for example CLGO Coder, 1027 | 1028 | 1029 | 178 1030 | 00:09:33,656 --> 00:09:36,586 1031 | be prepared to handle network 1032 | and rate limiting failures. 1033 | 1034 | 1035 | 179 1036 | 00:09:38,326 --> 00:09:39,806 1037 | If you find that you're 1038 | routinely hitting your 1039 | 1040 | 1041 | 180 1042 | 00:09:39,806 --> 00:09:41,566 1043 | throttling limits, 1044 | please let us know. 1045 | 1046 | 1047 | 181 1048 | 00:09:42,576 --> 00:09:45,876 1049 | It's also important to be aware 1050 | 1051 | 1052 | 182 1053 | 00:09:45,876 --> 00:09:48,376 1054 | that speech recognition can 1055 | have a high cost in terms 1056 | 1057 | 1058 | 183 1059 | 00:09:48,376 --> 00:09:50,196 1060 | of battery drain 1061 | and network traffic. 1062 | 1063 | 1064 | 184 1065 | 00:09:52,336 --> 00:09:55,536 1066 | For iOS 10 we're starting with 1067 | a strict audio duration limit 1068 | 1069 | 1070 | 185 1071 | 00:09:55,536 --> 00:09:57,936 1072 | of about one minute 1073 | which is similar to that 1074 | 1075 | 1076 | 186 1077 | 00:09:57,936 --> 00:09:58,976 1078 | of keyboard dictation. 1079 | 1080 | 1081 | 187 1082 | 00:10:02,506 --> 00:10:04,576 1083 | A few words about 1084 | being transparent 1085 | 1086 | 1087 | 188 1088 | 00:10:04,576 --> 00:10:06,316 1089 | and respecting your 1090 | user's privacy. 1091 | 1092 | 1093 | 189 1094 | 00:10:07,676 --> 00:10:10,316 1095 | If you're recording the user's 1096 | speech, it's a great idea 1097 | 1098 | 1099 | 190 1100 | 00:10:10,316 --> 00:10:12,696 1101 | to make this crystal clear 1102 | in your user interface. 1103 | 1104 | 1105 | 191 1106 | 00:10:13,606 --> 00:10:16,706 1107 | Playing recording sounds and/or 1108 | displaying a visual recording 1109 | 1110 | 1111 | 192 1112 | 00:10:16,706 --> 00:10:18,536 1113 | indicator makes it 1114 | clear to your users 1115 | 1116 | 1117 | 193 1118 | 00:10:18,756 --> 00:10:19,866 1119 | that they're being recorded. 1120 | 1121 | 1122 | 194 1123 | 00:10:22,186 --> 00:10:24,726 1124 | Some speech is a bad 1125 | candidate for recognition. 1126 | 1127 | 1128 | 195 1129 | 00:10:25,556 --> 00:10:28,056 1130 | Passwords, health data, 1131 | financial information, 1132 | 1133 | 1134 | 196 1135 | 00:10:28,056 --> 00:10:30,086 1136 | and other sensitive 1137 | speech should not be given 1138 | 1139 | 1140 | 197 1141 | 00:10:30,086 --> 00:10:31,106 1142 | to speech recognition. 1143 | 1144 | 1145 | 198 1146 | 00:10:33,796 --> 00:10:36,396 1147 | Displaying speech as it 1148 | is recognized like Siri 1149 | 1150 | 1151 | 199 1152 | 00:10:36,396 --> 00:10:39,516 1153 | and Dictation do can also help 1154 | users understand what your app 1155 | 1156 | 1157 | 200 1158 | 00:10:39,516 --> 00:10:40,036 1159 | is doing. 1160 | 1161 | 1162 | 201 1163 | 00:10:40,966 --> 00:10:43,666 1164 | It can also be helpful for 1165 | users so that they can see 1166 | 1167 | 1168 | 202 1169 | 00:10:43,666 --> 00:10:45,146 1170 | when recognition errors occur. 1171 | 1172 | 1173 | 203 1174 | 00:10:47,896 --> 00:10:49,026 1175 | So developers. 1176 | 1177 | 1178 | 204 1179 | 00:10:49,456 --> 00:10:51,026 1180 | Your apps now have free access 1181 | 1182 | 1183 | 205 1184 | 00:10:51,026 --> 00:10:54,086 1185 | to high performance speech 1186 | recognition dozens of languages. 1187 | 1188 | 1189 | 206 1190 | 00:10:54,996 --> 00:10:56,826 1191 | But it's important to 1192 | gracefully handle cases 1193 | 1194 | 1195 | 207 1196 | 00:10:56,826 --> 00:10:57,756 1197 | where it's not available 1198 | 1199 | 1200 | 208 1201 | 00:10:57,756 --> 00:10:59,656 1202 | or the user doesn't 1203 | want your app to use it. 1204 | 1205 | 1206 | 209 1207 | 00:11:01,136 --> 00:11:02,966 1208 | Transparency is the best policy. 1209 | 1210 | 1211 | 210 1212 | 00:11:03,456 --> 00:11:04,396 1213 | Make it clear to the user 1214 | 1215 | 1216 | 211 1217 | 00:11:04,396 --> 00:11:06,246 1218 | when speech recognition 1219 | is being used. 1220 | 1221 | 1222 | 212 1223 | 00:11:07,916 --> 00:11:09,976 1224 | We're incredibly excited 1225 | to see what new uses 1226 | 1227 | 1228 | 213 1229 | 00:11:09,976 --> 00:11:11,946 1230 | for speech recognition 1231 | you come up with. 1232 | 1233 | 1234 | 214 1235 | 00:11:14,186 --> 00:11:16,416 1236 | For more information 1237 | and some sample code, 1238 | 1239 | 1240 | 215 1241 | 00:11:16,526 --> 00:11:18,096 1242 | check out this session's 1243 | webpage. 1244 | 1245 | 1246 | 216 1247 | 00:11:18,996 --> 00:11:21,396 1248 | You might also be interested 1249 | in some sessions on SiriKit. 1250 | 1251 | 1252 | 217 1253 | 00:11:21,956 --> 00:11:24,786 1254 | There's one on Wednesday and 1255 | the more advanced one later 1256 | 1257 | 1258 | 218 1259 | 00:11:24,786 --> 00:11:25,436 1260 | on Thursday. 1261 | 1262 | 1263 | 219 1264 | 00:11:26,706 --> 00:11:28,976 1265 | Thank you for your time 1266 | and have a great WWDC. 1267 | 1268 | -------------------------------------------------------------------------------- /wwdc_sessions/subtitles/SD/724_sd_whats_new_in_the_apple_push_notification_service.srt: -------------------------------------------------------------------------------- 1 | 1 2 | 00:00:07,516 --> 00:00:17,500 3 | [ Music ] 4 | 5 | 6 | 2 7 | 00:00:21,606 --> 00:00:25,336 8 | >> Welcome to the 9 | session 724 on What's New 10 | 11 | 12 | 3 13 | 00:00:25,486 --> 00:00:27,516 14 | in Apple Push Notification 15 | Service. 16 | 17 | 18 | 4 19 | 00:00:28,136 --> 00:00:29,886 20 | My name is Mayur Mahajan. 21 | 22 | 23 | 5 24 | 00:00:30,426 --> 00:00:35,006 25 | And I work on the Apple Push 26 | Notification Service, or APNS. 27 | 28 | 29 | 6 30 | 00:00:35,426 --> 00:00:39,846 31 | And I'm excited to share with 32 | you what's coming to APNS. 33 | 34 | 35 | 7 36 | 00:00:40,366 --> 00:00:45,716 37 | Let's get started with a review 38 | of important enhancements 39 | 40 | 41 | 8 42 | 00:00:45,716 --> 00:00:47,036 43 | that were released last year. 44 | 45 | 46 | 9 47 | 00:00:48,106 --> 00:00:52,416 48 | First, we introduced a brand 49 | new provider protocol based 50 | 51 | 52 | 10 53 | 00:00:52,646 --> 00:00:55,236 54 | on HTTP/2 persistent Pushes. 55 | 56 | 57 | 11 58 | 00:00:56,076 --> 00:01:01,166 59 | HTTP/2 is a binary protocol 60 | that supports multiple streams 61 | 62 | 63 | 12 64 | 00:01:01,166 --> 00:01:04,836 65 | over a single connection 66 | and is extremely fast. 67 | 68 | 69 | 13 70 | 00:01:05,636 --> 00:01:08,506 71 | The new protocol has 72 | made it very easy 73 | 74 | 75 | 14 76 | 00:01:09,026 --> 00:01:11,436 77 | to send Push notifications 78 | to their devices. 79 | 80 | 81 | 15 82 | 00:01:11,976 --> 00:01:16,456 83 | The new protocol supports 84 | providing instant feedback 85 | 86 | 87 | 16 88 | 00:01:17,066 --> 00:01:20,576 89 | to indicate which device 90 | tokens are no longer active. 91 | 92 | 93 | 17 94 | 00:01:22,096 --> 00:01:25,466 95 | It is also possible to 96 | send larger payloads, 97 | 98 | 99 | 18 100 | 00:01:26,066 --> 00:01:29,226 101 | up to four kilobytes, that 102 | you can take advantage 103 | 104 | 105 | 19 106 | 00:01:29,226 --> 00:01:31,706 107 | of for creating rich 108 | applications. 109 | 110 | 111 | 20 112 | 00:01:32,216 --> 00:01:36,696 113 | In addition, we'll simplify 114 | the certificate handling 115 | 116 | 117 | 21 118 | 00:01:37,526 --> 00:01:41,996 119 | so you will now have to maintain 120 | fewer client certificates used 121 | 122 | 123 | 22 124 | 00:01:41,996 --> 00:01:43,786 125 | to connect to APNS. 126 | 127 | 128 | 23 129 | 00:01:44,316 --> 00:01:48,026 130 | We have received a lot 131 | of positive feedback 132 | 133 | 134 | 24 135 | 00:01:48,026 --> 00:01:49,366 136 | from the developer community. 137 | 138 | 139 | 25 140 | 00:01:50,676 --> 00:01:52,776 141 | We deliver hundreds of thousands 142 | 143 | 144 | 26 145 | 00:01:52,776 --> 00:01:55,786 146 | of notifications per second 147 | using this new protocol. 148 | 149 | 150 | 27 151 | 00:01:56,756 --> 00:01:59,796 152 | If you are not using this 153 | already you should definitely 154 | 155 | 156 | 28 157 | 00:01:59,796 --> 00:02:00,766 158 | try it. 159 | 160 | 161 | 29 162 | 00:02:03,446 --> 00:02:07,436 163 | So let's recap the sequence 164 | of steps that are involved 165 | 166 | 167 | 30 168 | 00:02:07,436 --> 00:02:09,076 169 | in sending Push notifications. 170 | 171 | 172 | 31 173 | 00:02:09,756 --> 00:02:12,956 174 | On the bottom right is 175 | your client application. 176 | 177 | 178 | 32 179 | 00:02:13,386 --> 00:02:16,736 180 | And on the top right 181 | is the provider, 182 | 183 | 184 | 33 185 | 00:02:17,116 --> 00:02:20,836 186 | which is the server component 187 | that connects to APNS 188 | 189 | 190 | 34 191 | 00:02:21,356 --> 00:02:23,156 192 | and sends Push notifications. 193 | 194 | 195 | 35 196 | 00:02:24,746 --> 00:02:27,166 197 | Now, before you start 198 | sending notifications, 199 | 200 | 201 | 36 202 | 00:02:27,866 --> 00:02:30,356 203 | you should register 204 | for Push notifications 205 | 206 | 207 | 37 208 | 00:02:30,506 --> 00:02:31,826 209 | in the developer account. 210 | 211 | 212 | 38 213 | 00:02:32,296 --> 00:02:37,216 214 | The application will register 215 | with the operating system, 216 | 217 | 218 | 39 219 | 00:02:37,776 --> 00:02:39,916 220 | running on the device 221 | on the bottom left. 222 | 223 | 224 | 40 225 | 00:02:41,156 --> 00:02:44,836 226 | The device will request 227 | a token from APNS 228 | 229 | 230 | 41 231 | 00:02:45,126 --> 00:02:46,936 232 | on behalf of the application. 233 | 234 | 235 | 42 236 | 00:02:47,726 --> 00:02:49,686 237 | And then return it back 238 | to your application. 239 | 240 | 241 | 43 242 | 00:02:50,236 --> 00:02:53,846 243 | This device token will be unique 244 | 245 | 246 | 44 247 | 00:02:53,846 --> 00:02:56,606 248 | for your application 249 | running on this device. 250 | 251 | 252 | 45 253 | 00:02:57,126 --> 00:03:02,056 254 | Your application should forward 255 | this token to the provider. 256 | 257 | 258 | 46 259 | 00:03:03,216 --> 00:03:06,286 260 | Now, the provider 261 | service will connect 262 | 263 | 264 | 47 265 | 00:03:06,286 --> 00:03:09,566 266 | to APNS using the 267 | client certificate 268 | 269 | 270 | 48 271 | 00:03:09,886 --> 00:03:14,166 272 | and then use standard 273 | HTTP/2 post request 274 | 275 | 276 | 49 277 | 00:03:15,016 --> 00:03:17,076 278 | to send a Push to 279 | that device token. 280 | 281 | 282 | 50 283 | 00:03:20,196 --> 00:03:26,616 284 | HTTP/2 provider API will provide 285 | an immediate response indicating 286 | 287 | 288 | 51 289 | 00:03:26,616 --> 00:03:28,866 290 | success if everything was okay. 291 | 292 | 293 | 52 294 | 00:03:29,766 --> 00:03:32,686 295 | And APNS has received 296 | and validated 297 | 298 | 299 | 53 300 | 00:03:32,826 --> 00:03:35,686 301 | that the Push request 302 | is [inaudible]. 303 | 304 | 305 | 54 306 | 00:03:36,576 --> 00:03:42,296 307 | Now, if there was an error, say 308 | the device token is not valid, 309 | 310 | 311 | 55 312 | 00:03:42,296 --> 00:03:47,456 313 | APNS will return an error 314 | status 400, or "invalid request" 315 | 316 | 317 | 56 318 | 00:03:48,156 --> 00:03:50,856 319 | with adjacent payload 320 | indicating the reason. 321 | 322 | 323 | 57 324 | 00:03:51,676 --> 00:03:54,356 325 | For example, a bad device token. 326 | 327 | 328 | 58 329 | 00:03:54,916 --> 00:04:00,486 330 | The new provider protocol also 331 | provides instant feedback. 332 | 333 | 334 | 59 335 | 00:04:01,056 --> 00:04:03,726 336 | So if a device token 337 | has been removed, 338 | 339 | 340 | 60 341 | 00:04:04,436 --> 00:04:10,276 342 | you will get an HTTP/2 response 343 | with status 410, or "removed." 344 | 345 | 346 | 61 347 | 00:04:10,896 --> 00:04:15,386 348 | It will have a time stamp 349 | in payload indicating 350 | 351 | 352 | 62 353 | 00:04:15,576 --> 00:04:20,396 354 | when APNS last learned that the 355 | device token has been removed. 356 | 357 | 358 | 63 359 | 00:04:24,116 --> 00:04:27,306 360 | We also simplified 361 | certificate handling as part 362 | 363 | 364 | 64 365 | 00:04:27,306 --> 00:04:29,006 366 | of the new provider protocol. 367 | 368 | 369 | 65 370 | 00:04:30,246 --> 00:04:33,196 371 | You can now provision 372 | a single certificate 373 | 374 | 375 | 66 376 | 00:04:33,546 --> 00:04:38,536 377 | for your application, 378 | complication, and VoiP Pushes. 379 | 380 | 381 | 67 382 | 00:04:39,056 --> 00:04:44,176 383 | The same certificate can 384 | be used in both development 385 | 386 | 387 | 68 388 | 00:04:44,446 --> 00:04:46,016 389 | and production environments. 390 | 391 | 392 | 69 393 | 00:04:47,246 --> 00:04:51,046 394 | This has reduced the 395 | headaches of managing, renewing 396 | 397 | 398 | 70 399 | 00:04:51,366 --> 00:04:54,046 400 | and revocation of 401 | multiple certificates 402 | 403 | 404 | 71 405 | 00:04:54,076 --> 00:04:55,386 406 | for many developers. 407 | 408 | 409 | 72 410 | 00:04:55,926 --> 00:04:58,966 411 | Now, we are listening 412 | to feedback 413 | 414 | 415 | 73 416 | 00:04:58,996 --> 00:05:00,436 417 | from developers like you. 418 | 419 | 420 | 74 421 | 00:05:01,076 --> 00:05:02,936 422 | And we understand the importance 423 | 424 | 425 | 75 426 | 00:05:03,036 --> 00:05:05,966 427 | of simplifying the work 428 | flow that's involved 429 | 430 | 431 | 76 432 | 00:05:06,106 --> 00:05:07,786 433 | in sending Push notifications. 434 | 435 | 436 | 77 437 | 00:05:09,046 --> 00:05:12,696 438 | We understand that managing 439 | certificates is too complex 440 | 441 | 442 | 78 443 | 00:05:12,846 --> 00:05:14,036 444 | for some applications. 445 | 446 | 447 | 79 448 | 00:05:14,606 --> 00:05:20,246 449 | So today we are thrilled 450 | to announce a brand new 451 | 452 | 453 | 80 454 | 00:05:20,596 --> 00:05:24,726 455 | and a simple way of 456 | authenticating against APNS. 457 | 458 | 459 | 81 460 | 00:05:25,976 --> 00:05:28,706 461 | Introducing token authentication 462 | 463 | 464 | 82 465 | 00:05:28,916 --> 00:05:31,566 466 | for Apple Push notification 467 | service. 468 | 469 | 470 | 83 471 | 00:05:32,006 --> 00:05:40,596 472 | Token authentication is a way 473 | of using provider tokens instead 474 | 475 | 476 | 84 477 | 00:05:40,596 --> 00:05:44,186 478 | of client certificate when 479 | sending notifications. 480 | 481 | 482 | 85 483 | 00:05:47,546 --> 00:05:50,466 484 | The authentication 485 | tokens are intended 486 | 487 | 488 | 86 489 | 00:05:50,466 --> 00:05:54,056 490 | to simplify how services 491 | connect to APNS. 492 | 493 | 494 | 87 495 | 00:05:55,176 --> 00:05:59,606 496 | In addition, the tokens are easy 497 | to generate programmatically, 498 | 499 | 500 | 88 501 | 00:06:00,446 --> 00:06:03,316 502 | so there is no need 503 | to worry about having 504 | 505 | 506 | 89 507 | 00:06:03,316 --> 00:06:05,596 508 | to reissue expiring 509 | certificates. 510 | 511 | 512 | 90 513 | 00:06:06,916 --> 00:06:11,086 514 | This is enabled through 515 | the use of JSON Web tokens 516 | 517 | 518 | 91 519 | 00:06:11,566 --> 00:06:15,396 520 | as a mechanism to generate 521 | authentication credentials. 522 | 523 | 524 | 92 525 | 00:06:15,396 --> 00:06:20,826 526 | There are a number of libraries 527 | widely available for use 528 | 529 | 530 | 93 531 | 00:06:20,986 --> 00:06:23,536 532 | with the programming 533 | language of your choice 534 | 535 | 536 | 94 537 | 00:06:23,736 --> 00:06:25,076 538 | to generate these tokens. 539 | 540 | 541 | 95 542 | 00:06:25,626 --> 00:06:29,746 543 | Now, before we get 544 | into the details 545 | 546 | 547 | 96 548 | 00:06:30,336 --> 00:06:32,326 549 | of how token authentication 550 | works, 551 | 552 | 553 | 97 554 | 00:06:32,326 --> 00:06:36,436 555 | let's first recap how 556 | certificate authentication 557 | 558 | 559 | 98 560 | 00:06:36,436 --> 00:06:37,306 561 | will work. 562 | 563 | 564 | 99 565 | 00:06:39,696 --> 00:06:40,546 566 | You opt in. 567 | 568 | 569 | 100 570 | 00:06:41,036 --> 00:06:46,746 571 | Provide a client certificate 572 | from your developer account. 573 | 574 | 575 | 101 576 | 00:06:48,066 --> 00:06:52,056 577 | When connecting to APNS 578 | using mutual authentication, 579 | 580 | 581 | 102 582 | 00:06:53,026 --> 00:06:56,156 583 | APNS will provide a 584 | server certificate 585 | 586 | 587 | 103 588 | 00:06:56,646 --> 00:06:58,786 589 | that you will trust 590 | and validate. 591 | 592 | 593 | 104 594 | 00:06:59,256 --> 00:07:01,666 595 | As part of the handshake, 596 | 597 | 598 | 105 599 | 00:07:02,276 --> 00:07:05,816 600 | your provider will also 601 | sign the client certificate, 602 | 603 | 604 | 106 605 | 00:07:06,316 --> 00:07:11,306 606 | which APNS will validate and 607 | use to establish credentials. 608 | 609 | 610 | 107 611 | 00:07:12,096 --> 00:07:16,216 612 | At this point, there is a 613 | trusted connection established 614 | 615 | 616 | 108 617 | 00:07:16,216 --> 00:07:19,066 618 | between APNS and the provider. 619 | 620 | 621 | 109 622 | 00:07:20,576 --> 00:07:24,076 623 | Any Pushes you send on this 624 | connection are attached 625 | 626 | 627 | 110 628 | 00:07:24,266 --> 00:07:28,000 629 | to the application identified 630 | by the client certificate. 631 | 632 | 633 | 111 634 | 00:07:32,436 --> 00:07:35,716 635 | When using token 636 | authentication, you should opt 637 | 638 | 639 | 112 640 | 00:07:35,716 --> 00:07:38,606 641 | in a token sign-in 642 | key from the account. 643 | 644 | 645 | 113 646 | 00:07:40,246 --> 00:07:43,676 647 | Your provider will then 648 | establish a PLS connection 649 | 650 | 651 | 114 652 | 00:07:44,316 --> 00:07:45,816 653 | without a client certificate. 654 | 655 | 656 | 115 657 | 00:07:46,806 --> 00:07:49,526 658 | However, before sending 659 | notifications 660 | 661 | 662 | 116 663 | 00:07:49,526 --> 00:07:54,176 664 | on this connection, the provider 665 | will construct an authentication 666 | 667 | 668 | 117 669 | 00:07:54,176 --> 00:07:57,286 670 | token that includes 671 | your team ID. 672 | 673 | 674 | 118 675 | 00:07:58,086 --> 00:08:02,066 676 | And then sign it using 677 | the key opt indicator. 678 | 679 | 680 | 119 681 | 00:08:06,686 --> 00:08:10,046 682 | Now it's possible to 683 | send notifications 684 | 685 | 686 | 120 687 | 00:08:10,046 --> 00:08:10,926 688 | on this connection. 689 | 690 | 691 | 121 692 | 00:08:12,146 --> 00:08:16,996 693 | Every notification message 694 | that's signed must include the 695 | 696 | 697 | 122 698 | 00:08:16,996 --> 00:08:18,026 699 | authentication token. 700 | 701 | 702 | 123 703 | 00:08:19,226 --> 00:08:23,766 704 | Also, the application topic 705 | should be part of this request. 706 | 707 | 708 | 124 709 | 00:08:24,146 --> 00:08:29,976 710 | APNS will first authenticate 711 | the provider using the token 712 | 713 | 714 | 125 715 | 00:08:30,566 --> 00:08:32,486 716 | and then process the request. 717 | 718 | 719 | 126 720 | 00:08:33,076 --> 00:08:37,716 721 | If this request is 722 | processed successfully, 723 | 724 | 725 | 127 726 | 00:08:37,716 --> 00:08:43,566 727 | APNS will send a response 728 | back indicating success. 729 | 730 | 731 | 128 732 | 00:08:44,155 --> 00:08:47,896 733 | If no token was provided 734 | with the request 735 | 736 | 737 | 129 738 | 00:08:48,036 --> 00:08:50,236 739 | or if the token was invalid, 740 | 741 | 742 | 130 743 | 00:08:51,266 --> 00:08:54,616 744 | a response will be sent 745 | back indicating the error. 746 | 747 | 748 | 131 749 | 00:08:55,166 --> 00:09:01,796 750 | As a reminder, APNS will not 751 | close the connection on error. 752 | 753 | 754 | 132 755 | 00:09:03,346 --> 00:09:06,926 756 | So let's take a look at how 757 | to generate a provider token. 758 | 759 | 760 | 133 761 | 00:09:08,606 --> 00:09:11,926 762 | You should start with 763 | provisioning a sign-in key 764 | 765 | 766 | 134 767 | 00:09:12,626 --> 00:09:15,616 768 | from the certificates, 769 | identities 770 | 771 | 772 | 135 773 | 00:09:15,886 --> 00:09:18,126 774 | and profile section 775 | in the account. 776 | 777 | 778 | 136 779 | 00:09:18,626 --> 00:09:23,716 780 | A public-private 781 | keypad is generated. 782 | 783 | 784 | 137 785 | 00:09:24,326 --> 00:09:27,456 786 | And the private key 787 | can then be used 788 | 789 | 790 | 138 791 | 00:09:27,766 --> 00:09:31,366 792 | to cryptographically 793 | sign the token data. 794 | 795 | 796 | 139 797 | 00:09:32,656 --> 00:09:35,196 798 | Apple will use the 799 | corresponding public key 800 | 801 | 802 | 140 803 | 00:09:35,966 --> 00:09:37,576 804 | for validating the token. 805 | 806 | 807 | 141 808 | 00:09:38,036 --> 00:09:42,206 809 | Next, let's look at how 810 | you construct the token. 811 | 812 | 813 | 142 814 | 00:09:42,816 --> 00:09:51,336 815 | At the top is an example of what 816 | a JSON Web token that's part 817 | 818 | 819 | 143 820 | 00:09:51,336 --> 00:09:53,766 821 | of the request might look like. 822 | 823 | 824 | 144 825 | 00:09:55,416 --> 00:09:58,566 826 | Let's go over the structure 827 | of this JSON Web token. 828 | 829 | 830 | 145 831 | 00:10:01,086 --> 00:10:02,786 832 | You can see it has three parts. 833 | 834 | 835 | 146 836 | 00:10:03,386 --> 00:10:09,606 837 | Each part is a URL friendly 838 | base-64 encoded string that's 839 | 840 | 841 | 147 842 | 00:10:09,606 --> 00:10:11,906 843 | delimited by a period. 844 | 845 | 846 | 148 847 | 00:10:13,106 --> 00:10:15,566 848 | Below is the decoded 849 | representation 850 | 851 | 852 | 149 853 | 00:10:15,566 --> 00:10:16,636 854 | of this Web token. 855 | 856 | 857 | 150 858 | 00:10:17,166 --> 00:10:20,616 859 | The first part is the header. 860 | 861 | 862 | 151 863 | 00:10:21,826 --> 00:10:23,856 864 | And it includes attributes 865 | 866 | 867 | 152 868 | 00:10:24,016 --> 00:10:27,936 869 | that specify the algorithm 870 | used to sign the token. 871 | 872 | 873 | 153 874 | 00:10:28,746 --> 00:10:31,866 875 | In our case, it's ES256. 876 | 877 | 878 | 154 879 | 00:10:32,636 --> 00:10:38,036 880 | It will also include the 881 | key identifier for the key 882 | 883 | 884 | 155 885 | 00:10:38,586 --> 00:10:40,116 886 | that is used to sign the token. 887 | 888 | 889 | 156 890 | 00:10:40,696 --> 00:10:47,076 891 | The claims section will 892 | include an assurer tribute, 893 | 894 | 895 | 157 896 | 00:10:47,556 --> 00:10:50,596 897 | which is your developer team ID 898 | 899 | 900 | 158 901 | 00:10:51,156 --> 00:10:53,226 902 | that can be obtained 903 | from the account. 904 | 905 | 906 | 159 907 | 00:10:53,696 --> 00:11:00,016 908 | The next attribute in the claims 909 | is initial time stamp that's 910 | 911 | 912 | 160 913 | 00:11:00,016 --> 00:11:03,066 914 | expressed as seconds 915 | since epoch. 916 | 917 | 918 | 161 919 | 00:11:04,536 --> 00:11:07,696 920 | The last part of the token 921 | is simply the signature 922 | 923 | 924 | 162 925 | 00:11:07,896 --> 00:11:11,726 926 | in base 64 obtained by 927 | applying the signing algorithm 928 | 929 | 930 | 163 931 | 00:11:12,286 --> 00:11:14,146 932 | to the header and the claims. 933 | 934 | 935 | 164 936 | 00:11:15,436 --> 00:11:17,856 937 | This prevents any 938 | unauthorized tampering 939 | 940 | 941 | 165 942 | 00:11:18,366 --> 00:11:21,000 943 | of the token once 944 | it is generated. 945 | 946 | 947 | 166 948 | 00:11:25,326 --> 00:11:28,666 949 | Here is what an HTTP/2 creates 950 | 951 | 952 | 167 953 | 00:11:28,776 --> 00:11:31,866 954 | for a request using token 955 | authentication will look like. 956 | 957 | 958 | 168 959 | 00:11:33,036 --> 00:11:37,036 960 | As you can see, this 961 | request contains a header 962 | 963 | 964 | 169 965 | 00:11:37,116 --> 00:11:38,036 966 | and a data frame. 967 | 968 | 969 | 170 970 | 00:11:39,136 --> 00:11:40,586 971 | The header frame consists 972 | 973 | 974 | 171 975 | 00:11:40,586 --> 00:11:44,306 976 | of various header fields 977 | including APNS topic. 978 | 979 | 980 | 172 981 | 00:11:45,566 --> 00:11:50,016 982 | Now, you will notice that the 983 | header frame now includes an 984 | 985 | 986 | 173 987 | 00:11:50,016 --> 00:11:54,896 988 | authorization header with 989 | the value "bearer" followed 990 | 991 | 992 | 174 993 | 00:11:54,896 --> 00:11:56,476 994 | by the signed provider token. 995 | 996 | 997 | 175 998 | 00:11:57,036 --> 00:12:02,896 999 | If the request including the 1000 | authentication token is valid, 1001 | 1002 | 1003 | 176 1004 | 00:12:03,816 --> 00:12:07,386 1005 | the response will be 1006 | status 200 or "OK." 1007 | 1008 | 1009 | 177 1010 | 00:12:11,426 --> 00:12:13,106 1011 | Here is what the 1012 | response will look 1013 | 1014 | 1015 | 178 1016 | 00:12:13,636 --> 00:12:16,316 1017 | if the provider token 1018 | was not valid. 1019 | 1020 | 1021 | 179 1022 | 00:12:17,576 --> 00:12:21,876 1023 | In this case, it is 1024 | status 403, or "Forbidden." 1025 | 1026 | 1027 | 180 1028 | 00:12:23,346 --> 00:12:28,186 1029 | Now, APNS will require 1030 | that new tokens be 1031 | 1032 | 1033 | 181 1034 | 00:12:28,186 --> 00:12:29,506 1035 | periodically generated. 1036 | 1037 | 1038 | 182 1039 | 00:12:30,096 --> 00:12:36,926 1040 | If the token is too old, 1041 | the response will, again, 1042 | 1043 | 1044 | 183 1045 | 00:12:37,056 --> 00:12:42,096 1046 | be a 403 "Forbidden" error 1047 | with reason indicating 1048 | 1049 | 1050 | 184 1051 | 00:12:42,366 --> 00:12:44,036 1052 | that the token has expired. 1053 | 1054 | 1055 | 185 1056 | 00:12:44,526 --> 00:12:51,406 1057 | APNS will require that the 1058 | token creation time must be 1059 | 1060 | 1061 | 186 1062 | 00:12:51,406 --> 00:12:53,396 1063 | within the last hour. 1064 | 1065 | 1066 | 187 1067 | 00:12:54,376 --> 00:12:59,196 1068 | However, a new token should not 1069 | be generated on every request. 1070 | 1071 | 1072 | 188 1073 | 00:13:00,126 --> 00:13:03,176 1074 | In fact, for performance 1075 | we recommend 1076 | 1077 | 1078 | 189 1079 | 00:13:03,516 --> 00:13:07,486 1080 | that the token be reused 1081 | as long as it is valid. 1082 | 1083 | 1084 | 190 1085 | 00:13:11,486 --> 00:13:15,226 1086 | So here are a few more details 1087 | regarding token authentication. 1088 | 1089 | 1090 | 191 1091 | 00:13:16,506 --> 00:13:20,676 1092 | As mentioned earlier, 1093 | the provider tokens need 1094 | 1095 | 1096 | 192 1097 | 00:13:20,676 --> 00:13:22,286 1098 | to be generated periodically. 1099 | 1100 | 1101 | 193 1102 | 00:13:23,346 --> 00:13:27,296 1103 | However, note that the 1104 | sign-in key does not expire. 1105 | 1106 | 1107 | 194 1108 | 00:13:28,656 --> 00:13:32,356 1109 | Now, if you suspect that the 1110 | sign-in key may have been 1111 | 1112 | 1113 | 195 1114 | 00:13:32,356 --> 00:13:36,556 1115 | compromised, you can revoke 1116 | the key from your account 1117 | 1118 | 1119 | 196 1120 | 00:13:36,976 --> 00:13:38,826 1121 | and provision a new key. 1122 | 1123 | 1124 | 197 1125 | 00:13:39,386 --> 00:13:44,166 1126 | As a reminder, APNS 1127 | will continue 1128 | 1129 | 1130 | 198 1131 | 00:13:44,486 --> 00:13:46,236 1132 | to support certificate 1133 | authentication. 1134 | 1135 | 1136 | 199 1137 | 00:13:46,826 --> 00:13:50,716 1138 | So that is token authentication. 1139 | 1140 | 1141 | 200 1142 | 00:13:51,806 --> 00:13:54,366 1143 | And it's coming later this year. 1144 | 1145 | 1146 | 201 1147 | 00:13:54,946 --> 00:14:01,196 1148 | For more information visit 1149 | the Website for this session 1150 | 1151 | 1152 | 202 1153 | 00:14:01,876 --> 00:14:10,246 1154 | at 1155 | developer.apple.com/wwdc16/724. 1156 | 1157 | 1158 | 203 1159 | 00:14:12,856 --> 00:14:15,586 1160 | Here are relevant 1161 | sessions on notifications 1162 | 1163 | 1164 | 204 1165 | 00:14:15,786 --> 00:14:19,116 1166 | that you might be 1167 | interested in: Introduction 1168 | 1169 | 1170 | 205 1171 | 00:14:19,116 --> 00:14:23,476 1172 | to Notifications will be in 1173 | Pacific Heights on Wednesday 1174 | 1175 | 1176 | 206 1177 | 00:14:23,846 --> 00:14:27,086 1178 | at 9:00 a.m. followed 1179 | by a session 1180 | 1181 | 1182 | 207 1183 | 00:14:27,256 --> 00:14:31,416 1184 | on Advanced Notifications in 1185 | Pacific Heights on Wednesday 1186 | 1187 | 1188 | 208 1189 | 00:14:31,696 --> 00:14:34,496 1190 | at 10:00 a.m. And we 1191 | hope to see you there. 1192 | 1193 | 1194 | 209 1195 | 00:14:35,126 --> 00:14:36,136 1196 | Thank you very much. 1197 | 1198 | -------------------------------------------------------------------------------- /wwdc_sessions/wwdc2016pdf_links.txt: -------------------------------------------------------------------------------- 1 | http://devstreaming.apple.com/videos/wwdc/2016/228a1kbxogojm4fviqc/228/228_a_peek_at_3d_touch.pdf 2 | http://devstreaming.apple.com/videos/wwdc/2016/216v55u6zpxizxkml6k/216/216_advances_in_uikit_animations_and_transitions.pdf 3 | http://devstreaming.apple.com/videos/wwdc/2016/227a480gfx4hwinv5x9/227/227_architecting_for_performance_on_watchos_3.pdf 4 | http://devstreaming.apple.com/videos/wwdc/2016/235dk9q4a4mflq2dbms/235/235_building_great_workout_apps.pdf 5 | http://devstreaming.apple.com/videos/wwdc/2016/231bhrh1z1fzrejhbz7/231/231_cloudkit_best_practices.pdf 6 | http://devstreaming.apple.com/videos/wwdc/2016/239ebj00keggvd2m2fx/239/239_crafting_modern_cocoa_apps.pdf 7 | http://devstreaming.apple.com/videos/wwdc/2016/212s41rh77qgdg26s86/212/212_developing_tvos_apps_using_tvmlkit_part_1.pdf 8 | http://devstreaming.apple.com/videos/wwdc/2016/229b09xkrv3t6tdzwsu/229/229_developing_tvos_apps_using_tvmlkit_part_2.pdf 9 | http://devstreaming.apple.com/videos/wwdc/2016/230b83wfxc7m69dm90q/230/230_enhancing_voip_apps_with_callkit.pdf 10 | http://devstreaming.apple.com/videos/wwdc/2016/225e97ww3majsu3bvt8/225/225_extending_your_apps_with_sirikit.pdf 11 | http://devstreaming.apple.com/videos/wwdc/2016/214b51jlndqja1bpptt/214/214_extending_your_app_with_safari_app_extensions.pdf 12 | http://devstreaming.apple.com/videos/wwdc/2016/215e597a1en6wrh89hm/215/215_focus_interaction_on_tvos.pdf 13 | http://devstreaming.apple.com/videos/wwdc/2016/237e12rha4rg2t0p53u/237/237_getting_started_with_carekit.pdf 14 | http://devstreaming.apple.com/videos/wwdc/2016/209e37d5ks3pfj21ij5/209/209_getting_the_most_out_of_healthkit.pdf 15 | http://devstreaming.apple.com/videos/wwdc/2016/213r47rtymgcyythv7w/213/213_improving_existing_apps_with_modern_best_practices.pdf 16 | http://devstreaming.apple.com/videos/wwdc/2016/240f49ca5uvbzg5pwk5/240/240_increase_usage_of_your_app_with_proactive_suggestions.pdf 17 | http://devstreaming.apple.com/videos/wwdc/2016/201h1g4asm31ti2l9n1/201/201_internationalization_best_practices.pdf 18 | http://devstreaming.apple.com/videos/wwdc/2016/217x5143f51ztsxao1u/217/217_introducing_sirikit.pdf 19 | http://devstreaming.apple.com/videos/wwdc/2016/218e59uvbkp1smncrss/218/218_keeping_your_watch_app_up_to_date.pdf 20 | http://devstreaming.apple.com/videos/wwdc/2016/220c6lnr7wkcjewnj1g/220/220_leveraging_touch_input_on_ios.pdf 21 | http://devstreaming.apple.com/videos/wwdc/2016/222l873ttj77llkzbzs/222/222_making_apps_adaptive_part_1.pdf 22 | http://devstreaming.apple.com/videos/wwdc/2016/233c3uhytv8cxwoanja/233/233_making_apps_adaptive_part_2.pdf 23 | http://devstreaming.apple.com/videos/wwdc/2016/223j90dqr7q1xyld1mv/223/223_making_the_most_of_search_apis.pdf 24 | http://devstreaming.apple.com/videos/wwdc/2016/210e4481b1cnwor4n1q/210/210_mastering_uikit_on_tvos.pdf 25 | http://devstreaming.apple.com/videos/wwdc/2016/238eemv232k9lp2px30/238/238_measurements_and_units.pdf 26 | http://devstreaming.apple.com/videos/wwdc/2016/221l723gdmjyvv5pmw7/221/221_optimizing_ondemand_resources.pdf 27 | http://devstreaming.apple.com/videos/wwdc/2016/241fgk9sdmxcb6c6wz2/241/241_public_transit_in_apple_maps.pdf 28 | http://devstreaming.apple.com/videos/wwdc/2016/211m4cro5y3rrsfzfdj/211/211_quick_interaction_techniques_for_watchos.pdf 29 | http://devstreaming.apple.com/videos/wwdc/2016/202w2zhc4l8yomptqnt/202/202_whats_new_in_accessibility.pdf 30 | http://devstreaming.apple.com/videos/wwdc/2016/236dnxhy85jkit108dh/236/236_whats_new_in_auto_layout.pdf 31 | http://devstreaming.apple.com/videos/wwdc/2016/203x2w42att1kdzg1ce/203/203_whats_new_in_cocoa.pdf 32 | http://devstreaming.apple.com/videos/wwdc/2016/205n2okotvilcayc8rc/205/205_whats_new_in_cocoa_touch.pdf 33 | http://devstreaming.apple.com/videos/wwdc/2016/242vdhuk4hmwrxnb465/242/242_whats_new_in_core_data.pdf 34 | http://devstreaming.apple.com/videos/wwdc/2016/207i37356qcyyh2yxos/207/207_whats_new_in_foundation_for_swift.pdf 35 | http://devstreaming.apple.com/videos/wwdc/2016/232biqdny8x84wjag07/232/232_whats_new_in_international_user_interfaces.pdf 36 | http://devstreaming.apple.com/videos/wwdc/2016/234dvn2mhmc3klk7vy4/234/234_whats_new_in_researchkit.pdf 37 | http://devstreaming.apple.com/videos/wwdc/2016/219g66mxt0n74iogsgp/219/219_whats_new_in_uicollectionview_in_ios_10.pdf 38 | http://devstreaming.apple.com/videos/wwdc/2016/206a38wgme6uponcuwd/206/206_whats_new_in_tvos.pdf 39 | http://devstreaming.apple.com/videos/wwdc/2016/208j30f4v1a1i9i5fg9/208/208_whats_new_in_watchos_3.pdf 40 | http://devstreaming.apple.com/videos/wwdc/2016/226aey4ryxex6rvqvn1/226/226_whats_new_with_cloudkit.pdf 41 | http://devstreaming.apple.com/videos/wwdc/2016/204t23fvanrkj7a1oj7/204/204_imessage_apps_and_stickers_part_1.pdf 42 | http://devstreaming.apple.com/videos/wwdc/2016/224g9mui5qb06o6ukpf/224/224_imessage_apps_and_stickers_part_2.pdf 43 | http://devstreaming.apple.com/videos/wwdc/2016/804zpr8et6qv87n8j1z/804/804_designing_great_apple_watch_experiences.pdf 44 | http://devstreaming.apple.com/videos/wwdc/2016/802z6j79sd7g5drr7k7/802/802_designing_for_tvos.pdf 45 | http://devstreaming.apple.com/videos/wwdc/2016/801y753jw8vxmjblocq/801/801_inclusive_app_design.pdf 46 | http://devstreaming.apple.com/videos/wwdc/2016/805zlxpfexwwzt7x0cr/805/805_iterative_ui_design.pdf 47 | http://devstreaming.apple.com/videos/wwdc/2016/803z7m1ln9vmbpg35x9/803/803_typography_and_fonts.pdf 48 | http://devstreaming.apple.com/videos/wwdc/2016/409jh83sf1h8dqrt00q/409/409_advanced_testing_and_continuous_integration.pdf 49 | http://devstreaming.apple.com/videos/wwdc/2016/407itxn2ujs52fwcgw5/407/407_auditing_your_apps_for_accessibility.pdf 50 | http://devstreaming.apple.com/videos/wwdc/2016/417kbvnnlivhyfnn98p/417/417_debugging_tips_and_tricks.pdf 51 | http://devstreaming.apple.com/videos/wwdc/2016/404hskg1ijeev16mdej/404/404_getting_started_with_swift.pdf 52 | http://devstreaming.apple.com/videos/wwdc/2016/415kvwo632dbu5csn3g/415/415_going_serverside_with_swift_open_source.pdf 53 | http://devstreaming.apple.com/videos/wwdc/2016/408j7syjtdlxnl2rq4j/408/408_introducing_swift_playgrounds.pdf 54 | http://devstreaming.apple.com/videos/wwdc/2016/413jz6eb2wkfuzwx1me/413/413_introduction_to_xcode.pdf 55 | http://devstreaming.apple.com/videos/wwdc/2016/406i3zbazbegkeh0udt/406/406_optimizing_app_startup_time.pdf 56 | http://devstreaming.apple.com/videos/wwdc/2016/420lbx5afix4io0xo9p/420/420_optimizing_web_content_in_your_app.pdf 57 | http://devstreaming.apple.com/videos/wwdc/2016/419lgbsyhjrmqtmq0qh/419/419_protocol_and_value_oriented_programming_in_uikit_apps.pdf 58 | http://devstreaming.apple.com/videos/wwdc/2016/403hb0ie2m86hvs7yyn/403/403_swift_api_design_guidelines.pdf 59 | http://devstreaming.apple.com/videos/wwdc/2016/411jge60tmuuh7dolja/411/411_system_trace_in_depth.pdf 60 | http://devstreaming.apple.com/videos/wwdc/2016/412jzguxz4h8hykgjlm/412/412_thread_sanitizer_and_static_analysis.pdf 61 | http://devstreaming.apple.com/videos/wwdc/2016/416k7f0xkmz28rvlvwb/416/416_understanding_swift_performance.pdf 62 | http://devstreaming.apple.com/videos/wwdc/2016/418kmcxcwg4psxzsjuy/418/418_using_time_profiler_in_instruments.pdf 63 | http://devstreaming.apple.com/videos/wwdc/2016/414k6h6qdzyihpowpaa/414/414_using_and_extending_the_xcode_source_editor.pdf 64 | http://devstreaming.apple.com/videos/wwdc/2016/410jaf5ko3ob8asajlf/410/410_visual_debugging_with_xcode.pdf 65 | http://devstreaming.apple.com/videos/wwdc/2016/405i2ilotov3bazyei1/405/405_whats_new_in_llvm.pdf 66 | http://devstreaming.apple.com/videos/wwdc/2016/402h429l9d0hy98c9m6/402/402_whats_new_in_swift.pdf 67 | http://devstreaming.apple.com/videos/wwdc/2016/401hmew12wifry4svvi/401/401_whats_new_in_xcode_app_signing.pdf 68 | http://devstreaming.apple.com/videos/wwdc/2016/304heg1mrvxxz5lhd4h/304/304_best_practices_for_building_apps_used_in_business_and_education.pdf 69 | http://devstreaming.apple.com/videos/wwdc/2016/301fbtjd9exjetky78s/301/301_introducing_expanded_subscriptions_in_itunes_connect.pdf 70 | http://devstreaming.apple.com/videos/wwdc/2016/302f5hkfjyg13j84oda/302/302_introducing_search_ads.pdf 71 | http://devstreaming.apple.com/videos/wwdc/2016/303g7ecrjttz4lpqd7y/303/303_whats_new_in_apple_device_management.pdf 72 | http://devstreaming.apple.com/videos/wwdc/2016/305h9fsce1kcqkvmtvk/305/305_whats_new_in_itunes_connect.pdf 73 | http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/102_platforms_state_of_the_union.pdf 74 | http://devstreaming.apple.com/videos/wwdc/2016/602o05a86ysk0ngvlgj/602/602_adopting_metal_part_1.pdf 75 | http://devstreaming.apple.com/videos/wwdc/2016/603oba298b1v4z54011/603/603_adopting_metal_part_2.pdf 76 | http://devstreaming.apple.com/videos/wwdc/2016/606oluchfgwakjbymy8/606/606_advanced_metal_shader_optimization.pdf 77 | http://devstreaming.apple.com/videos/wwdc/2016/609pxdzx9vsps1l0qdh/609/609_advances_in_scenekit_rendering.pdf 78 | http://devstreaming.apple.com/videos/wwdc/2016/607odzb3n443nv9ei5p/607/607_controlling_game_input_for_apple_tv.pdf 79 | http://devstreaming.apple.com/videos/wwdc/2016/612qhqi7kh3399jwhy7/612/612_game_technologies_for_apple_watch.pdf 80 | http://devstreaming.apple.com/videos/wwdc/2016/601nsio90cd7ylwimk9/601/601_go_live_with_replaykit.pdf 81 | http://devstreaming.apple.com/videos/wwdc/2016/611qdyg26bqfivpaww1/611/611_whats_new_in_game_center.pdf 82 | http://devstreaming.apple.com/videos/wwdc/2016/608p3mqohp4bat0id7s/608/608_whats_new_in_gameplaykit.pdf 83 | http://devstreaming.apple.com/videos/wwdc/2016/604oezpg3wmqrkxl0t7/604/604_whats_new_in_metal_part_1.pdf 84 | http://devstreaming.apple.com/videos/wwdc/2016/605ooaey8tbzegv8fth/605/605_whats_new_in_metal_part_2.pdf 85 | http://devstreaming.apple.com/videos/wwdc/2016/610p9xtklo7t2au11md/610/610_whats_new_in_spritekit.pdf 86 | http://devstreaming.apple.com/videos/wwdc/2016/511nqyciexman7sf932/511/511_avcapturephotooutput__beyond_the_basics.pdf 87 | http://devstreaming.apple.com/videos/wwdc/2016/506ms2tv71tcduwp3dm/506/506_avkit_on_tvos.pdf 88 | http://devstreaming.apple.com/videos/wwdc/2016/503lkp4vimgv7tqecn7/503/503_advances_in_avfoundation_playback.pdf 89 | http://devstreaming.apple.com/videos/wwdc/2016/501l32ujtbnw2ad06wy/501/501_advances_in_ios_photography.pdf 90 | http://devstreaming.apple.com/videos/wwdc/2016/507n0zrhzxdzmg20zcl/507/507_delivering_an_exceptional_audio_experience.pdf 91 | http://devstreaming.apple.com/videos/wwdc/2016/502lezynlddsti4drbq/502/502_getting_published_in_apple_news.pdf 92 | http://devstreaming.apple.com/videos/wwdc/2016/505mia12r7dwmk3aumw/505/505_live_photo_editing_and_raw_processing_with_core_image.pdf 93 | http://devstreaming.apple.com/videos/wwdc/2016/509n1cnykqms19r9jyp/509/509_speech_recognition_api.pdf 94 | http://devstreaming.apple.com/videos/wwdc/2016/508nbofuzf16hljuwqe/508/508_using_apple_news_format_to_create_rich_and_responsive_stories.pdf 95 | http://devstreaming.apple.com/videos/wwdc/2016/510ndmh9wkcvzneegv2/510/510_validating_http_live_streams.pdf 96 | http://devstreaming.apple.com/videos/wwdc/2016/504m956dgg4hlw2uez9/504/504_whats_new_in_http_live_streaming.pdf 97 | http://devstreaming.apple.com/videos/wwdc/2016/708tbh8wnspsg01hxwx/708/708_advanced_notifications.pdf 98 | http://devstreaming.apple.com/videos/wwdc/2016/703rx8zlfedjfom6l93/703/703_apple_pay_on_the_web.pdf 99 | http://devstreaming.apple.com/videos/wwdc/2016/717vo8hqv28kwa9wngg/717/717_beyond_dictation__enhanced_voicecontrol_for_macos_apps.pdf 100 | http://devstreaming.apple.com/videos/wwdc/2016/720w6g8t9zhd23va0ai/720/720_concurrent_programming_with_gcd_in_swift_3.pdf 101 | http://devstreaming.apple.com/videos/wwdc/2016/716vyncka4gcaxxwuvq/716/716_core_location_best_practices.pdf 102 | http://devstreaming.apple.com/videos/wwdc/2016/725xk1hwmcfqkiv0jfh/725/725_deploying_airprint_in_enterprise.pdf 103 | http://devstreaming.apple.com/videos/wwdc/2016/722x2eefo3u2rp8k8qs/722/722_developing_carplay_systems_part_1.pdf 104 | http://devstreaming.apple.com/videos/wwdc/2016/723x16j75lwkg414uxk/723/723_developing_carplay_systems_part_2.pdf 105 | http://devstreaming.apple.com/videos/wwdc/2016/709tvxadw201avg5v7n/709/709_engineering_privacy_for_your_users.pdf 106 | http://devstreaming.apple.com/videos/wwdc/2016/713uqrvfj3uo0xewc37/713/713_health_and_fitness_with_core_motion.pdf 107 | http://devstreaming.apple.com/videos/wwdc/2016/705s57mrvm8so193i8c/705/705_how_ios_security_really_works.pdf 108 | http://devstreaming.apple.com/videos/wwdc/2016/701q0pnn0ietcautcrv/701/701_introducing_apple_file_system.pdf 109 | http://devstreaming.apple.com/videos/wwdc/2016/707s77u9e6pv0dy9ggm/707/707_introduction_to_notifications.pdf 110 | http://devstreaming.apple.com/videos/wwdc/2016/711tlraheg74mofg3uq/711/711_nsurlsession_new_features_and_best_practices.pdf 111 | http://devstreaming.apple.com/videos/wwdc/2016/714urluxe140lardrb7/714/714_networking_for_the_modern_internet.pdf 112 | http://devstreaming.apple.com/videos/wwdc/2016/715v2nxofqo5an4q79a/715/715_neural_networks_and_accelerate.pdf 113 | http://devstreaming.apple.com/videos/wwdc/2016/719wve0t1j24kny0f9r/719/719_optimizing_io_for_performance_and_battery_life.pdf 114 | http://devstreaming.apple.com/videos/wwdc/2016/721wh2etddp4ghxhpcg/721/721_unified_logging_and_activity_tracing.pdf 115 | http://devstreaming.apple.com/videos/wwdc/2016/702rhpkb0ux7uuzixps/702/702_using_store_kit_for_inapp_purchases_with_swift_3.pdf 116 | http://devstreaming.apple.com/videos/wwdc/2016/710tkhyprou9hhbnc6g/710/710_whats_new_in_homekit.pdf 117 | http://devstreaming.apple.com/videos/wwdc/2016/706sgjvzkvg6rrg9icw/706/706_whats_new_in_security.pdf 118 | http://devstreaming.apple.com/videos/wwdc/2016/724x4wbpmrtkjpgfdlj/724/724_whats_new_in_the_apple_push_notification_service.pdf 119 | http://devstreaming.apple.com/videos/wwdc/2016/704s1a6rjyi2dqhhyi7/704/704_whats_new_with_wallet_and_apple_pay.pdf 120 | http://devstreaming.apple.com/videos/wwdc/2016/712ugi7vg8jznn3pc3u/712/712_working_with_wide_color.pdf 121 | -------------------------------------------------------------------------------- /wwdc_sessions/wwdc2016videos_links.txt: -------------------------------------------------------------------------------- 1 | http://devstreaming.apple.com/videos/wwdc/2016/228a1kbxogojm4fviqc/228/228_hd_a_peek_at_3d_touch.mp4?dl=1 2 | http://devstreaming.apple.com/videos/wwdc/2016/228a1kbxogojm4fviqc/228/228_sd_a_peek_at_3d_touch.mp4?dl=1 3 | http://devstreaming.apple.com/videos/wwdc/2016/216v55u6zpxizxkml6k/216/216_hd_advances_in_uikit_animations_and_transitions.mp4?dl=1 4 | http://devstreaming.apple.com/videos/wwdc/2016/216v55u6zpxizxkml6k/216/216_sd_advances_in_uikit_animations_and_transitions.mp4?dl=1 5 | http://devstreaming.apple.com/videos/wwdc/2016/227a480gfx4hwinv5x9/227/227_hd_architecting_for_performance_on_watchos_3.mp4?dl=1 6 | http://devstreaming.apple.com/videos/wwdc/2016/227a480gfx4hwinv5x9/227/227_sd_architecting_for_performance_on_watchos_3.mp4?dl=1 7 | http://devstreaming.apple.com/videos/wwdc/2016/235dk9q4a4mflq2dbms/235/235_hd_building_great_workout_apps.mp4?dl=1 8 | http://devstreaming.apple.com/videos/wwdc/2016/235dk9q4a4mflq2dbms/235/235_sd_building_great_workout_apps.mp4?dl=1 9 | http://devstreaming.apple.com/videos/wwdc/2016/231bhrh1z1fzrejhbz7/231/231_hd_cloudkit_best_practices.mp4?dl=1 10 | http://devstreaming.apple.com/videos/wwdc/2016/231bhrh1z1fzrejhbz7/231/231_sd_cloudkit_best_practices.mp4?dl=1 11 | http://devstreaming.apple.com/videos/wwdc/2016/239ebj00keggvd2m2fx/239/239_hd_crafting_modern_cocoa_apps.mp4?dl=1 12 | http://devstreaming.apple.com/videos/wwdc/2016/239ebj00keggvd2m2fx/239/239_sd_crafting_modern_cocoa_apps.mp4?dl=1 13 | http://devstreaming.apple.com/videos/wwdc/2016/212s41rh77qgdg26s86/212/212_hd_developing_tvos_apps_using_tvmlkit_part_1.mp4?dl=1 14 | http://devstreaming.apple.com/videos/wwdc/2016/212s41rh77qgdg26s86/212/212_sd_developing_tvos_apps_using_tvmlkit_part_1.mp4?dl=1 15 | http://devstreaming.apple.com/videos/wwdc/2016/229b09xkrv3t6tdzwsu/229/229_hd_developing_tvos_apps_using_tvmlkit_part_2.mp4?dl=1 16 | http://devstreaming.apple.com/videos/wwdc/2016/229b09xkrv3t6tdzwsu/229/229_sd_developing_tvos_apps_using_tvmlkit_part_2.mp4?dl=1 17 | http://devstreaming.apple.com/videos/wwdc/2016/230b83wfxc7m69dm90q/230/230_hd_enhancing_voip_apps_with_callkit.mp4?dl=1 18 | http://devstreaming.apple.com/videos/wwdc/2016/230b83wfxc7m69dm90q/230/230_sd_enhancing_voip_apps_with_callkit.mp4?dl=1 19 | http://devstreaming.apple.com/videos/wwdc/2016/225e97ww3majsu3bvt8/225/225_hd_extending_your_apps_with_sirikit.mp4?dl=1 20 | http://devstreaming.apple.com/videos/wwdc/2016/225e97ww3majsu3bvt8/225/225_sd_extending_your_apps_with_sirikit.mp4?dl=1 21 | http://devstreaming.apple.com/videos/wwdc/2016/214b51jlndqja1bpptt/214/214_hd_extending_your_app_with_safari_app_extensions.mp4?dl=1 22 | http://devstreaming.apple.com/videos/wwdc/2016/214b51jlndqja1bpptt/214/214_sd_extending_your_app_with_safari_app_extensions.mp4?dl=1 23 | http://devstreaming.apple.com/videos/wwdc/2016/215e597a1en6wrh89hm/215/215_hd_focus_interaction_on_tvos.mp4?dl=1 24 | http://devstreaming.apple.com/videos/wwdc/2016/215e597a1en6wrh89hm/215/215_sd_focus_interaction_on_tvos.mp4?dl=1 25 | http://devstreaming.apple.com/videos/wwdc/2016/237e12rha4rg2t0p53u/237/237_hd_getting_started_with_carekit.mp4?dl=1 26 | http://devstreaming.apple.com/videos/wwdc/2016/237e12rha4rg2t0p53u/237/237_sd_getting_started_with_carekit.mp4?dl=1 27 | http://devstreaming.apple.com/videos/wwdc/2016/209e37d5ks3pfj21ij5/209/209_hd_getting_the_most_out_of_healthkit.mp4?dl=1 28 | http://devstreaming.apple.com/videos/wwdc/2016/209e37d5ks3pfj21ij5/209/209_sd_getting_the_most_out_of_healthkit.mp4?dl=1 29 | http://devstreaming.apple.com/videos/wwdc/2016/213r47rtymgcyythv7w/213/213_hd_improving_existing_apps_with_modern_best_practices.mp4?dl=1 30 | http://devstreaming.apple.com/videos/wwdc/2016/213r47rtymgcyythv7w/213/213_sd_improving_existing_apps_with_modern_best_practices.mp4?dl=1 31 | http://devstreaming.apple.com/videos/wwdc/2016/240f49ca5uvbzg5pwk5/240/240_hd_increase_usage_of_your_app_with_proactive_suggestions.mp4?dl=1 32 | http://devstreaming.apple.com/videos/wwdc/2016/240f49ca5uvbzg5pwk5/240/240_sd_increase_usage_of_your_app_with_proactive_suggestions.mp4?dl=1 33 | http://devstreaming.apple.com/videos/wwdc/2016/201h1g4asm31ti2l9n1/201/201_hd_internationalization_best_practices.mp4?dl=1 34 | http://devstreaming.apple.com/videos/wwdc/2016/201h1g4asm31ti2l9n1/201/201_sd_internationalization_best_practices.mp4?dl=1 35 | http://devstreaming.apple.com/videos/wwdc/2016/217x5143f51ztsxao1u/217/217_hd_introducing_sirikit.mp4?dl=1 36 | http://devstreaming.apple.com/videos/wwdc/2016/217x5143f51ztsxao1u/217/217_sd_introducing_sirikit.mp4?dl=1 37 | http://devstreaming.apple.com/videos/wwdc/2016/218e59uvbkp1smncrss/218/218_hd_keeping_your_watch_app_up_to_date.mp4?dl=1 38 | http://devstreaming.apple.com/videos/wwdc/2016/218e59uvbkp1smncrss/218/218_sd_keeping_your_watch_app_up_to_date.mp4?dl=1 39 | http://devstreaming.apple.com/videos/wwdc/2016/220c6lnr7wkcjewnj1g/220/220_hd_leveraging_touch_input_on_ios.mp4?dl=1 40 | http://devstreaming.apple.com/videos/wwdc/2016/220c6lnr7wkcjewnj1g/220/220_sd_leveraging_touch_input_on_ios.mp4?dl=1 41 | http://devstreaming.apple.com/videos/wwdc/2016/222l873ttj77llkzbzs/222/222_hd_making_apps_adaptive_part_1.mp4?dl=1 42 | http://devstreaming.apple.com/videos/wwdc/2016/222l873ttj77llkzbzs/222/222_sd_making_apps_adaptive_part_1.mp4?dl=1 43 | http://devstreaming.apple.com/videos/wwdc/2016/233c3uhytv8cxwoanja/233/233_hd_making_apps_adaptive_part_2.mp4?dl=1 44 | http://devstreaming.apple.com/videos/wwdc/2016/233c3uhytv8cxwoanja/233/233_sd_making_apps_adaptive_part_2.mp4?dl=1 45 | http://devstreaming.apple.com/videos/wwdc/2016/223j90dqr7q1xyld1mv/223/223_hd_making_the_most_of_search_apis.mp4?dl=1 46 | http://devstreaming.apple.com/videos/wwdc/2016/223j90dqr7q1xyld1mv/223/223_sd_making_the_most_of_search_apis.mp4?dl=1 47 | http://devstreaming.apple.com/videos/wwdc/2016/210e4481b1cnwor4n1q/210/210_hd_mastering_uikit_on_tvos.mp4?dl=1 48 | http://devstreaming.apple.com/videos/wwdc/2016/210e4481b1cnwor4n1q/210/210_sd_mastering_uikit_on_tvos.mp4?dl=1 49 | http://devstreaming.apple.com/videos/wwdc/2016/238eemv232k9lp2px30/238/238_hd_measurements_and_units.mp4?dl=1 50 | http://devstreaming.apple.com/videos/wwdc/2016/238eemv232k9lp2px30/238/238_sd_measurements_and_units.mp4?dl=1 51 | http://devstreaming.apple.com/videos/wwdc/2016/221l723gdmjyvv5pmw7/221/221_hd_optimizing_ondemand_resources.mp4?dl=1 52 | http://devstreaming.apple.com/videos/wwdc/2016/221l723gdmjyvv5pmw7/221/221_sd_optimizing_ondemand_resources.mp4?dl=1 53 | http://devstreaming.apple.com/videos/wwdc/2016/241fgk9sdmxcb6c6wz2/241/241_hd_public_transit_in_apple_maps.mp4?dl=1 54 | http://devstreaming.apple.com/videos/wwdc/2016/241fgk9sdmxcb6c6wz2/241/241_sd_public_transit_in_apple_maps.mp4?dl=1 55 | http://devstreaming.apple.com/videos/wwdc/2016/211m4cro5y3rrsfzfdj/211/211_hd_quick_interaction_techniques_for_watchos.mp4?dl=1 56 | http://devstreaming.apple.com/videos/wwdc/2016/211m4cro5y3rrsfzfdj/211/211_sd_quick_interaction_techniques_for_watchos.mp4?dl=1 57 | http://devstreaming.apple.com/videos/wwdc/2016/202w2zhc4l8yomptqnt/202/202_hd_whats_new_in_accessibility.mp4?dl=1 58 | http://devstreaming.apple.com/videos/wwdc/2016/202w2zhc4l8yomptqnt/202/202_sd_whats_new_in_accessibility.mp4?dl=1 59 | http://devstreaming.apple.com/videos/wwdc/2016/236dnxhy85jkit108dh/236/236_hd_whats_new_in_auto_layout.mp4?dl=1 60 | http://devstreaming.apple.com/videos/wwdc/2016/236dnxhy85jkit108dh/236/236_sd_whats_new_in_auto_layout.mp4?dl=1 61 | http://devstreaming.apple.com/videos/wwdc/2016/203x2w42att1kdzg1ce/203/203_hd_whats_new_in_cocoa.mp4?dl=1 62 | http://devstreaming.apple.com/videos/wwdc/2016/203x2w42att1kdzg1ce/203/203_sd_whats_new_in_cocoa.mp4?dl=1 63 | http://devstreaming.apple.com/videos/wwdc/2016/205n2okotvilcayc8rc/205/205_hd_whats_new_in_cocoa_touch.mp4?dl=1 64 | http://devstreaming.apple.com/videos/wwdc/2016/205n2okotvilcayc8rc/205/205_sd_whats_new_in_cocoa_touch.mp4?dl=1 65 | http://devstreaming.apple.com/videos/wwdc/2016/242vdhuk4hmwrxnb465/242/242_hd_whats_new_in_core_data.mp4?dl=1 66 | http://devstreaming.apple.com/videos/wwdc/2016/242vdhuk4hmwrxnb465/242/242_sd_whats_new_in_core_data.mp4?dl=1 67 | http://devstreaming.apple.com/videos/wwdc/2016/207i37356qcyyh2yxos/207/207_hd_whats_new_in_foundation_for_swift.mp4?dl=1 68 | http://devstreaming.apple.com/videos/wwdc/2016/207i37356qcyyh2yxos/207/207_sd_whats_new_in_foundation_for_swift.mp4?dl=1 69 | http://devstreaming.apple.com/videos/wwdc/2016/232biqdny8x84wjag07/232/232_hd_whats_new_in_international_user_interfaces.mp4?dl=1 70 | http://devstreaming.apple.com/videos/wwdc/2016/232biqdny8x84wjag07/232/232_sd_whats_new_in_international_user_interfaces.mp4?dl=1 71 | http://devstreaming.apple.com/videos/wwdc/2016/234dvn2mhmc3klk7vy4/234/234_hd_whats_new_in_researchkit.mp4?dl=1 72 | http://devstreaming.apple.com/videos/wwdc/2016/234dvn2mhmc3klk7vy4/234/234_sd_whats_new_in_researchkit.mp4?dl=1 73 | http://devstreaming.apple.com/videos/wwdc/2016/219g66mxt0n74iogsgp/219/219_hd_whats_new_in_uicollectionview_in_ios_10.mp4?dl=1 74 | http://devstreaming.apple.com/videos/wwdc/2016/219g66mxt0n74iogsgp/219/219_sd_whats_new_in_uicollectionview_in_ios_10.mp4?dl=1 75 | http://devstreaming.apple.com/videos/wwdc/2016/206a38wgme6uponcuwd/206/206_hd_whats_new_in_tvos.mp4?dl=1 76 | http://devstreaming.apple.com/videos/wwdc/2016/206a38wgme6uponcuwd/206/206_sd_whats_new_in_tvos.mp4?dl=1 77 | http://devstreaming.apple.com/videos/wwdc/2016/208j30f4v1a1i9i5fg9/208/208_hd_whats_new_in_watchos_3.mp4?dl=1 78 | http://devstreaming.apple.com/videos/wwdc/2016/208j30f4v1a1i9i5fg9/208/208_sd_whats_new_in_watchos_3.mp4?dl=1 79 | http://devstreaming.apple.com/videos/wwdc/2016/226aey4ryxex6rvqvn1/226/226_hd_whats_new_with_cloudkit.mp4?dl=1 80 | http://devstreaming.apple.com/videos/wwdc/2016/226aey4ryxex6rvqvn1/226/226_sd_whats_new_with_cloudkit.mp4?dl=1 81 | http://devstreaming.apple.com/videos/wwdc/2016/204t23fvanrkj7a1oj7/204/204_hd_imessage_apps_and_stickers_part_1.mp4?dl=1 82 | http://devstreaming.apple.com/videos/wwdc/2016/204t23fvanrkj7a1oj7/204/204_sd_imessage_apps_and_stickers_part_1.mp4?dl=1 83 | http://devstreaming.apple.com/videos/wwdc/2016/224g9mui5qb06o6ukpf/224/224_hd_imessage_apps_and_stickers_part_2.mp4?dl=1 84 | http://devstreaming.apple.com/videos/wwdc/2016/224g9mui5qb06o6ukpf/224/224_sd_imessage_apps_and_stickers_part_2.mp4?dl=1 85 | http://devstreaming.apple.com/videos/wwdc/2016/804zpr8et6qv87n8j1z/804/804_hd_designing_great_apple_watch_experiences.mp4?dl=1 86 | http://devstreaming.apple.com/videos/wwdc/2016/804zpr8et6qv87n8j1z/804/804_sd_designing_great_apple_watch_experiences.mp4?dl=1 87 | http://devstreaming.apple.com/videos/wwdc/2016/802z6j79sd7g5drr7k7/802/802_hd_designing_for_tvos.mp4?dl=1 88 | http://devstreaming.apple.com/videos/wwdc/2016/802z6j79sd7g5drr7k7/802/802_sd_designing_for_tvos.mp4?dl=1 89 | http://devstreaming.apple.com/videos/wwdc/2016/801y753jw8vxmjblocq/801/801_hd_inclusive_app_design.mp4?dl=1 90 | http://devstreaming.apple.com/videos/wwdc/2016/801y753jw8vxmjblocq/801/801_sd_inclusive_app_design.mp4?dl=1 91 | http://devstreaming.apple.com/videos/wwdc/2016/805zlxpfexwwzt7x0cr/805/805_hd_iterative_ui_design.mp4?dl=1 92 | http://devstreaming.apple.com/videos/wwdc/2016/805zlxpfexwwzt7x0cr/805/805_sd_iterative_ui_design.mp4?dl=1 93 | http://devstreaming.apple.com/videos/wwdc/2016/803z7m1ln9vmbpg35x9/803/803_hd_typography_and_fonts.mp4?dl=1 94 | http://devstreaming.apple.com/videos/wwdc/2016/803z7m1ln9vmbpg35x9/803/803_sd_typography_and_fonts.mp4?dl=1 95 | http://devstreaming.apple.com/videos/wwdc/2016/409jh83sf1h8dqrt00q/409/409_hd_advanced_testing_and_continuous_integration.mp4?dl=1 96 | http://devstreaming.apple.com/videos/wwdc/2016/409jh83sf1h8dqrt00q/409/409_sd_advanced_testing_and_continuous_integration.mp4?dl=1 97 | http://devstreaming.apple.com/videos/wwdc/2016/407itxn2ujs52fwcgw5/407/407_hd_auditing_your_apps_for_accessibility.mp4?dl=1 98 | http://devstreaming.apple.com/videos/wwdc/2016/407itxn2ujs52fwcgw5/407/407_sd_auditing_your_apps_for_accessibility.mp4?dl=1 99 | http://devstreaming.apple.com/videos/wwdc/2016/417kbvnnlivhyfnn98p/417/417_hd_debugging_tips_and_tricks.mp4?dl=1 100 | http://devstreaming.apple.com/videos/wwdc/2016/417kbvnnlivhyfnn98p/417/417_sd_debugging_tips_and_tricks.mp4?dl=1 101 | http://devstreaming.apple.com/videos/wwdc/2016/404hskg1ijeev16mdej/404/404_hd_getting_started_with_swift.mp4?dl=1 102 | http://devstreaming.apple.com/videos/wwdc/2016/404hskg1ijeev16mdej/404/404_sd_getting_started_with_swift.mp4?dl=1 103 | http://devstreaming.apple.com/videos/wwdc/2016/415kvwo632dbu5csn3g/415/415_hd_going_serverside_with_swift_open_source.mp4?dl=1 104 | http://devstreaming.apple.com/videos/wwdc/2016/415kvwo632dbu5csn3g/415/415_sd_going_serverside_with_swift_open_source.mp4?dl=1 105 | http://devstreaming.apple.com/videos/wwdc/2016/408j7syjtdlxnl2rq4j/408/408_hd_introducing_swift_playgrounds.mp4?dl=1 106 | http://devstreaming.apple.com/videos/wwdc/2016/408j7syjtdlxnl2rq4j/408/408_sd_introducing_swift_playgrounds.mp4?dl=1 107 | http://devstreaming.apple.com/videos/wwdc/2016/413jz6eb2wkfuzwx1me/413/413_hd_introduction_to_xcode.mp4?dl=1 108 | http://devstreaming.apple.com/videos/wwdc/2016/413jz6eb2wkfuzwx1me/413/413_sd_introduction_to_xcode.mp4?dl=1 109 | http://devstreaming.apple.com/videos/wwdc/2016/406i3zbazbegkeh0udt/406/406_hd_optimizing_app_startup_time.mp4?dl=1 110 | http://devstreaming.apple.com/videos/wwdc/2016/406i3zbazbegkeh0udt/406/406_sd_optimizing_app_startup_time.mp4?dl=1 111 | http://devstreaming.apple.com/videos/wwdc/2016/420lbx5afix4io0xo9p/420/420_hd_optimizing_web_content_in_your_app.mp4?dl=1 112 | http://devstreaming.apple.com/videos/wwdc/2016/420lbx5afix4io0xo9p/420/420_sd_optimizing_web_content_in_your_app.mp4?dl=1 113 | http://devstreaming.apple.com/videos/wwdc/2016/419lgbsyhjrmqtmq0qh/419/419_hd_protocol_and_value_oriented_programming_in_uikit_apps.mp4?dl=1 114 | http://devstreaming.apple.com/videos/wwdc/2016/419lgbsyhjrmqtmq0qh/419/419_sd_protocol_and_value_oriented_programming_in_uikit_apps.mp4?dl=1 115 | http://devstreaming.apple.com/videos/wwdc/2016/403hb0ie2m86hvs7yyn/403/403_hd_swift_api_design_guidelines.mp4?dl=1 116 | http://devstreaming.apple.com/videos/wwdc/2016/403hb0ie2m86hvs7yyn/403/403_sd_swift_api_design_guidelines.mp4?dl=1 117 | http://devstreaming.apple.com/videos/wwdc/2016/411jge60tmuuh7dolja/411/411_hd_system_trace_in_depth.mp4?dl=1 118 | http://devstreaming.apple.com/videos/wwdc/2016/411jge60tmuuh7dolja/411/411_sd_system_trace_in_depth.mp4?dl=1 119 | http://devstreaming.apple.com/videos/wwdc/2016/412jzguxz4h8hykgjlm/412/412_hd_thread_sanitizer_and_static_analysis.mp4?dl=1 120 | http://devstreaming.apple.com/videos/wwdc/2016/412jzguxz4h8hykgjlm/412/412_sd_thread_sanitizer_and_static_analysis.mp4?dl=1 121 | http://devstreaming.apple.com/videos/wwdc/2016/416k7f0xkmz28rvlvwb/416/416_hd_understanding_swift_performance.mp4?dl=1 122 | http://devstreaming.apple.com/videos/wwdc/2016/416k7f0xkmz28rvlvwb/416/416_sd_understanding_swift_performance.mp4?dl=1 123 | http://devstreaming.apple.com/videos/wwdc/2016/418kmcxcwg4psxzsjuy/418/418_hd_using_time_profiler_in_instruments.mp4?dl=1 124 | http://devstreaming.apple.com/videos/wwdc/2016/418kmcxcwg4psxzsjuy/418/418_sd_using_time_profiler_in_instruments.mp4?dl=1 125 | http://devstreaming.apple.com/videos/wwdc/2016/414k6h6qdzyihpowpaa/414/414_hd_using_and_extending_the_xcode_source_editor.mp4?dl=1 126 | http://devstreaming.apple.com/videos/wwdc/2016/414k6h6qdzyihpowpaa/414/414_sd_using_and_extending_the_xcode_source_editor.mp4?dl=1 127 | http://devstreaming.apple.com/videos/wwdc/2016/410jaf5ko3ob8asajlf/410/410_hd_visual_debugging_with_xcode.mp4?dl=1 128 | http://devstreaming.apple.com/videos/wwdc/2016/410jaf5ko3ob8asajlf/410/410_sd_visual_debugging_with_xcode.mp4?dl=1 129 | http://devstreaming.apple.com/videos/wwdc/2016/405i2ilotov3bazyei1/405/405_hd_whats_new_in_llvm.mp4?dl=1 130 | http://devstreaming.apple.com/videos/wwdc/2016/405i2ilotov3bazyei1/405/405_sd_whats_new_in_llvm.mp4?dl=1 131 | http://devstreaming.apple.com/videos/wwdc/2016/402h429l9d0hy98c9m6/402/402_hd_whats_new_in_swift.mp4?dl=1 132 | http://devstreaming.apple.com/videos/wwdc/2016/402h429l9d0hy98c9m6/402/402_sd_whats_new_in_swift.mp4?dl=1 133 | http://devstreaming.apple.com/videos/wwdc/2016/401hmew12wifry4svvi/401/401_hd_whats_new_in_xcode_app_signing.mp4?dl=1 134 | http://devstreaming.apple.com/videos/wwdc/2016/401hmew12wifry4svvi/401/401_sd_whats_new_in_xcode_app_signing.mp4?dl=1 135 | http://devstreaming.apple.com/videos/wwdc/2016/304heg1mrvxxz5lhd4h/304/304_hd_best_practices_for_building_apps_used_in_business_and_education.mp4?dl=1 136 | http://devstreaming.apple.com/videos/wwdc/2016/304heg1mrvxxz5lhd4h/304/304_sd_best_practices_for_building_apps_used_in_business_and_education.mp4?dl=1 137 | http://devstreaming.apple.com/videos/wwdc/2016/301fbtjd9exjetky78s/301/301_hd_introducing_expanded_subscriptions_in_itunes_connect.mp4?dl=1 138 | http://devstreaming.apple.com/videos/wwdc/2016/301fbtjd9exjetky78s/301/301_sd_introducing_expanded_subscriptions_in_itunes_connect.mp4?dl=1 139 | http://devstreaming.apple.com/videos/wwdc/2016/302f5hkfjyg13j84oda/302/302_hd_introducing_search_ads.mp4?dl=1 140 | http://devstreaming.apple.com/videos/wwdc/2016/302f5hkfjyg13j84oda/302/302_sd_introducing_search_ads.mp4?dl=1 141 | http://devstreaming.apple.com/videos/wwdc/2016/303g7ecrjttz4lpqd7y/303/303_hd_whats_new_in_apple_device_management.mp4?dl=1 142 | http://devstreaming.apple.com/videos/wwdc/2016/303g7ecrjttz4lpqd7y/303/303_sd_whats_new_in_apple_device_management.mp4?dl=1 143 | http://devstreaming.apple.com/videos/wwdc/2016/305h9fsce1kcqkvmtvk/305/305_hd_whats_new_in_itunes_connect.mp4?dl=1 144 | http://devstreaming.apple.com/videos/wwdc/2016/305h9fsce1kcqkvmtvk/305/305_sd_whats_new_in_itunes_connect.mp4?dl=1 145 | http://devstreaming.apple.com/videos/wwdc/2016/103m0752oxdkymyk6gy/103/103_hd_apple_design_awards.mp4?dl=1 146 | http://devstreaming.apple.com/videos/wwdc/2016/103m0752oxdkymyk6gy/103/103_sd_apple_design_awards.mp4?dl=1 147 | http://devstreaming.apple.com/videos/wwdc/2016/104b1061nbty638w2cd/104/104_hd_disability_and_innovation_the_universal_benefits_of_accessible_design.mp4?dl=1 148 | http://devstreaming.apple.com/videos/wwdc/2016/104b1061nbty638w2cd/104/104_sd_disability_and_innovation_the_universal_benefits_of_accessible_design.mp4?dl=1 149 | http://devstreaming.apple.com/videos/wwdc/2016/101g0jrsvv5qcoduisk/101/101_hd_keynote.mp4?dl=1 150 | http://devstreaming.apple.com/videos/wwdc/2016/101g0jrsvv5qcoduisk/101/101_sd_keynote.mp4?dl=1 151 | http://devstreaming.apple.com/videos/wwdc/2016/108h16qehvq9hdjuf96/108/108_hd_marvel_making_a_difference_in_the_real_world.mp4?dl=1 152 | http://devstreaming.apple.com/videos/wwdc/2016/108h16qehvq9hdjuf96/108/108_sd_marvel_making_a_difference_in_the_real_world.mp4?dl=1 153 | http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/102_hd_platforms_state_of_the_union.mp4?dl=1 154 | http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/102_sd_platforms_state_of_the_union.mp4?dl=1 155 | http://devstreaming.apple.com/videos/wwdc/2016/106r1nsdtsnrih7t6id/106/106_hd_talking_in_pictures_reconstructing_the_building_blocks_of_language.mp4?dl=1 156 | http://devstreaming.apple.com/videos/wwdc/2016/106r1nsdtsnrih7t6id/106/106_sd_talking_in_pictures_reconstructing_the_building_blocks_of_language.mp4?dl=1 157 | http://devstreaming.apple.com/videos/wwdc/2016/105o1y9n857rpjpmu27/105/105_hd_tapping_into_innovative_solutions_to_save_the_worlds_wildlife.mp4?dl=1 158 | http://devstreaming.apple.com/videos/wwdc/2016/105o1y9n857rpjpmu27/105/105_sd_tapping_into_innovative_solutions_to_save_the_worlds_wildlife.mp4?dl=1 159 | http://devstreaming.apple.com/videos/wwdc/2016/602o05a86ysk0ngvlgj/602/602_hd_adopting_metal_part_1.mp4?dl=1 160 | http://devstreaming.apple.com/videos/wwdc/2016/602o05a86ysk0ngvlgj/602/602_sd_adopting_metal_part_1.mp4?dl=1 161 | http://devstreaming.apple.com/videos/wwdc/2016/603oba298b1v4z54011/603/603_hd_adopting_metal_part_2.mp4?dl=1 162 | http://devstreaming.apple.com/videos/wwdc/2016/603oba298b1v4z54011/603/603_sd_adopting_metal_part_2.mp4?dl=1 163 | http://devstreaming.apple.com/videos/wwdc/2016/606oluchfgwakjbymy8/606/606_hd_advanced_metal_shader_optimization.mp4?dl=1 164 | http://devstreaming.apple.com/videos/wwdc/2016/606oluchfgwakjbymy8/606/606_sd_advanced_metal_shader_optimization.mp4?dl=1 165 | http://devstreaming.apple.com/videos/wwdc/2016/609pxdzx9vsps1l0qdh/609/609_hd_advances_in_scenekit_rendering.mp4?dl=1 166 | http://devstreaming.apple.com/videos/wwdc/2016/609pxdzx9vsps1l0qdh/609/609_sd_advances_in_scenekit_rendering.mp4?dl=1 167 | http://devstreaming.apple.com/videos/wwdc/2016/607odzb3n443nv9ei5p/607/607_hd_controlling_game_input_for_apple_tv.mp4?dl=1 168 | http://devstreaming.apple.com/videos/wwdc/2016/607odzb3n443nv9ei5p/607/607_sd_controlling_game_input_for_apple_tv.mp4?dl=1 169 | http://devstreaming.apple.com/videos/wwdc/2016/612qhqi7kh3399jwhy7/612/612_hd_game_technologies_for_apple_watch.mp4?dl=1 170 | http://devstreaming.apple.com/videos/wwdc/2016/612qhqi7kh3399jwhy7/612/612_sd_game_technologies_for_apple_watch.mp4?dl=1 171 | http://devstreaming.apple.com/videos/wwdc/2016/601nsio90cd7ylwimk9/601/601_hd_go_live_with_replaykit.mp4?dl=1 172 | http://devstreaming.apple.com/videos/wwdc/2016/601nsio90cd7ylwimk9/601/601_sd_go_live_with_replaykit.mp4?dl=1 173 | http://devstreaming.apple.com/videos/wwdc/2016/611qdyg26bqfivpaww1/611/611_hd_whats_new_in_game_center.mp4?dl=1 174 | http://devstreaming.apple.com/videos/wwdc/2016/611qdyg26bqfivpaww1/611/611_sd_whats_new_in_game_center.mp4?dl=1 175 | http://devstreaming.apple.com/videos/wwdc/2016/608p3mqohp4bat0id7s/608/608_hd_whats_new_in_gameplaykit.mp4?dl=1 176 | http://devstreaming.apple.com/videos/wwdc/2016/608p3mqohp4bat0id7s/608/608_sd_whats_new_in_gameplaykit.mp4?dl=1 177 | http://devstreaming.apple.com/videos/wwdc/2016/604oezpg3wmqrkxl0t7/604/604_hd_whats_new_in_metal_part_1.mp4?dl=1 178 | http://devstreaming.apple.com/videos/wwdc/2016/604oezpg3wmqrkxl0t7/604/604_sd_whats_new_in_metal_part_1.mp4?dl=1 179 | http://devstreaming.apple.com/videos/wwdc/2016/605ooaey8tbzegv8fth/605/605_hd_whats_new_in_metal_part_2.mp4?dl=1 180 | http://devstreaming.apple.com/videos/wwdc/2016/605ooaey8tbzegv8fth/605/605_sd_whats_new_in_metal_part_2.mp4?dl=1 181 | http://devstreaming.apple.com/videos/wwdc/2016/610p9xtklo7t2au11md/610/610_hd_whats_new_in_spritekit.mp4?dl=1 182 | http://devstreaming.apple.com/videos/wwdc/2016/610p9xtklo7t2au11md/610/610_sd_whats_new_in_spritekit.mp4?dl=1 183 | http://devstreaming.apple.com/videos/wwdc/2016/511nqyciexman7sf932/511/511_hd_avcapturephotooutput__beyond_the_basics.mp4?dl=1 184 | http://devstreaming.apple.com/videos/wwdc/2016/511nqyciexman7sf932/511/511_sd_avcapturephotooutput__beyond_the_basics.mp4?dl=1 185 | http://devstreaming.apple.com/videos/wwdc/2016/506ms2tv71tcduwp3dm/506/506_hd_avkit_on_tvos.mp4?dl=1 186 | http://devstreaming.apple.com/videos/wwdc/2016/506ms2tv71tcduwp3dm/506/506_sd_avkit_on_tvos.mp4?dl=1 187 | http://devstreaming.apple.com/videos/wwdc/2016/503lkp4vimgv7tqecn7/503/503_hd_advances_in_avfoundation_playback.mp4?dl=1 188 | http://devstreaming.apple.com/videos/wwdc/2016/503lkp4vimgv7tqecn7/503/503_sd_advances_in_avfoundation_playback.mp4?dl=1 189 | http://devstreaming.apple.com/videos/wwdc/2016/501l32ujtbnw2ad06wy/501/501_hd_advances_in_ios_photography.mp4?dl=1 190 | http://devstreaming.apple.com/videos/wwdc/2016/501l32ujtbnw2ad06wy/501/501_sd_advances_in_ios_photography.mp4?dl=1 191 | http://devstreaming.apple.com/videos/wwdc/2016/507n0zrhzxdzmg20zcl/507/507_hd_delivering_an_exceptional_audio_experience.mp4?dl=1 192 | http://devstreaming.apple.com/videos/wwdc/2016/507n0zrhzxdzmg20zcl/507/507_sd_delivering_an_exceptional_audio_experience.mp4?dl=1 193 | http://devstreaming.apple.com/videos/wwdc/2016/502lezynlddsti4drbq/502/502_hd_getting_published_in_apple_news.mp4?dl=1 194 | http://devstreaming.apple.com/videos/wwdc/2016/502lezynlddsti4drbq/502/502_sd_getting_published_in_apple_news.mp4?dl=1 195 | http://devstreaming.apple.com/videos/wwdc/2016/505mia12r7dwmk3aumw/505/505_hd_live_photo_editing_and_raw_processing_with_core_image.mp4?dl=1 196 | http://devstreaming.apple.com/videos/wwdc/2016/505mia12r7dwmk3aumw/505/505_sd_live_photo_editing_and_raw_processing_with_core_image.mp4?dl=1 197 | http://devstreaming.apple.com/videos/wwdc/2016/509n1cnykqms19r9jyp/509/509_hd_speech_recognition_api.mp4?dl=1 198 | http://devstreaming.apple.com/videos/wwdc/2016/509n1cnykqms19r9jyp/509/509_sd_speech_recognition_api.mp4?dl=1 199 | http://devstreaming.apple.com/videos/wwdc/2016/508nbofuzf16hljuwqe/508/508_hd_using_apple_news_format_to_create_rich_and_responsive_stories.mp4?dl=1 200 | http://devstreaming.apple.com/videos/wwdc/2016/508nbofuzf16hljuwqe/508/508_sd_using_apple_news_format_to_create_rich_and_responsive_stories.mp4?dl=1 201 | http://devstreaming.apple.com/videos/wwdc/2016/510ndmh9wkcvzneegv2/510/510_hd_validating_http_live_streams.mp4?dl=1 202 | http://devstreaming.apple.com/videos/wwdc/2016/510ndmh9wkcvzneegv2/510/510_sd_validating_http_live_streams.mp4?dl=1 203 | http://devstreaming.apple.com/videos/wwdc/2016/504m956dgg4hlw2uez9/504/504_hd_whats_new_in_http_live_streaming.mp4?dl=1 204 | http://devstreaming.apple.com/videos/wwdc/2016/504m956dgg4hlw2uez9/504/504_sd_whats_new_in_http_live_streaming.mp4?dl=1 205 | http://devstreaming.apple.com/videos/wwdc/2016/708tbh8wnspsg01hxwx/708/708_hd_advanced_notifications.mp4?dl=1 206 | http://devstreaming.apple.com/videos/wwdc/2016/708tbh8wnspsg01hxwx/708/708_sd_advanced_notifications.mp4?dl=1 207 | http://devstreaming.apple.com/videos/wwdc/2016/703rx8zlfedjfom6l93/703/703_hd_apple_pay_on_the_web.mp4?dl=1 208 | http://devstreaming.apple.com/videos/wwdc/2016/703rx8zlfedjfom6l93/703/703_sd_apple_pay_on_the_web.mp4?dl=1 209 | http://devstreaming.apple.com/videos/wwdc/2016/717vo8hqv28kwa9wngg/717/717_hd_beyond_dictation__enhanced_voicecontrol_for_macos_apps.mp4?dl=1 210 | http://devstreaming.apple.com/videos/wwdc/2016/717vo8hqv28kwa9wngg/717/717_sd_beyond_dictation__enhanced_voicecontrol_for_macos_apps.mp4?dl=1 211 | http://devstreaming.apple.com/videos/wwdc/2016/720w6g8t9zhd23va0ai/720/720_hd_concurrent_programming_with_gcd_in_swift_3.mp4?dl=1 212 | http://devstreaming.apple.com/videos/wwdc/2016/720w6g8t9zhd23va0ai/720/720_sd_concurrent_programming_with_gcd_in_swift_3.mp4?dl=1 213 | http://devstreaming.apple.com/videos/wwdc/2016/716vyncka4gcaxxwuvq/716/716_hd_core_location_best_practices.mp4?dl=1 214 | http://devstreaming.apple.com/videos/wwdc/2016/716vyncka4gcaxxwuvq/716/716_sd_core_location_best_practices.mp4?dl=1 215 | http://devstreaming.apple.com/videos/wwdc/2016/725xk1hwmcfqkiv0jfh/725/725_hd_deploying_airprint_in_enterprise.mp4?dl=1 216 | http://devstreaming.apple.com/videos/wwdc/2016/725xk1hwmcfqkiv0jfh/725/725_sd_deploying_airprint_in_enterprise.mp4?dl=1 217 | http://devstreaming.apple.com/videos/wwdc/2016/722x2eefo3u2rp8k8qs/722/722_hd_developing_carplay_systems_part_1.mp4?dl=1 218 | http://devstreaming.apple.com/videos/wwdc/2016/722x2eefo3u2rp8k8qs/722/722_sd_developing_carplay_systems_part_1.mp4?dl=1 219 | http://devstreaming.apple.com/videos/wwdc/2016/723x16j75lwkg414uxk/723/723_hd_developing_carplay_systems_part_2.mp4?dl=1 220 | http://devstreaming.apple.com/videos/wwdc/2016/723x16j75lwkg414uxk/723/723_sd_developing_carplay_systems_part_2.mp4?dl=1 221 | http://devstreaming.apple.com/videos/wwdc/2016/709tvxadw201avg5v7n/709/709_hd_engineering_privacy_for_your_users.mp4?dl=1 222 | http://devstreaming.apple.com/videos/wwdc/2016/709tvxadw201avg5v7n/709/709_sd_engineering_privacy_for_your_users.mp4?dl=1 223 | http://devstreaming.apple.com/videos/wwdc/2016/713uqrvfj3uo0xewc37/713/713_hd_health_and_fitness_with_core_motion.mp4?dl=1 224 | http://devstreaming.apple.com/videos/wwdc/2016/713uqrvfj3uo0xewc37/713/713_sd_health_and_fitness_with_core_motion.mp4?dl=1 225 | http://devstreaming.apple.com/videos/wwdc/2016/705s57mrvm8so193i8c/705/705_hd_how_ios_security_really_works.mp4?dl=1 226 | http://devstreaming.apple.com/videos/wwdc/2016/705s57mrvm8so193i8c/705/705_sd_how_ios_security_really_works.mp4?dl=1 227 | http://devstreaming.apple.com/videos/wwdc/2016/701q0pnn0ietcautcrv/701/701_hd_introducing_apple_file_system.mp4?dl=1 228 | http://devstreaming.apple.com/videos/wwdc/2016/701q0pnn0ietcautcrv/701/701_sd_introducing_apple_file_system.mp4?dl=1 229 | http://devstreaming.apple.com/videos/wwdc/2016/707s77u9e6pv0dy9ggm/707/707_hd_introduction_to_notifications.mp4?dl=1 230 | http://devstreaming.apple.com/videos/wwdc/2016/707s77u9e6pv0dy9ggm/707/707_sd_introduction_to_notifications.mp4?dl=1 231 | http://devstreaming.apple.com/videos/wwdc/2016/711tlraheg74mofg3uq/711/711_hd_nsurlsession_new_features_and_best_practices.mp4?dl=1 232 | http://devstreaming.apple.com/videos/wwdc/2016/711tlraheg74mofg3uq/711/711_sd_nsurlsession_new_features_and_best_practices.mp4?dl=1 233 | http://devstreaming.apple.com/videos/wwdc/2016/714urluxe140lardrb7/714/714_hd_networking_for_the_modern_internet.mp4?dl=1 234 | http://devstreaming.apple.com/videos/wwdc/2016/714urluxe140lardrb7/714/714_sd_networking_for_the_modern_internet.mp4?dl=1 235 | http://devstreaming.apple.com/videos/wwdc/2016/715v2nxofqo5an4q79a/715/715_hd_neural_networks_and_accelerate.mp4?dl=1 236 | http://devstreaming.apple.com/videos/wwdc/2016/715v2nxofqo5an4q79a/715/715_sd_neural_networks_and_accelerate.mp4?dl=1 237 | http://devstreaming.apple.com/videos/wwdc/2016/719wve0t1j24kny0f9r/719/719_hd_optimizing_io_for_performance_and_battery_life.mp4?dl=1 238 | http://devstreaming.apple.com/videos/wwdc/2016/719wve0t1j24kny0f9r/719/719_sd_optimizing_io_for_performance_and_battery_life.mp4?dl=1 239 | http://devstreaming.apple.com/videos/wwdc/2016/721wh2etddp4ghxhpcg/721/721_hd_unified_logging_and_activity_tracing.mp4?dl=1 240 | http://devstreaming.apple.com/videos/wwdc/2016/721wh2etddp4ghxhpcg/721/721_sd_unified_logging_and_activity_tracing.mp4?dl=1 241 | http://devstreaming.apple.com/videos/wwdc/2016/702rhpkb0ux7uuzixps/702/702_hd_using_store_kit_for_inapp_purchases_with_swift_3.mp4?dl=1 242 | http://devstreaming.apple.com/videos/wwdc/2016/702rhpkb0ux7uuzixps/702/702_sd_using_store_kit_for_inapp_purchases_with_swift_3.mp4?dl=1 243 | http://devstreaming.apple.com/videos/wwdc/2016/710tkhyprou9hhbnc6g/710/710_hd_whats_new_in_homekit.mp4?dl=1 244 | http://devstreaming.apple.com/videos/wwdc/2016/710tkhyprou9hhbnc6g/710/710_sd_whats_new_in_homekit.mp4?dl=1 245 | http://devstreaming.apple.com/videos/wwdc/2016/706sgjvzkvg6rrg9icw/706/706_hd_whats_new_in_security.mp4?dl=1 246 | http://devstreaming.apple.com/videos/wwdc/2016/706sgjvzkvg6rrg9icw/706/706_sd_whats_new_in_security.mp4?dl=1 247 | http://devstreaming.apple.com/videos/wwdc/2016/724x4wbpmrtkjpgfdlj/724/724_hd_whats_new_in_the_apple_push_notification_service.mp4?dl=1 248 | http://devstreaming.apple.com/videos/wwdc/2016/724x4wbpmrtkjpgfdlj/724/724_sd_whats_new_in_the_apple_push_notification_service.mp4?dl=1 249 | http://devstreaming.apple.com/videos/wwdc/2016/704s1a6rjyi2dqhhyi7/704/704_hd_whats_new_with_wallet_and_apple_pay.mp4?dl=1 250 | http://devstreaming.apple.com/videos/wwdc/2016/704s1a6rjyi2dqhhyi7/704/704_sd_whats_new_with_wallet_and_apple_pay.mp4?dl=1 251 | http://devstreaming.apple.com/videos/wwdc/2016/712ugi7vg8jznn3pc3u/712/712_hd_working_with_wide_color.mp4?dl=1 252 | http://devstreaming.apple.com/videos/wwdc/2016/712ugi7vg8jznn3pc3u/712/712_sd_working_with_wide_color.mp4?dl=1 253 | --------------------------------------------------------------------------------