Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20211015 Mac CatalystでmacOS用アプリを作る
Search
Kei Ito
October 15, 2021
Programming
4.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20211015 Mac CatalystでmacOS用アプリを作る
Kei Ito
October 15, 2021
More Decks by Kei Ito
See All by Kei Ito
20210219 Flutterに入門してみた
itok
1
4.1k
20201009 iOS 14 ウィジェットをつくってみた
itok
1
2.5k
20191206 Property Wrappers 入門
itok
0
1.7k
20190920 iOS 13 対応ではまった話
itok
1
2.5k
20190726 Background App Refresh Taskがやってきた
itok
0
2.4k
20190722 Firebase Remote Configでアドネットワークを管理する
itok
0
1.7k
20190419 iOSアプリで証明書の情報を参照する
itok
0
1.6k
20190412 Android TV向けアプリを作ってみる
itok
0
1.1k
20190215 iOS/Androidでドキュメントスキャナーを作ってみた
itok
0
1.8k
Other Decks in Programming
See All in Programming
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
320
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
140
AIエージェント時代のコードレビューを設計する
nogu66
6
2.5k
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
210
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
130
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
高専キャリア LT 発表内容
crysta1221
6
5.6k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
140
業務時間外もAIに働いてもらう話
colorful12
3
10k
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
870
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Accessibility Awareness
sabderemane
1
200
Documentation Writing (for coders)
carmenintech
77
5.5k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
330
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
450
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Evolving SEO for Evolving Search Engines
ryanjones
0
280
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
Transcript
.BD$BUBMZTUͰ NBD04༻ΞϓϦΛ࡞Δ .PCJMF"DU0/-*/& JUPL!ͦΒ͔ͥ
JUPL!ͦΒ͔ͥ w ͍ͱ͏͚͍ʢJUPLʣ w ɹɹɹɹɹɹͷதͷਓ w ϞόΠϧΞϓϦΤϯδχΞ݉$&0 w ෭ۀͰϑϦʔϥϯεత w
IUUQTJUPLKQ IUUQTTPSBLB[FDPKQ !JUPLKQ
ॴࡏɿژࢢதژ۠ ࣾһਓࣗ
࣮ डୗ ࣗࣾ
J04"OESPJENBD048JOEPXTαʔό ҰਓͰͬͯ·͢ʢσβΠϯҎ֎ʣ
.BD$BUBMZTUͱ
J1BEΞϓϦΛNBD04্Ͱಈ͔͢Έ 6*,JUΛNBD04্Ͱಈ͔͢Έ
6*,JU "QQ,JU NBD04 J04 J1BE04 XBUDI04 UW04 6*ͷϑϨʔϜϫʔΫผ
J1BEΞϓϦΛNBD04Ͱಈ͔͢ w "QQMF4JMJDPO.BDݶఆ Ұ෦ͷϢʔβͷΈɺJ1BEΞϓϦͱ·ͬͨ͘ಉ͡ w 4XJGU6*Ͱڞ௨Խ ৽ن࡞ʢPSϑϧεΫϥονʣ w
.BD$BUBMZTU طଘͷϦιʔεΛ༗ޮ׆༻ʁ
ͨͱ͑
J04J1BE04ΞϓϦ
NBD04Ͱಈ͔͢ ։ൃத
.BD$BUBMZTUͷߏ
$BUBMZTUͷߏ "QQ,JU NBD04 6*,JU ɿΠϝʔδ ࣮ͱͯ͠6*,JUଆ͕ϝΠϯ "QQ,JUͷΨϫΛ͔Ϳͬͯಈ͍͍ͯΔ
Ϋϥεؒͷؔ "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF 6*8JOEPX
Ϋϥεؒͷؔ "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF 6*8JOEPX
͓͕͍ͨͷ͜ͱ ͍ؔͯ͠ͳ͍
࣮ࡍʹͬͯΈΔ
͡Ί͔ͨ
খωλू
.VMUJQMFXJOEPXT 8JOEPXΛด͡ΔͱΞϓϦऴྃ͢Δ ऴྃͤͨ͘͞ͳ͍߹NVMUJQMFXJOEPXTʹରԠ͢Δ ˠ6*4DFOF6*4DFOF%FMFHBUF
.VMUJQMFXJOEPXT ։ൃத
6*ύʔπ 6*4XJUDIUJUMF #JH4VSҎ߱
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
৭ IUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFT NBDDBUBMZTUPWFSWJFXWJTVBMEFTJHO J1BE04 NBD04
"QQ,JU͞ΘΓ͍ͨ
"QQ,JUͷԸܙ
#VOEMFܦ༝Ͱ "QQ,JUʹΞΫηε "QQ,JU NBD04 6*,JU 6*7JFX$POUSPMMFS /48JOEPX /4"QQMJDBUJPO 6*"QQMJDBUJPO 6*4DFOF
6*8JOEPX #VOEMF
#VOEMFͷߏ "QQ,JU NBD04 6*,JU 7JFX$POUSPMMFS #VOEMF "QQ,JU1MVHJO 1MVHJOQSPUPDPM
#VOEMF࡞
1MVHJOTXJGU import Foundation @objc(Plugin) protocol Plugin: NSObjectProtocol { init() func
doSomethingWithAppKit() } 6*,JUଆʹݟͤΔQSPUPDPMΛఆٛ
"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Λ࣮ͬͨ
*OGPQMJTU <key>NSPrincipalClass</key> <string>AppKitPlugin</string> Ϋϥε໊ΛӅ͍ ʢ6*,JUଆ͔Β۩ΫϥεΛΔඞཁ͕ͳ͘ͳΔʣ
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() } }
·ͱΊ w .BD$BUBMZTU w NBD04༻ΞϓϦΛ࡞ΔબࢶͷҰͭͱͯ͠ w طଘϦιʔεΛ׆༻ͭͭ͠ ɹɹɹɹɹɹɹɹNBD04Ͱಉ͡ϢʔβମݧΛ w 8JEHFUΛͬͯ͘Β͏ͨΊʹศར͔
w J1BEΞϓϦͷҠ২Λݕ౼ͯ͠Έͯʁ