Slide 1

Slide 1 text

.VMUJQMF8JOEPXT J04%$+BQBO J1BE04%$

Slide 2

Slide 2 text

J1BE04 5JNF "QSJM +VOF J1IPOF04 J1IPOF04 J04 J04 J1BE04 J1BE .VMUJUBTLJOH .VMUJQMF 8JOEPXT

Slide 3

Slide 3 text

ࣗݾ঺հ w ͻΖΜʢҰٶߒڭʣ w 5XJUUFS(JU)VC2JJUB 4MJEF4IBSF4QFBLFS%FDL ˠIJSPOZUJD w גࣜձࣾ.FUB.P+J ಙౡۈ຿

Slide 4

Slide 4 text

J1BE04 w J1BEઐ༻ͷ04 w جຊతʹJ04ͱҰॹʹόʔδϣϯΞοϓ͍ͯ͠Δ w ։ൃ͸J044%,Ͱ w ΞϓϦͷόΠφϦ΋J04J1BE04ڞ௨ w ։ൃऀ͔ΒݟΕ͹J04ͱͷڥք͸͋·Γͳ͍

Slide 5

Slide 5 text

.VMUJQMF8JOEPXT ʜͳʹͦΕ͓͍͍͠ͷʁ

Slide 6

Slide 6 text

.VMUJQMF8JOEPXT ෳ਺ͷεϖʔεͰಉ͡ΞϓϦΛ։͍ͯ࡞ۀ͢Δ IUUQTXXXBQQMFDPNKQJQBEPT ˠ04ʹ౥ࡌ͞Ε͍ͯΔ ʮϝϞʯΞϓϦͷಈ࡞ྫ

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

ʮϝϞʯͷಈ࡞ w ΞϓϦΞΠίϯͷϝχϡʔʮ͢΂ͯͷ΢Οϯυ΢Λදࣔʯ ʢ"QQ&YQPTÉʣ w "QQ&YQPTÉͷӈ্ʹ͋ΔʴϘλϯ͔Β৽͍͠΢Οϯυ΢ Λ։͘͜ͱ͕Ͱ͖Δ w ৽͍͠΢Οϯυ΢͸"QQεΠονϟʔʹฒΜͰɺΞϓϦΛ੾ Γସ͑Δײ֮Ͱ΢Οϯυ΢Λ੾Γସ͑ΒΕΔ w 4QMJU7JFXͰಉ͡ΞϓϦͷผ΢Οϯυ΢Λฒ΂ΒΕΔ

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

ʮϝϞʯͷಈ࡞ w ϝϞͷΞΠςϜΛυϥοά͢Δ͜ͱͰผͷ΢Οϯυ΢Λ։ ͘͜ͱ͕Ͱ͖Δ w ը໘ͷࠨӈͷ୺ʹυϥοά͢Δͱ4QMJU7JFXͰɺ্୺ʹ υϥοά͢Δͱશը໘Ͱɺ৽͍͠΢Οϯυ΢͕։͔ΕΔ w ϝϞΞΠςϜ͔Β։͍ͨ΢Οϯυ΢͸ɺϝϞͷҰཡʹ໭Δ ͜ͱ͸ͳ͘ɺฤू͕ऴΘͬͨΒด͡Δ6*ʹͳ͍ͬͯΔ

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

ʮϝϞʯͷಈ࡞ w "QQεΠονϟʔ΍ɺ"QQ&YQPTÉͰ΢Οϯυ ΢Λ্ํ޲ʹεϫΠϓ͢Δͱɺ΢Οϯυ΢Λด͡ Δ͜ͱʹͳΔ ʢ͜Ε·ͰͷΞϓϦΛऴྃͤ͞Δͷͱಉ͡ૢ࡞ʣ w "QQ&YQPTÉʹดͨ͡΢Οϯυ΢Λ࠶ͼ։͘Ϙλ ϯ͕දࣔ͞ΕΔ

Slide 13

Slide 13 text

ΞϓϦΛ.VMUJQMF 8JOEPXTʹରԠͤ͞Δ

Slide 14

Slide 14 text

