Slide 1

Slide 1 text

όοΫάϥ΢ϯυͰΞϓϦ͕Ωϧ͞Εͯ΋ ා͘ͳ͍ʂ ΞϓϦͷঢ়ଶΛݩʹ໭͢ϦετΞػೳͷશͯ J04%$5TVZPTIJIZVHB

Slide 2

Slide 2 text

όοΫάϥ΢ϯυͰΞϓϦ͕Ω ϧ͞Εͯ΋ා͘ͳ͍

Slide 3

Slide 3 text

όοΫάϥ΢ϯυͰΞϓϦ͕Ωϧ͞Εͯ΋ා͘ͳ͍ w J04%$ w ৄղ4UPSZCPBSE಺Ͱগ͠ղઆ

Slide 4

Slide 4 text

.PSF*OGPSNBUJPO IUUQTXXXZPVUVCFDPNXBUDI WV'I6DIC0@TUT ৄղ4UPSZCPBSE

Slide 5

Slide 5 text

όοΫάϥ΢ϯυͰΞϓϦ͕Ω ϧ͞Εͯ΋ා͘ͳ͍

Slide 6

Slide 6 text

"QQ" -BVODI4DSFFO ΞϓϦ"Λىಈ

Slide 7

Slide 7 text

ΞϓϦ"Λར༻த

Slide 8

Slide 8 text

ΞϓϦ"Ͱɺ͍͍͘͢͝৔໘·ͰਐΜͰ͍Δ

Slide 9

Slide 9 text

ΞϓϦ# ΞϓϦ#͔Β௨஌

Slide 10

Slide 10 text

ΞϓϦ#ʹભҠͯ͠ɺ৭ʑ΍Δ "QQ#

Slide 11

Slide 11 text

ΞϓϦ"ʹ໭Δ "QQ" -BVODI4DSFFO

Slide 12

Slide 12 text

ΞϓϦ"͸࠷ॳ͔Βʹͳ͍ͬͯΔ

Slide 13

Slide 13 text

ΞϓϦར༻Λ΍ΊΔ

Slide 14

Slide 14 text

ΞϓϦ͕ऴྃͨ࣌͠ͷରࡦ

Slide 15

Slide 15 text

ͦΕɺ4UPSZCPBSEͰ ରࡦͰ͖·͢Α

Slide 16

Slide 16 text

3FTUPSBUJPO

Slide 17

Slide 17 text

3FTUPSBUJPO w 6*"QQMJDBUJPO%FMFHBUFͰঢ়ଶͷอଘͱ෮ݩΛ༗ޮʹ͢Δ w ෮ݩ͍ͨ͠7JFX$POUSPMMFSʹରͯ͠3FTUPSBUJPO*%Λઃఆ͢Δ

Slide 18

Slide 18 text

6*"QQMJDBUJPO%FMFHBUFͰ ঢ়ଶͷอଘͱ෮ݩΛ༗ޮʹ͢Δ

Slide 19

Slide 19 text

ঢ়ଶͷอଘͱ෮ݩΛ༗ޮʹ͢Δ w 6*"QQMJDBUJPO%FMFHBUFͷ3FTUPSFܥϝιουΛUSVFʹ͢Δ w BQQMJDBUJPO @TIPVME4BWF4FDVSF"QQMJDBUJPO4UBUF w BQQMJDBUJPO @TIPVME3FTUPSF4FDVSF"QQMJDBUJPO4UBUF w BQQMJDBUJPO @TIPVME4BWF"QQMJDBUJPO4UBUF w BQQMJDBUJPO @TIPVME3FTUPSF"QQMJDBUJPO4UBUF

Slide 20

Slide 20 text

extension AppDelegate { func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { return true } func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { return true } @available(iOS 13.2, *) func application(_ application: UIApplication, shouldSaveSecureApplicationState coder: NSCoder) -> Bool { return true } @available(iOS 13.2, *) func application(_ application: UIApplication, shouldRestoreSecureApplicationState coder: NSCoder) -> Bool { return true } }

Slide 21

Slide 21 text

