Slide 1

Slide 1 text

.BD$BUBMZTUͰ NBD04༻ΞϓϦΛ࡞Δ .PCJMF"DU0/-*/& JUPL!ͦΒ͔ͥ

Slide 2

Slide 2 text

JUPL!ͦΒ͔ͥ w ͍ͱ͏͚͍ʢJUPLʣ w ɹɹɹɹɹɹͷதͷਓ w ϞόΠϧΞϓϦΤϯδχΞ݉$&0 w ෭ۀͰϑϦʔϥϯεత w IUUQTJUPLKQ IUUQTTPSBLB[FDPKQ !JUPLKQ

Slide 3

Slide 3 text

ॴࡏ஍ɿژ౎ࢢதژ۠ ࣾһਓࣗ෼

Slide 4

Slide 4 text

࣮੷ डୗ ࣗࣾ

Slide 5

Slide 5 text

J04"OESPJENBD048JOEPXTαʔό ҰਓͰ΍ͬͯ·͢ʢσβΠϯҎ֎ʣ

Slide 6

Slide 6 text

.BD$BUBMZTUͱ͸

Slide 7

Slide 7 text

J1BEΞϓϦΛNBD04্Ͱಈ͔͢࢓૊Έ 6*,JUΛNBD04্Ͱಈ͔͢࢓૊Έ

Slide 8

Slide 8 text

6*,JU "QQ,JU NBD04 J04 J1BE04 XBUDI04 UW04 6*ͷϑϨʔϜϫʔΫ͸ผ෺

Slide 9

Slide 9 text

J1BEΞϓϦΛNBD04Ͱಈ͔͢ w "QQMF4JMJDPO੡.BDݶఆ ‎ Ұ෦ͷϢʔβͷΈɺJ1BEΞϓϦͱ·ͬͨ͘ಉ͡ w 4XJGU6*Ͱڞ௨Խ ‎ ৽ن࡞੒ʢPSϑϧεΫϥονʣ w .BD$BUBMZTU ‎ طଘͷϦιʔεΛ༗ޮ׆༻ʁ

Slide 10

Slide 10 text

ͨͱ͑͹

Slide 11

Slide 11 text

J04J1BE04ΞϓϦ

Slide 12

Slide 12 text

NBD04Ͱಈ͔͢ ։ൃத

Slide 13

Slide 13 text

.BD$BUBMZTUͷߏ଄

Slide 14

Slide 14 text

$BUBMZTUͷߏ଄ "QQ,JU NBD04 6*,JU ஫ɿΠϝʔδ ࣮૷ͱͯ͠͸6*,JUଆ͕ϝΠϯ "QQ,JUͷΨϫΛ͔Ϳͬͯಈ͍͍ͯΔ

Slide 15

Slide 15 text

Ϋϥεؒͷؔ܎ "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF 6*8JOEPX

Slide 16

Slide 16 text

Ϋϥεؒͷؔ܎ "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF 6*8JOEPX ͓͕͍ͨͷ͜ͱ͸ ؔ஌͍ͯ͠ͳ͍

Slide 17

Slide 17 text

࣮ࡍʹ΍ͬͯΈΔ

Slide 18

Slide 18 text

͸͡Ί͔ͨ

Slide 19

Slide 19 text

খωλू

Slide 20

Slide 20 text

.VMUJQMFXJOEPXT 8JOEPXΛด͡ΔͱΞϓϦ͸ऴྃ͢Δ ऴྃͤͨ͘͞ͳ͍৔߹͸NVMUJQMFXJOEPXTʹରԠ͢Δ ˠ6*4DFOF6*4DFOF%FMFHBUF

Slide 21

Slide 21 text

.VMUJQMFXJOEPXT ։ൃத

Slide 22

Slide 22 text

6*ύʔπ 6*4XJUDIUJUMF #JH4VSҎ߱

Slide 23

Slide 23 text

6*ύʔπ button.menu = UIMenu(title: "", options: .displayInline, children: [ UIAction(title: "item1", handler: { _ in }), UIAction(title: "item2", handler: { _ in }), UIAction(title: "item3", handler: { _ in }), UIAction(title: "item4", handler: { _ in }) ]) button.showsMenuAsPrimaryAction = true

Slide 24

Slide 24 text

৭ IUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFT NBDDBUBMZTUPWFSWJFXWJTVBMEFTJHO J1BE04 NBD04

Slide 25

Slide 25 text

"QQ,JU͞ΘΓ͍ͨ

Slide 26

Slide 26 text

"QQ,JUͷԸܙ

Slide 27

Slide 27 text

#VOEMFܦ༝Ͱ "QQ,JUʹΞΫηε "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF 6*8JOEPX #VOEMF

Slide 28

Slide 28 text

#VOEMFͷߏ੒ "QQ,JU NBD04 6*,JU 7JFX$POUSPMMFS #VOEMF "QQ,JU1MVHJO 1MVHJOQSPUPDPM

Slide 29

Slide 29 text

#VOEMF࡞੒

Slide 30

Slide 30 text

1MVHJOTXJGU import Foundation @objc(Plugin) protocol Plugin: NSObjectProtocol { init() func doSomethingWithAppKit() } 6*,JUଆʹݟͤΔQSPUPDPMΛఆٛ

Slide 31

Slide 31 text

"QQ1MVHJOTXJGU import AppKit class AppKitPlugin: NSObject, Plugin { required override init() { } func doSomethingWithAppKit() { let bar = NSStatusBar.system statusItem = bar.statusItem(withLength: 100) statusItem?.button?.title = "..." } } "QQ,JUΛ࢖࣮ͬͨ૷

Slide 32

Slide 32 text

*OGPQMJTU NSPrincipalClass AppKitPlugin Ϋϥε໊ΛӅ΃͍ ʢ6*,JUଆ͔Β۩৅ΫϥεΛ஌Δඞཁ͕ͳ͘ͳΔʣ

Slide 33

Slide 33 text

7JFX$POUSPMMFSTXJGU import UIKit class ViewController: UIViewController { func loadPlugin() { let bundleFileName = "AppKitPlugin.bundle" guard let bundleURL = Bundle.main.builtInPlugInsURL?.appendingPathComponent(bundleFileName), let bundle = Bundle(url: bundleURL) else { return } guard let pluginClass = bundle.principalClass as? Plugin.Type else { return } let plugin = pluginClass.init() plugin.doSomethingWithAppKit() } }

Slide 34

Slide 34 text

·ͱΊ w .BD$BUBMZTU w NBD04༻ΞϓϦΛ࡞Δબ୒ࢶͷҰͭͱͯ͠ w طଘϦιʔεΛ׆༻ͭͭ͠ ɹɹɹɹɹɹɹɹNBD04Ͱ΋ಉ͡ϢʔβମݧΛ w 8JEHFUΛ޿͘࢖ͬͯ΋Β͏ͨΊʹ͸ศར͔΋ w J1BEΞϓϦͷҠ২Λݕ౼ͯ͠Έͯ͸ʁ