༧උ஌ࣝ w ͭͷΞϓϦͷϓϩηε͸ैདྷ௨Γͭ w ͜͜·Ͱʮεϖʔεʯ΍ʮ΢Οϯυ΢ʯͱݺΜͰ ͖ͨ΋ͷ͸ʮγʔϯʯʹ૬౰ w લ໘ʹදࣔ͞Ε͍ͯͳ͍γʔϯ͸੾அ͞ΕͨΓɺ ͦ΋ͦ΋઀ଓ͞Εͯͳ͔ͬͨΓ͢Δ

Slide 15

Slide 15 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ

Slide 16

Slide 16 text

ʰ4FTTJPOTʱ w Ұཡը໘ͱৄࡉը໘͔ΒͳΔ γϯϓϧͳΞϓϦ w ৄࡉը໘Ͱελʔͷ෇͚֎͠ ͕Ͱ͖Δ w .VMUJQMF8JOEPXTʹະର ԠˠରԠ͍ͤͯ͘͞ IUUQTHJUIVCDPNIJSPOZUJD.VMUJQMF8JOEPXT4BNQMF

Slide 17

Slide 17 text

4UFQ γʔϯ͸؆୯ ͦ͏ɺJ04Ҏ߱ͷΈͳΒͶ

Slide 18

Slide 18 text

9DPEFͰ৽نϓϩδΣΫτ࡞੒ w ࣗಈతʹγʔϯʹରԠͨ͠ςϯϓϨʔτͰΞϓϦ ͕࡞ΒΕΔ ˒ J04ҎલΛαϙʔτͤ͞Α͏ͱͨ͠ΒίϯύΠϧΤ ϥʔʹͳͬͯϜΧͭ͘ w ͦͷରԠͨ͠ίʔυΛίϐϖ͢Δͱָ w J04Ҏલͷαϙʔτํ๏ʜʜαϙʔτ΍ΊΑ͏

Slide 19

Slide 19 text

*OGPQMJTUʹ4DFOF.BOJGFTUΛ௥Ճ UIApplicationSceneManifest UIApplicationSupportsMultipleScenes UISceneConfigurations UIWindowSceneSessionRoleApplication UISceneConfigurationName Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate UISceneStoryboardFile Main ˡ1SPQFSUZ-JTUදࣔ 4PVSDF$PEFදࣔˠ

Slide 20

Slide 20 text

"QQ%FMFHBUFʹϝιουΛ଍͢ class AppDelegate: UIResponder, UIApplicationDelegate { ... func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } ... }

Slide 21

Slide 21 text

4DFOF%FMFHBUFΫϥεΛ࡞Δ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the // UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically // be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are // new (see `application:configurationForConnectingSceneSession` instead). guard let _ = (scene as? UIWindowScene) else { return } } func sceneDidDisconnect(_ scene: UIScene) { ...

Slide 22

Slide 22 text

6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ొ৔ਓ෺૬ؔਤ 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੵΉ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*"QQMJDBUJPO

Slide 23

Slide 23 text

4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF ΫϥεΛࢦఆ ొ৔ਓ෺૬ؔਤ 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੵΉ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO ੜ੒ͯ͠ฦ͢ 6*"QQMJDBUJPO

Slide 24

Slide 24 text

ొ৔ਓ෺૬ؔਤ 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੵΉ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ 6*"QQMJDBUJPO 6*8JOEPX4DFOF 6*4DFOF

Slide 25

Slide 25 text

ొ৔ਓ෺૬ؔਤ /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੵΉ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*"QQMJDBUJPO 6*8JOEPX4DFOF 6*4DFOF

Slide 26

Slide 26 text

4DFOF%FMFHBUF w ࠓ·Ͱ͸ը໘ͷϥΠϑαΠΫϧʹؔ͢Δ௨஌Λ "QQ%FMFHBUFͰड͚͍ͯͨ w ΞϓϦͭͷը໘Ͱ͸ͳ͘ͳΔͷͰ ը໘୯ҐʢγʔϯʣͰϥΠϑαΠΫϧ͕ҟͳΔ w ΞϓϦʢ6*"QQMJDBUJPOʣʹରͯ͠"QQ%FMFHBUFɺ γʔϯʢ6*4DFOFʣʹରͯ͠4DFOF%FMFHBUF

Slide 27

Slide 27 text