෮ݩ͍ͨ͠7JFX$POUSPMMFSʹରͯ͠ 3FTUPSBUJPO*%Λઃఆ͢Δ

Slide 22

Slide 22 text

3FTUPSBUJPO*%ͷઃఆ ෮ݩ͍ͨ͠ର৅ͷ7JFX$POUSPMMFSશͯʹϢχʔΫͳ3FTUPSBUJPO*%ΛׂΓ౰ͯΔ

Slide 23

Slide 23 text

ϦετΞͷςετ

Slide 24

Slide 24 text

ϦετΞͷςετ ໨తͷը໘·ͰભҠ͢Δ ྫͱͯ͠.PEBMભҠΛߦ͏ ʢ/BWJHBUJPOભҠͰ΋Մʣ

Slide 25

Slide 25 text

ϦετΞͷςετ Ұ౓ϗʔϜը໘ʹ໭Δ

Slide 26

Slide 26 text

ϦετΞͷςετ 9DPEF͔Β3VOΛߦ͏

Slide 27

Slide 27 text

ϦετΞͷςετ ௨ৗͰ͋Ε͹ॳظը໘͔Β࢝· Δͱ͜Ζɺઌఔͷଓ͖ͷϞʔμ ϧը໘͔ΒΞϓϦ͕࢝·Δ

Slide 28

Slide 28 text

͔͠͠

Slide 29

Slide 29 text

໊લ೔޲ڧ

Slide 30

Slide 30 text

ॴଐגࣜձࣾ"NB[JB

Slide 31

Slide 31 text

w #-&ͰJ04"OESPJEؒͰͦͦ͜͜ େ͖ͳαΠζͷσʔλ௨৴Λ࣮ݱ͢Δ -$"1΋͋ΔΑ w ͋ͳͨͷ஌Βͳ͍࿈བྷઌͷੈք w ৄղ4UPSZCPBSE

Slide 32

Slide 32 text

झຯύϯ԰८Γ

Slide 33

Slide 33 text

ϦετΞͷςετ ϗʔϜը໘ʹ໭ͬͨޙɺ࠶౓9DPEF3VO

Slide 34

Slide 34 text

ը໘ભҠ͸อͨΕ͍ͯΔ͕ɺೖ ྗͨ͠σʔλ͕ফ͍͑ͯΔ

Slide 35

Slide 35 text

/4$PEFS

Slide 36

Slide 36 text

7JFX$POUSPMMFSͷσʔλ෮ݩͷ࢓૊Έ w ϦετΞͰ෮ݩ͞ΕΔͷ͸4UPSZCPBSE্ʹઃఆͯ͋͠ΔσʔλͷΈ w ͭ·Γɺ4UPSZCPBSEͷσʔλҎ֎͸͍࣋ͬͯͳ͍ͷͰɺޙ͔Βೖྗ ͨ͠ςΩετσʔλ͸͍࣋ͬͯͳ͍ w 4UPSZCPBSEҎ֎ͷσʔλΛ࣋ͨͤΔ͜ͱ͕ඞཁ w ͦͷσʔλͷอ࣋ઌ͕/4$PEFS

Slide 37

Slide 37 text

$PEFS΁ͷσʔλ௥Ճ w 6*7JFX$POUSPMMFSFODPEF3FTUPSBCMF4UBUF w ϗʔϜը໘ʹભҠ͢Δͱ͖ͳͲʹݺ͹ΕΔ w $PEFSʹର͠ɺ֤छFODPEF ͰύϥϝʔλΛอଘ͓ͯ͘͠ w 6*7JFX$POUSPMMFSEFDPEF3FTUPSBCMF4UBUF w ֤छEFDPEF ͰɺFODPEF3FTUPSBCMF4UBUFͰอଘ͓͍ͯͨ͠σʔλΛ औಘ͢Δ

Slide 38

Slide 38 text

$PEFS΁ͷσʔλ௥Ճɺ෮ݩ class HobbyViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func encodeRestorableState(with coder: NSCoder) { super.encodeRestorableState(with: coder) coder.encode(textField.text, forKey: "textFieldText") } override func decodeRestorableState(with coder: NSCoder) { super.decodeRestorableState(with: coder) textField.text = coder.decodeObject(forKey: "textFieldText") as? String } }

