20211015 Mac CatalystでmacOS用アプリを作る

5.8K Views

October 31, 22

スライド概要

profile-image

いとーけー@そらかぜ

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Mac Catalystで macOS用アプリを作る 2021.10.15 Mobile Act ONLINE #6 itok@そらかぜ

2.

itok@そらかぜ • • いとうけい(itok) の中の人 • モバイルアプリエンジニア 兼 CEO • 副業でフリーランス的 • https://itok.jp/, https://sorakaze.co.jp/, @itokjp

3.

所在地:京都市中京区 社員1人=自分

4.

実績 自社 受託

5.

iOS / Android / macOS / Windows / サーバ 一人でやってます(デザイン以外)

6.

Mac Catalystとは

7.

iPadアプリをmacOS上で動かす仕組み UIKitをmacOS上で動かす仕組み

8.

AppKit UIKit macOS iOS iPadOS watchOS tvOS UIのフレームワークは別物

9.

iPadアプリをmacOSで動かす • Apple Silicon製Mac限定 ➡ 一部のユーザのみ、iPadアプリとまったく同じ • SwiftUIで共通化 ➡ 新規作成(or • フルスクラッチ) Mac Catalyst ➡ 既存のリソースを有効活用?

10.

たとえば

11.

iOS / iPadOSアプリ

12.

macOSで動かす 開発中

13.

Mac Catalystの構造

14.

Catalystの構造 注:イメージ AppKit UIKit 実装としてはUIKit側がメイン AppKitのガワをかぶって動いている macOS

15.

クラス間の関係 UIKit AppKit UIApplication NSApplication UIScene NSWindow UIWindow UIViewController macOS

16.

クラス間の関係 UIKit AppKit UIApplication NSApplication UIScene NSWindow UIWindow UIViewController おたがいのことは 関知していない macOS

17.

実際にやってみる

18.

はじめかた

19.

小ネタ集

20.

Multiple windows Windowを閉じるとアプリは終了する 終了させたくない場合は multiple windowsに対応する →UIScene / UISceneDelegate

21.

Multiple windows 開発中

22.

UIパーツ UISwitch.title Big Sur以降

23.

UIパーツ 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

24.

色 iPadOS macOS https://developer.apple.com/design/human-interface-guidelines/ mac-catalyst/overview/visual-design/

25.

AppKitさわりたい

26.

AppKitの恩恵

27.

Bundle経由で AppKitにアクセス UIKit AppKit UIApplication NSApplication UIScene NSWindow UIWindow Bundle UIViewController macOS

28.

Bundleの構成 Plugin protocol AppKit UIKit Bundle ViewController AppKitPlugin macOS

29.

Bundle作成

30.

Plugin.swift import Foundation @objc(Plugin) protocol Plugin: NSObjectProtocol { init() func doSomethingWithAppKit() } UIKit側に見せるprotocolを定義

31.

AppPlugin.swift import AppKit class AppKitPlugin: NSObject, Plugin { required override init() { } func doSomethingWithAppKit() { let bar = NSStatusBar.system statusItem = bar.statusItem(withLength: 100) statusItem?.button?.title = "..." } } AppKitを使った実装

32.

Info.plist <key>NSPrincipalClass</key> <string>AppKitPlugin</string> クラス名を隠ぺい (UIKit側から具象クラスを知る必要がなくなる)

33.

ViewController.swift 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() } }

34.

まとめ • Mac Catalyst • macOS用アプリを作る選択肢の一つとして • 既存リソースを活用しつつ macOSでも同じユーザ体験を • • Widgetを広く使ってもらうためには便利かも iPadアプリの移植を検討してみては?