4DFOF%FMFHBUF "QQ%FMFHBUFͷҎԼͷϝιου͸ݺ͹Εͳ͘ͳΔ BQQMJDBUJPO%JE#FDPNF"DUJWF @ BQQMJDBUJPO8JMM3FTJHO"DUJWF @ BQQMJDBUJPO%JE&OUFS#BDLHSPVOE @ BQQMJDBUJPO8JMM&OUFS'PSFHSPVOE @ ͳͲ 4DFOF%FMFHBUFͷҎԼͷϝιου͕ݺ͹ΕΔΑ͏ʹͳΔ TDFOF%JE#FDPNF"DUJWF @ TDFOF8JMM3FTJHO"DUJWF @ TDFOF%JE&OUFS#BDLHSPVOE @ TDFOF8JMM&OUFS'PSFHSPVOE @ ͳͲ ˞J04Ͱ͸ݺ͹ΕΔ

Slide 28

Slide 28 text

4DFOF%FMFHBUF "QQ%FMFHBUFͷ BQQMJDBUJPO @EJE'JOJTI-BVODIJOH8JUI0QUJPOT ͸ݺ͹ΕΔ͕ɺ ΢Οϯυ΢ͷߏஙͳͲ͸4DFOF%FMFHBUFͷ TDFOF @XJMM$POOFDU5PPQUJPOT Ͱߦ͏ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // Use this method to optionally configure and attach the // UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically // be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are // new (see `application:configurationForConnectingSceneSession` instead). guard let _ = (scene as? UIWindowScene) else { return } }

Slide 29

Slide 29 text

"QQ%FMFHBUF͔Β4DFOF%FMFHBUF΁Ҿͬӽ͠ func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. // This can occur for certain types of temporary interruptions (such as an // incoming phone call or SMS message) or when the user quits the application // and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate // graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate // timers, and store enough application state information to restore your // application to its current state in case it is terminated later. // If your application supports background execution, this method is called // instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { ... var window: UIWindow?

Slide 30

Slide 30 text

4UFQ ෳ਺ͷγʔϯΛαϙʔτʂ ઓ͍ͷ࢝·Γ

Slide 31

Slide 31 text

*OGPQMJTUͷ4DFOF.BOJGFTUΛมߋ UIApplicationSceneManifest UIApplicationSupportsMultipleScenes UISceneConfigurations UIWindowSceneSessionRoleApplication UISceneConfigurationName Default Configuration UISceneDelegateClassName $(PRODUCT_MODULE_NAME).SceneDelegate UISceneStoryboardFile Main ˡ1SPQFSUZ-JTUදࣔ 4PVSDF$PEFදࣔˠ

Slide 32

Slide 32 text

͜Ε͚ͩͰ࠷௿ݶͷಈ࡞͸͢Δʂ

Slide 33

Slide 33 text

γʔϯΛબΜͩͷʹʜʜʂʁ ݪҼ γʔϯͷঢ়ଶΛอଘ ͍ͯ͠ͳ͍͔Β

Slide 34

Slide 34 text

4UFQ γʔϯঢ়ଶͷอଘͳΒ ΦϨʹ೚ͤΖ

Slide 35

Slide 35 text

/46TFS"DUJWJUZ w ΞϓϦͷঢ়ଶΛදݱ͢ΔΫϥε w .VMUJQMF8JOEPXTҎ֎Ͱ΋࢖ΘΕΔ )BOEP⒎ 4JSJ4IPSUDVUT w ΞϓϦݻ༗ͷঢ়ଶΛ֨ೲͰ͖ΔϓϩύςΟ͕͋Δ ೖΕΒΕΔ΋ͷ /4"SSBZ /4%BUB /4%BUF /4%JDUJPOBSZ /4/VMM /4/VNCFS /44FU /44USJOH /463- var userInfo: [AnyHashable : Any]? { get set }

Slide 36

Slide 36 text

/46TFS"DUJWJUZͷ࡞Γํ w ͔͋Β͡ΊܗࣜΛࣝผ͢ΔͨΊͷจࣈྻΛ *OGPQMJTUͰએݴ͓ͯ͘͠ w /46TFS"DUJWJUZͷΠχγϟϥΠβʹͦͷࣝผࢠ Λ౉ͯ͠ੜ੒͢Δ NSUserActivityTypes com.hironytic.Sessions.SessionDetail let userActivity = NSUserActivity(activityType: "com.hironytic.Sessions.SessionDetail") ˣ1SPQFSUZ-JTUදࣔ ˣ4PVSDF$PEFදࣔ