Slide 39

Slide 39 text

࠶౓֬ೝ

Slide 40

Slide 40 text

໊લ೔޲ڧ

Slide 41

Slide 41 text

ॴଐגࣜձࣾ"NB[JB

Slide 42

Slide 42 text

w #-&ͰJ04"OESPJEؒͰͦͦ͜͜ େ͖ͳαΠζͷσʔλ௨৴Λ࣮ݱ͢Δ -$"1΋͋ΔΑ w ͋ͳͨͷ஌Βͳ͍࿈བྷઌͷੈք w ৄղ4UPSZCPBSE

Slide 43

Slide 43 text

झຯύϯ԰८Γ

Slide 44

Slide 44 text

ϦετΞͷςετ ϗʔϜը໘ʹ໭ͬͨޙɺ࠶౓9DPEF3VO

Slide 45

Slide 45 text

w #-&ͰJ04"OESPJEؒͰͦͦ͜͜ େ͖ͳαΠζͷσʔλ௨৴Λ࣮ݱ͢Δ -$"1΋͋ΔΑ w ͋ͳͨͷ஌Βͳ͍࿈བྷઌͷੈք w ৄղ4UPSZCPBSE

Slide 46

Slide 46 text

·ͱΊ w 6*"QQMJDBUJPO%FMFHBUFͰঢ়ଶͷอଘͱ෮ݩΛ༗ޮʹ͢Δ w ෮ݩ͍ͨ͠7JFX$POUSPMMFSʹରͯ͠3FTUPSBUJPO*%Λઃఆ͢Δ w /4$PEFSʹɺඞཁͳσʔλΛอଘ͠ɺ෮ݩͷλΠϛϯάͰ/4$PEFS͔Β σʔλΛऔಘ͢Δ

Slide 47

Slide 47 text

ࠓ·Ͱͷ͜ͱ͸๨Ε͍ͯͩ͘͞

Slide 48

Slide 48 text

4UPSZCPBSEͷϦετΞ w ΞϓϦ͕4DFOF%FMFHBUFʹରԠ͍ͯ͠Δ৔߹͸͜ͷϦετΞ͕ಈ͔ͳ͍ w ผͳରԠΛ͢Δඞཁ͕͋Δ

Slide 49

Slide 49 text

/46TFS"DUJWJUZ

Slide 50

Slide 50 text

ΞϓϦͷঢ়ଶͷอଘͱ෮ݩ w /46TFS"DUJWJUZΛอଘ͢Δ w ىಈ࣌ɺ/46TFS"DUJWJUZ͔ΒσʔλΛ෮ݩ͢Δ

Slide 51

Slide 51 text

/46TFS"DUJWJUZͷอଘ

Slide 52

Slide 52 text

*OGPQMJTUͷฤू w *OGPQMJTUʹ/46TFS"DUJWJUZ5ZQFTΛ௥Ճ͢Δ w "SSBZ4USJOH

Slide 53

Slide 53 text

/46TFS"DUJWJUZͷอଘ w /46TFS"DUJWJUZͷอଘͷλΠϛϯά͸ɺ7JFX$POUSPMMFSͷ WJFX%JE"QQFBSҎ߱ʹߦ͏

Slide 54

Slide 54 text

