はじめに
メインアプリとウィジェットアプリで共通のViewを使用している時に、メインアプリで表示しているのかウィジェットで表示しているのかをView側で知りたいといった場面がありました。
公式からそのような機能は提供されてなく、どうにか実現できないかと考えた結果今回の方法に辿り着いたので記事にしておきます。
実装
import SwiftUI
struct IsWidgetEnvironmentKey: EnvironmentKey {
static var defaultValue: Bool {
Bundle.main.bundlePath.hasSuffix("appex")
}
}
extension EnvironmentValues {
var isWidget: Bool {
get { self[IsWidgetEnvironmentKey.self] }
set { self[IsWidgetEnvironmentKey.self] = newValue }
}
}
使い方
import SwiftUI
struct ContentView: View {
@Environment(\.isWidget) private var isWidget
var body: some View {
if isWidget {
Text("ウィジェットです")
} else {
Text("メインアプリです")
}
}
}
解説
Bundle.main.bundlePath
で判定しています。
メインアプリはターゲット名
+ .app
なのに対して、
ウィジェットはターゲット名
+ .appex
になっています。
これを利用して、ウィジェット判定を行うことにしました。
末尾の文字をhasSuffix
を用いて調べます。
おわり
この方法は公式が提案している方法ではないので、通知なく変更が入る可能性があります。