Slide 37

Slide 37 text

04͔ΒͷཁٻʹԠ͑Δ w 4DFOF%FMFHBUFͷϝιουʢࣗ෼Ͱ࣮૷͢Δʣ w Ҿ਺ʹ౉͞Εͨγʔϯʹର͢Δ/46TFS"DUJWJUZ Λฦ͢ͱɺ04͕ঢ়ଶΛهԱͯ͘͠ΕΔ func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? { ... }

Slide 38

Slide 38 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ /46TFS"DUJWJUZ

Slide 39

Slide 39 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ /46TFS"DUJWJUZ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF

Slide 40

Slide 40 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ /46TFS"DUJWJUZ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX4DFOF 6*4DFOF

Slide 41

Slide 41 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ /46TFS"DUJWJUZ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX4DFOF 6*4DFOF VTFS"DUJWJUZ

Slide 42

Slide 42 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ /46TFS"DUJWJUZ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX4DFOF 6*4DFOF VTFS"DUJWJUZ 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX XJOEPX4DFOF XJOEPX WJFX

Slide 43

Slide 43 text

4DFOF%FMFHBUFͷϝιουΛ࣮૷ func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? { return scene.userActivity } 4DFOF%FMFHBUF

Slide 44

Slide 44 text

6*4DFOFʹ/46TFS"DUJWJUZΛηοτ override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let userActivity = NSUserActivity(activityType: "com.hironytic.Sessions.SessionDetail") userActivity.userInfo = [ "sessionId": sessionId ] view.window?.windowScene?.userActivity = userActivity } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) view.window?.windowScene?.userActivity = nil ... } 4FTTJPO%FUBJM7JFX$POUSPMMFSʢৄࡉը໘ʣ 4FTTJPO-JTU7JFX$POUSPMMFSʢҰཡը໘ʣ

Slide 45

Slide 45 text

ঢ়ଶͷ෮ݩ w γʔϯʹ઀ଓ͢Δͱ͖ʹݺ͹ΕΔ4DFOF%FMFHBUF ͷTDFOF @XJMM$POOFDU5PPQUJPOT ͷୈ̎Ҿ਺ ʹ౉͞Εͨ6*4DFOF4FTTJPO͔Β /46TFS"DUJWJUZ͕औΕΔ w /46TFS"DUJWJUZʹ֮͑ͨ৘ใΛ΋ͱʹը໘ભҠ͢ Δ

Slide 46

Slide 46 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF

Slide 47

Slide 47 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*4DFOF4FTTJPO

Slide 48

Slide 48 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /4*UFN1SPWJEFS 6*%SBH*UFN ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*4DFOF4FTTJPO /46TFS"DUJWJUZ TUBUF3FTUPSBUJPO"DUJWJUZ

Slide 49

Slide 49 text

ঢ়ଶͷ෮ݩ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { ... if let activity = session.stateRestorationActivity { setupViewController(with: activity) } } func setupViewController(with activity: NSUserActivity) { guard activity.activityType == "com.hironytic.Sessions.SessionDetail" else { return } guard let sessionId = activity.userInfo?["sessionId"] as? String else { return } guard let navigationController = window?.rootViewController as? UINavigationController else { return } let detailVc = SessionDetailViewController.instantiate(sessionId: sessionId) navigationController.pushViewController(detailVc, animated: false) } 4DFOF%FMFHBUF

Slide 50

Slide 50 text

γʔϯ͕෮ݩ͞ΕΔΑ͏ʹͳͬͨ

Slide 51

Slide 51 text

ঢ়ଶͷอଘ͸γʔϯ"1*ͷػೳ w .VMUJQMF8JOEPXTʹରԠ͠ͳͯ͘΋࢖͑Δ w ࣮ࡍɺJ1IPOFͰ΋࢖͑Δ w ͨͩ͠ɺγʔϯ"1*͸J04͔Β

Slide 52

Slide 52 text

