Slide 1

Slide 1 text

؆୯ʹͰ͖Δʂ ΞϓϦ΁ͷಋઢͷ૿΍͠ํ Tomosuke Okada 2019/12/24 ͋Δ͋ΔLTʙ ΫϦεϚεͩΑʂAndroid & iOS߹ಉ େLTେձ ʙ Vol.9 1

Slide 2

Slide 2 text

About me • Tomosuke Okada • iOSྺ3೥ • ອըͷΞϓϦΛ࡞ͬͯ·͢ • SNS • Qiita → @fr0g_fr0g • Github → Frog-Frog • Twitter → @fr0g_fr0g • μϒϧϑϩοά

Slide 3

Slide 3 text

ΞϓϦ։ൃऀͷئ͍ɾɾɾ 3

Slide 4

Slide 4 text

ΞϓϦΛ࢖ͬͯཉ͍͠ʂʂ 4

Slide 5

Slide 5 text

ಋઢΛ૿΍͞ͳ͖Όʂ 5

Slide 6

Slide 6 text

ΞϓϦΛ։ͨ͘Ίͷํ๏ͬͯͳʹ͕͋ΔͩΖ͏ʁ • ϗʔϜ • AppStore • ϓογϡ௨஌ • URLεΩʔϜ • ϢχόʔαϧϦϯΫ • TodayExtension • Spotlightݕࡧ 7

Slide 7

Slide 7 text

SpotlightݕࡧΛ঺հ͍ͨ͠ 8

Slide 8

Slide 8 text

Spotlightݕࡧͬͯͳʹʁ 9

Slide 9

Slide 9 text

10

Slide 10

Slide 10 text

͜͜ʹࣗ෼ͷΞϓϦ಺ͷίϯςϯπΛද͍ࣔͨ͠ 11

Slide 11

Slide 11 text

12 CoreSpotlight.frameworkͱMobileCoreServices.frameworkΛ௥Ճ͢Δ

Slide 12

Slide 12 text

13 struct Movie { /// өըݻ༗ͷࣝผ൪߸ let id = 0 /// ໊લ let title = "εύΠμʔϚϯ" /// ͋Β͢͡ let summary = "ฏຌͳগ೥ɺϐʔλʔɾύʔΧʔ͸์ࣹೳԚછ͞Εͨ஖ᥨʹט·Εͨ͜ͱͰɺ௒ਓతͳ ೳྗΛಘͯ͠·͏ɾɾɾ" /// ը૾ let thumbnail = UIImage(named: "spider") /// ໾ऀ໊ͷ഑ྻ let actorNames = ["τϏʔɾϚάϫΠΞ", "ΩϧεςΟϯɾμϯετ", "δΣʔϜζɾϑϥϯί"] }

Slide 13

Slide 13 text

14 import Foundation import CoreSpotlight import MobileCoreServices final class SpotlightManager { func save(_ movie: Movie) { let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String) // ᶃλΠτϧ attributeSet.title = movie.title // ᶄઆ໌จ attributeSet.contentDescription = movie.summary // ᶅը૾ attributeSet.thumbnailData = movie.thumbnail?.pngData() // Ωʔϫʔυʢදࣔ͞Εͳ͍͕ɺλΠτϧ΍આ໌จʹೖͬͯͳ͍จݴΛ͜͜ʹೖΕ͓͚ͯ͹ɺݕࡧͨ࣌͠ʹҾ͔͔ͬΔΑ͏ʹͳΔʣ attributeSet.keywords = movie.actorNames /* uniqueIdentifier͸AppDelegateͰऔΓग़͢͜ͱ͕Ͱ͖ΔͷͰɺ Spotlightݕࡧܦ༝ͰΞϓϦΛ։͍ͨ࣌ͷͨΊͷURLεΩʔϜΛೖΕ͓ͯ͘ */ let item = CSSearchableItem( uniqueIdentifier: "my-app://open/movie?id=\(movie.id)", domainIdentifier: "my-app", attributeSet: attributeSet ) CSSearchableIndex.default().indexSearchableItems([item], completionHandler: nil) } }

Slide 14

Slide 14 text

15

Slide 15

Slide 15 text

16

Slide 16

Slide 16 text

ͨͬͨ͜Ε͚ͩͷίʔυͰදࣔͰ͖Δʂ 17

Slide 17

Slide 17 text

18 import CoreSpotlight extension AppDelegate { func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { // SpotlightͰ։͔Ε͔ͨͲ͏͔ΛνΣοΫ͢Δ switch userActivity.activityType { case CSSearchableItemActionType: return self.openApplicationFromSpotlight(userActivity) default: return false } } private func openApplicationFromSpotlight(_ userActivity: NSUserActivity) -> Bool { // userActivity͔ΒURLεΩʔϜΛऔಘ͢Δ guard let urlScheme = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String else { return false } // URLεΩʔϜΛ։͍ͨ࣌ͷॲཧΛ࣮૷͢Δ return true } }

Slide 18

Slide 18 text

࣮ࡍʹͱ͋ΔΞϓϦͰೖΕͯΈͨ 19

Slide 19

Slide 19 text

શવ࢖ΘΕͯͳ͍ 21

Slide 20

Slide 20 text

ͦΜͳʹ൵؍తʹͳΔ͜ͱͰ΋ͳ͍ 22

Slide 21

Slide 21 text

͜͏ࢥͬͨ 27 • ͦ΋ͦ΋ͦΜͳʹ࢖ΘΕΔͱࢥͬͯͳ͍ • ίϯςϯπϏδωε(ອը)ΛߦͬͯΔ • ڝ߹ΞϓϦ͕ͻ͠Ί͖߹ͬͯΔ • Spotlightݕࡧʹ࡞඼໊Λೖྗ͢ΔϢʔβʔ͸ɺ೤ྔ͕ߴ͍͸ͣ • ͦ͏͍ͬͨϢʔβʔ͕ΞϓϦΛ։͖͔͚ͬ͘Λ࡞Δ͜ͱ͕Ͱ͖Δ

Slide 22

Slide 22 text

·ͱΊ • Spotlightݕࡧ͸͔ͳΓ؆୯ʹ࣮૷Ͱ͖Δ • ͦΜͳʹେྔʹ࢖ΘΕΔػೳͱ͍͏Θ͚Ͱ͸ແ͍ • SpotlightݕࡧʹίϯςϯπΛද͓ࣔͤͯ͘͜͞ͱʹҙຯ͕͋Δ • ࣮૷ʹؔͯ͠͸Qiitaʹৄ͘͠ॻ͍ͨ 31

Slide 23

Slide 23 text

32

Slide 24

Slide 24 text

Qiitaͱ͍͑͹ɾɾɾ 33

Slide 25

Slide 25 text

and factory Advent Calendar 2019 34

Slide 26

Slide 26 text

35

Slide 27

Slide 27 text

͓ΘΓ 36