func updateUserActivity() { // ݱࡏͷγʔϯͷUserActivityͷऔಘ ͳ͚Ε͹࡞Δ var currentUserActivity = view.window?.windowScene?.userActivity if currentUserActivity == nil { currentUserActivity = NSUserActivity(activityType: "com.example.staterestore.mainActivity") } // UserActivityʹσʔλΛ٧ΊΔ currentUserActivity?.title = "λΠτϧ" currentUserActivity?.targetContentIdentifier = "unique id" currentUserActivity?.addUserInfoEntries(from: ["key1": "value1"]) currentUserActivity?.addUserInfoEntries(from: ["key2": 2]) // ݱࡏͷγʔϯʹUserActivityΛ໭͢ view.window?.windowScene?.userActivity = currentUserActivity }

Slide 55

Slide 55 text

/46TFS"DUJWJUZͷอଘ w ݱࡏͷγʔϯ͔Β/46TFS"DUJWJUZΛऔΓग़͢ w WJFXXJOEPX XJOEPX4DFOF VTFS"DUJWJUZ͔Βݱࡏͷ/46TFS"DUJWJUZΛऔΓग़͢ w OJMͷ৔߹ɺ/46TFS"DUJWJUZΛ࡞੒͢Δ w BDUJWJUZ5ZQFʹ͸ઌఔ*OGPQMJTUͰઃఆͨ͠΋ͷΛ࢖͏ w /46TFS"DUJWJUZʹର͠ɺ෮ݩʹඞཁͳ৘ใΛ٧ΊΔʢޙड़ʣ w ৘ใΛ٧ΊͨޙɺWJFXXJOEPX XJOEPX4DFOF VTFS"DUJWJUZʹ/46TFS"DUJWJUZΛฦ ͢

Slide 56

Slide 56 text

/46TFS"DUJWJUZʹઃఆ͢Δ৘ใ w UJUMF w UBSHFU$POUFOU*EFOUJ fi FS w VTFS*OGP BEE6TFS*OGP&OUSJFT w ෮ݩʹඞཁͳ஋Λ٧ΊΔ

Slide 57

Slide 57 text

/46TFS"DUJWJUZΛอଘ͢ΔλΠϛϯά VQEBUF6TFS"DUJWJUZ Λ࣮ߦ͢ΔλΠϛϯάྫ w WJFX%JE"QQFBS w ֤छσʔλ͕มΘͬͨͱ͖ w ฤू͞ΕͨςΩετ w Ϣʔβʔ͕બ୒தͷΞΠςϜͷมߋ

Slide 58

Slide 58 text

ϗʔϜը໘ભҠ࣌ʹ/46TFS"DUJWJUZΛอଘ w 4DFOF%FMFHBUFʹTUBUF3FTUPSBUJPO"DUJWJUZ GPS Λ࣮૷͢Δ w 7JFX$POUSPMMFSͰઃఆ͍ͯͨ͠6TFS"DUJWJUZΛฦ͢ w લड़ͷॲཧΛߦͳ͍ͬͯΕ͹ɺTDFOFVTFS"DUJWJUZΛฦ͚ͩ͢Ͱ0,

Slide 59

Slide 59 text

func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? { scene.userActivity }

Slide 60

Slide 60 text

ΞϓϦͷ෮ݩ

Slide 61

Slide 61 text

ΞϓϦͷ෮ݩ w TDFOF @TDFOF6*4DFOF XJMM$POOFDU5PTFTTJPO6*4DFOF4FTTJPO PQUJPOTDPOOFDUJPO0QUJPOT6*4DFOF$POOFDUJPO0QUJPOT w ΞϓϦىಈͷλΠϛϯάͰɺTFTTJPOTUBUF3FTUPSBUJPO"DUJWJUZΛ֬ೝ͢ Δ w TUBUF3FTUPSBUJPO"DUJWJUZͰอଘ͍ͯͨ͠/46TFS"DUJWJUZ͕औಘͰ͖Δ w ը໘ભҠͳͲ͸ࣗ෼Ͱߏங͢Δඞཁ͕͋Δ w 6TFS*OGPͷઃܭ͕ඞཁ

Slide 62

Slide 62 text

guard let activity = session.stateRestorationActivity else { return } if activity.activityType == "com.example.staterestore.mainActivity" { let storyboard = UIStoryboard(name: "Main", bundle: .main) if let userInfo = activity.userInfo { // userInfoͷ಺༰Ͱ໨తͷViewControllerΛ෮ݩ͢Δ let detailParentViewController = storyboard.instantiateViewController(withIdentifier: "DetailParentViewController") detailParentViewController.hoge = userInfo[“detailParentViewControllerValue"] // ը໘ભҠΛ෮ݩ͢Δ(ྫͱͯ͠NavigationControllerͷ৔߹) if let navigationController = window?.rootViewController as? UINavigationController { navigationController.pushViewController(detailParentViewController, animated: false) } } }

Slide 63

Slide 63 text

4XJGU6*ͰͷϦετΞ

Slide 64

Slide 64 text

4DFOF4UPSBHF

Slide 65

Slide 65 text

4DFOF4UPSBHF struct ContentView: View { @State private var isPresented: Bool = false var body: some View { VStack { Button(action: { isPresented.toggle() }) { Text("Button") } } .sheet(isPresented: $isPresented, content: { Text("present") }) } } 4IFFUද੍ࣔޚΛߦ͏JT1SFTFOUFEΛϦετΞର৅ʹؚΊͯɺ࣍ճىಈ࣌ʹγʔτͷ 1SFTFOUঢ়ଶΛอͭʹ͸ʁ

Slide 66

Slide 66 text

4DFOF4UPSBHF struct ContentView: View { @SceneStorage("ContentView.isPresented") private var isPresented: Bool = false var body: some View { VStack { Button(action: { isPresented.toggle() }) { Text("Button") } } .sheet(isPresented: $isPresented, content: { Text("present") }) } } !4UBUFΛ!4DFOF4UPSBHFʹม͑Δͱɺ࣍ճىಈ࣌΋஋͕อͨΕΔ Ωʔ໊͸ϢχʔΫʹ͢Δ

Slide 67

Slide 67 text

4XJGU6*/46TFS"DUJWJUZ

Slide 68

Slide 68 text

struct ContentView: View { @State private var selectedTitle: Book? = nil var body: some View { NavigationView { List(bookList) { book in NavigationLink(destination: SwiftUIView(book: $selectedTitle), tag: book, selection: $selectedTitle, label: { Text(book.title) }) } .navigationTitle(Text("Ն໨ᕸੴ")) } .onContinueUserActivity("app.hyuga.SwiftUIActivity.restore", perform: { userActivity in selectedTitle = try! userActivity.typedPayload(Book.self) }) } } struct Book: Identifiable, Codable, Hashable { var id: String { title } let title: String let contents: String } τοϓϖʔδͷ7JFXʹPO$POUJOVF6TFS"DUJWJUZΛ࣮૷ VTFS"DUJWJUZ͔Β஋Λ΋Βͬͯ4UBUFΛߋ৽͢ΔΑ͏ʹ͓ͯ͘͜͠ͱͰɺ"DUJWJUZىಈ࣌ʹ௚઀/BWJHBUJPO-JOL͕࡞ಈ͢Δ

Slide 69

Slide 69 text

struct SwiftUIView: View { @Binding var book: Book? var body: some View { Text(book?.contents ?? "") .userActivity("app.hyuga.SwiftUIActivity.restore", { activity in let returnBook: Book if let activityBook = try? activity.typedPayload(Book.self) { returnBook = activityBook } else { returnBook = book! } activity.title = returnBook.title activity.targetContentIdentifier = returnBook.id activity.isEligibleForSearch = true activity.userInfo = ["title":returnBook.title, "contents": returnBook.contents] }) .navigationTitle(book?.title ?? "") } } VTFS"DUJWJUZΛ࣮૷ͯ͠ɺBDUJWJUZ͕͋Δ͜ͱΛ஌ΒͤΔ JT&MJHJCMF'PS4FBSDIΛUSVFʹͯ͠ɺ4QPUMJHIUݕࡧ͔Β"DUJWJUZ͕ىಈͰ͖ΔΑ͏ʹ͓ͯ͘͠

Slide 70

Slide 70 text

4XJGU6* /46TFS"DUJWJUZ εϙοτϥΠτݕࡧͰ௚઀ɺຊ Λ։͘͜ͱ͕ՄೳʹͳΔ

Slide 71

Slide 71 text

ࢀߟϦϯΫ w 3FTUPSJOH:PVS"QQ`T4UBUF w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJU VJWJFXDPOUSPMMFSSFTUPSJOH@ZPVS@BQQ@T@TUBUF w 3FTUPSJOH:PVS"QQ`T4UBUFXJUI4XJGU6* w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJU WJFX@DPOUSPMMFSTSFTUPSJOH@ZPVS@BQQ@T@TUBUF@XJUI@TXJGUVJ