4UFQ ϓϩάϥϜ͔Β ৽͍͠γʔϯΛల։ʂ

Slide 53

Slide 53 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 6*%SBH*UFN

Slide 54

Slide 54 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 6*%SBH*UFN /4*UFN1SPWJEFS

Slide 55

Slide 55 text

ొ৔ਓ෺૬ؔਤ 6*"QQMJDBUJPO "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ 6*%SBH*UFN /4*UFN1SPWJEFS /46TFS"DUJWJUZ /4*UFN1SPWJEFS8SJUJOH ੵΉ

Slide 56

Slide 56 text

৽͘͠Ͱ͖ͨγʔϯͰ /46TFS"DUJWJUZΛड͚औΔ w γʔϯʹ઀ଓ͢Δͱ͖ʹݺ͹ΕΔ4DFOF%FMFHBUF ͷTDFOF @XJMM$POOFDU5PPQUJPOT ͷୈ̏Ҿ਺ ʹ౉͞Εͨ6*4DFOF$POOFDUJPO0QUJPOT͔Β /46TFS"DUJWJUZ͕औΕΔ w /46TFS"DUJWJUZʹ֮͑ͨ৘ใΛ΋ͱʹը໘Λߏங ͢Δ

Slide 57

Slide 57 text

υϥοάͷ։࢝ class SessionListViewController: UITableViewController { ... override func viewDidLoad() { super.viewDidLoad() tableView.dragDelegate = self ... } ... } extension SessionListViewController: UITableViewDragDelegate { func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let session = sessions[indexPath.row] let userActivity = NSUserActivity(activityType: "com.hironytic.Sessions.SessionDetail") userActivity.userInfo = [ "sessionId": session.id ] let itemProvider = NSItemProvider(object: userActivity) let dragItem = UIDragItem(itemProvider: itemProvider) return [dragItem] } } 4FTTJPO-JTU7JFX$POUSPMMFSʢҰཡը໘ʣ

Slide 58

Slide 58 text

/46TFS"DUJWJUZͷड͚औΓ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { ... if let activity = connectionOptions.userActivities.first ?? session.stateRestorationActivity { setupViewController(with: activity) } } 4DFOF%FMFHBUF

Slide 59

Slide 59 text

υϥοάˍυϩοϓʹΑΔγʔϯͷ௥Ճ

Slide 60

Slide 60 text

4UFQ ৽͍͠γʔϯ͸ ʮด͡Δʯʹ͍ͨ͠

Slide 61

Slide 61 text

৽͍͠γʔϯ͸ʮด͡Δʯʹ͍ͨ͠

Slide 62

Slide 62 text

)*(ʹ΋ॻ͔Ε͍ͯΔ Use a Done or Close button in an auxiliary window. When a primary window displays a document, the window typically includes a Back button that lets people navigate to a parent view. In contrast, when an auxiliary window displays a document, the Back button should be replaced with a Done or Close button, because people expect to close an auxiliary window when they're finished working in it. IUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFTJPTTZTUFNDBQBCJMJUJFTNVMUJQMFXJOEPXT

Slide 63

Slide 63 text

/46TFS"DUJWJUZʹϑϥάΛ࣋ͨͤΔ extension SessionListViewController: UITableViewDragDelegate { func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { let session = sessions[indexPath.row] let userActivity = NSUserActivity(activityType: "com.hironytic.Sessions.SessionDetail") userActivity.userInfo = [ "sessionId": session.id, "isAuxiliary": true, ] let itemProvider = NSItemProvider(object: userActivity) let dragItem = UIDragItem(itemProvider: itemProvider) return [dragItem] } } 4FTTJPO-JTU7JFX$POUSPMMFSʢҰཡը໘ʣ

Slide 64

Slide 64 text

ৄࡉը໘ͷ7JFX$POUSPMMFS·ͰҾ͖౉͢ func setupViewController(with activity: NSUserActivity) { guard activity.activityType == "com.hironytic.Sessions.SessionDetail" else { return } guard let sessionId = activity.userInfo?["sessionId"] as? String else { return } guard let navigationController = window?.rootViewController as? UINavigationController else { return } let isAuxiliary = activity.userInfo?["isAuxiliary"] as? Bool ?? false let detailVc = SessionDetailViewController.instantiate(sessionId: sessionId, isAuxiliary: isAuxiliary) navigationController.pushViewController(detailVc, animated: false) } 4DFOF%FMFHBUF

Slide 65

Slide 65 text

ϑϥάΛݟͯࠨ্ͷϘλϯΛมߋ override func viewDidLoad() { super.viewDidLoad() if isAuxiliary { let closeItem = UIBarButtonItem(title: "Close", style: .plain, target: self, action: #selector(closeButtonDidTap(_:))) navigationItem.leftBarButtonItem = closeItem } ... } 4FTTJPO%FUBJM7JFX$POUSPMMFSʢৄࡉը໘ʣ override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let userActivity = NSUserActivity(activityType: "com.hironytic.Sessions.SessionDetail") userActivity.userInfo = [ "sessionId": sessionId, "isAuxiliary": isAuxiliary, ] view.window?.windowScene?.userActivity = userActivity } ঢ়ଶอଘͷํʹ΋ ϑϥάΛ௥Ճɹˠ

Slide 66

Slide 66 text

$MPTFϘλϯͷॲཧ @objc private func closeButtonDidTap(_ sender: Any) { guard let scene = view.window?.windowScene else { return } let options = UIWindowSceneDestructionRequestOptions() options.windowDismissalAnimation = .standard UIApplication.shared .requestSceneSessionDestruction(scene.session, options: options) } 4FTTJPO%FUBJM7JFX$POUSPMMFSʢৄࡉը໘ʣ

Slide 67

Slide 67 text

ิॿతͳ΢Οϯυ΢ͱͯ͠ৼΔ෣͏Α͏ʹͳͬͨ

Slide 68

Slide 68 text

ͦͷଞͷτϐοΫ

Slide 69

Slide 69 text

γʔϯͷϥΠϑαΠΫϧ

Slide 70

Slide 70 text

γʔϯͷϥΠϑαΠΫϧ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUBQQ@BOE@FOWJSPONFOUNBOBHJOH@ZPVS@BQQ@T@MJGF@DZDMF TDFOF @XJMM$POOFDU5PPQUJPOT TDFOF8JMM&OUFS'PSFHSPVOE @ TDFOF%JE#FDPNF"DUJWF @ TDFOF8JMM3FTJHO"DUJWF @ TDFOF%JE&OUFS#BDLHSPVOE @ TDFOF%JE%JTDPOOFDU @ Discarded γʔϯ͕ด͡ΒΕͨͱ͖ BQQMJDBUJPO @EJE%JTDBSE4DFOF4FTTJPOT "QQεΠονϟʔ͔Βดͨ͡ͱ͖͸ ʮดͨ͡΢Οϯυ΢Λ࠶ͼ։͘ʯ͕ ༗ޮͳ࣌఺Ͱ͸·ͩݺ͹Εͳ͍

Slide 71

Slide 71 text

ొ৔ਓ෺૬ؔਤ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 6*"QQMJDBUJPO

Slide 72

Slide 72 text

ొ৔ਓ෺૬ؔਤ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN 6*4DFOF4FTTJPO ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 6*"QQMJDBUJPO 6*8JOEPX4DFOF 6*4DFOF DPOOFDUFE4DFOFT

Slide 73

Slide 73 text

ొ৔ਓ෺૬ؔਤ "QQ%FMFHBUF 6*"QQMJDBUJPO%FMFHBUF 6*4DFOF$POpHVSBUJPO 4DFOF%FMFHBUF 6*8JOEPX4DFOF%FMFHBUF 6*4DFOF%FMFHBUF 6*8JOEPX 7JFX$POUSPMMFS 6*7JFX$POUSPMMFS 7JFX 6*8JOEPX4DFOF 6*4DFOF /46TFS"DUJWJUZ /4*UFN1SPWJEFS 6*%SBH*UFN ੜ੒ͯ͠ฦ͢ ΫϥεΛࢦఆ ੵΉ 6*"QQMJDBUJPO 6*4DFOF4FTTJPO PQFO4FTTJPOT

Slide 74

Slide 74 text

γϯΫϩφΠζυγʔϯ ʬঢ়ଶͷಉظʭ

Slide 75

Slide 75 text

γϯΫϩφΠζυγʔϯʬঢ়ଶͷಉظʭ w ಉ͡ΞϓϦͷγʔϯ Λ4QMJU7JFXͰಉ࣌ ʹදࣔ w Ұํͷૢ࡞Ͱɺ΋͏ Ұํͷը໘΋ߋ৽͞ Εͯ΄͍͠

Slide 76

Slide 76 text

γʔϯؒͷঢ়ଶͷಉظํ๏ w ಛผͳํ๏͕͋ΔΘ͚Ͱ͸ͳ͍ ‎,70ɺ/PUJpDBUJPO$FOUFSɺ$PNCJOFɺଞʜ ͕Μ͹Ε͹͍͍͚ͩ w ϞσϧΛܦ༝͢ΔσʔλͷྲྀΕ͕୯ํ޲ʹͳͬͯ ͍Δͱಉظ͠΍͍͢

Slide 77

Slide 77 text

୯ํ޲σʔλϑϩʔͷྫʢ.77.ʣ 7JFX 7JFX.PEFM .PEFM

Slide 78

Slide 78 text

୯ํ޲σʔλϑϩʔͷྫʢ.77.ʣ 7JFX 7JFX.PEFM .PEFM 7JFX 7JFX.PEFM

Slide 79

Slide 79 text

୯ํ޲σʔλϑϩʔͷྫʢ'MVYʣ 7JFX "DUJPO 4UPSF 7JFX %JTQBUDIFS

Slide 80

Slide 80 text

޷͖ͳγʔϯΛબΜͰͶ

Slide 81

Slide 81 text

޷͖ͳγʔϯΛબΜͰͶ w ௨஌ɺ2VJDL"DUJPOTɺ4IPSUDVUͳͲ͔ΒΞϓϦΛݺͼ ग़͢ͱɺͲͷγʔϯ͕ΞΫςΟϒʹͳΔʁ w ΞϓϦΛݺͼग़͢ஈ֊Ͱ͸ɺ·ͩΞϓϦͷϓϩηε͸ى ಈ͍ͯ͠ͳ͍͔΋͠Εͳ͍ w ʮ5BSHFU$POUFOU*EFOUJpFSʯͱ ʮ"DUJWBUJPO$POEJUJPOTʯ Λ࢖ͬͯΞϓϦΛىಈͤͣʹγʔϯΛܾఆ͢Δ

Slide 82

Slide 82 text

5BSHFU$POUFOU*EFOUJpFS w ಺༰Λࣝผ͢ΔͨΊͷ೚ҙͷจࣈྻ w ͜ͷจࣈྻΛΩοΫ͢Δଆʹηοτ͢Δ 1VTI௨஌ʢ"1/4UBSHFUDPOUFOUJEΩʔʣ 6*"QQMJDBUJPO4IPSUDVU*UFNUBSHFU$POUFOU*EFOUJpFS /46TFS"DUJWJUZUBSHFU$POUFOU*EFOUJpFS

Slide 83

Slide 83 text

"DUJWBUJPO$POEJUJPOT w 6*4DFOFͷϓϩύςΟ BDUJWBUJPO$POEJUJPOT w /41SFEJDBUFͷϓϩύςΟΛͭ࣋ͭ DBO"DUJWBUF'PS5BSHFU$POUFOU*EFOUJpFS1SFEJDBUF QSFGFST5P"DUJWBUF'PS5BSHFU$POUFOU*EFOUJpFS1SFEJDBUF

Slide 84

Slide 84 text

"DUJWBUJPO$POEJUJPOT w 6*4DFOFͷϓϩύςΟ BDUJWBUJPO$POEJUJPOT w /41SFEJDBUFͷϓϩύςΟΛͭ࣋ͭ DBO"DUJWBUF'PS5BSHFU$POUFOU*EFOUJpFS1SFEJDBUF QSFGFST5P"DUJWBUF'PS5BSHFU$POUFOU*EFOUJpFS1SFEJDBUF activationConditions.prefersToActivateForTargetContentIdentifierPredicate = NSPredicate(format: "self == %@", "com.hironytic.Sessions.SessionDetail/\(sessionId)")

Slide 85

Slide 85 text

"DUJWBUJPO$POEJUJPOT w DBOͷํ͸ʮѻ͑Δ͔Ͳ͏͔ʯ QSFGFST5Pͷํ͸ʮΑΓ;͞Θ͍͔͠Ͳ͏͔ʯ w /41SFEJDBUFͷ੍ݶ #MPDLΛ࢖͏ͷ͸μϝ ਖ਼نදݱΛ൐͏΋ͷ͸μϝ TFMGҎ֎͸μϝ

Slide 86

Slide 86 text

3FDBQ

Slide 87

Slide 87 text

3FDBQ w .VMUJQMF8JOEPXTͱ͸Ͳ͏͍͏΋ͷ͔ ඪ४ʮϝϞʯΞϓϦΛྫʹͯ͠ղઆ w .VMUJQMF8JOEPXT΁ͷରԠํ๏ γʔϯ"1*ʹରԠͯ͠&OBCMFʹ͢Δ γʔϯͷঢ়ଶอଘ υϥοάʹΑΔ৽͍͠γʔϯͷ࡞੒ w ͦͷଞͷτϐοΫ ϥΠϑαΠΫϧ ঢ়ଶͷಉظ ద੾ͳγʔϯͷબ୒

Slide 88

Slide 88 text

͓·͚ɿ"QQMFެࣜࢿྉ w 88%$*OUSPEVDJOH.VMUJQMF8JOEPXTPOJ1BE IUUQTEFWFMPQFSBQQMFDPNXXED w 88%$"SDIJUFDUJOH:PVS"QQGPS.VMUJQMF8JOEPXT IUUQTEFWFMPQFSBQQMFDPNXXED w 88%$5BSHFUJOH$POUFOUXJUI.VMUJQMF8JOEPXT IUUQTEFWFMPQFSBQQMFDPNXXED w %PDVNFOUBUJPO6*,JU"QQBOE&OWJSPONFOU4DFOFT IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUBQQ@BOE@FOWJSPONFOUTDFOFT w )VNBO*OUFSGBDF(VJEFMJOF.VMUJQMF8JOEPXTPOJ1BE IUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFTJPTTZTUFNDBQBCJMJUJFTNVMUJQMF XJOEPXT w 4VQQPSUJOH.VMUJQMF8JOEPXTPOJ1BEʢαϯϓϧίʔυʣ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUBQQ@BOE@FOWJSPONFOUTDFOFT TVQQPSUJOH@NVMUJQMF@XJOEPXT@PO@JQBE

Slide 89

Slide 89 text

͓·͚ɿ9DPEFͰ৽نϓϩδΣΫτ࡞੒௚ޙ ʹɺJ04Λαϙʔτ͢Δํ๏ w %FQMPZNFOU5BSHFUΛมߋ͢Δ w 4DFOF%FMFHBUFʹJ04Ҏ߱ͷଐੑΛ͚ͭΔ w "QQ%FMFHBUFʹXJOEPXϓϩύςΟΛੜ΍͢ w "QQ%FMFHBUFͷγʔϯབྷΈͷϝιουʹJ04Ҏ߱ͷଐੑΛͭ ͚Δ @available(iOS 13.0, *) class SceneDelegate: UIResponder, UIWindowSceneDelegate { ... @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? ... @available(iOS 13.0, *) func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {...} @available(iOS 13.0, *) func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {...}

Slide 90

Slide 90 text

͓·͚̏ɿγʔϯͷλΠτϧ 6*4DFOFͷUJUMFϓϩύςΟͷจࣈྻ͕ "QQεΠονϟʔ΍"QQ&YQPTÉʹදࣔ͞ΕΔ

Slide 91

Slide 91 text

͓·͚ɿ4XJGU6* w 9DPEF͕࡞ΔςϯϓϨʔτʢJ04޲͚ʣ 4DFOF%FMFHBUFͷɹTDFOF XJMM$POOFDU5PPQUJPOT Ͱ 6*)PTUJOH$POUSPMMFSΛ࡞ͬͯ4XJGU6*Λද͍ࣔͯ͠Δ w J04Ͱ͸ 4XJGU6*ͷΈͰγʔϯ͕αϙʔτ͞ΕΔ 88%$"QQFTTFOUJBMTJO4XJGU6* IUUQTEFWFMPQFSBQQMFDPNXXED