【iOS】アプリのウィジェットを設置しているかどうかを知る方法
ユーザーがウィジェットを追加しているかどうかで、アプリ側の挙動を変更したいと思ったので調べました。
環境
- Xcode 14.2
- iOS 16.2
ユーザーのウィジェットに関する情報を取得する
getCurrentConfigurations
WidgetCenter
のgetCurrentConfigurations
を使用することでアプリのウィジェットに関する情報を取得することが出来ます。
func getCurrentConfigurations(_ completion: @escaping (Result<[WidgetInfo], Error>) -> Void)
成功すると、[WidgetInfo]
を受け取ることができます。
取得できる値の例としては、下記のようになっています。
[
WidgetInfo:
- configuration: nil
- family: systemMedium
- kind: SampleWidget
]
もし、ウィジェットをホーム画面上に設置していない場合は、[]
の配列が返ってくるので.isEmpty
でウィジェットを設置しているかどうかを判別出来ます。
実装例
今回はasync await
に対応したExtensionを作成してみました。
import WidgetKit
extension WidgetCenter {
func getInstalledWidgetInfo() async throws -> [WidgetInfo] {
try await withCheckedThrowingContinuation { continuation in
self.getCurrentConfigurations { result in
switch result {
case .success(let info):
continuation.resume(returning: info)
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
}
下記にように使用します。
.task {
do {
let info = try await WidgetCenter.shared.getInstalledWidgetInfo()
if info.isEmpty {
// ウィジェットを設置していない場合の処理
}
} catch {
// Do some error handling
}
}
複数のウィジェットがあり、特定のウィジェットの設置状況については、WidgetInfo
からkind
が取得できるのでその値でハンドリングすれば良さそうです。
おまけ
はじめはChatGPTに質問して回答をいただきました。
ChatGPTの回答
iOS 14以降では、WidgetKitフレームワークを使用して、ウィジェット情報を取得することができます。WidgetCenterオブジェクトを使用して、ウィジェットの登録状態を確認できます。具体的には、WidgetCenterオブジェクトのshared()メソッドを呼び出して、ウィジェット情報を取得し、登録状態を確認できます。
以下は、Swiftでのサンプルコードです。
import WidgetKit
// ウィジェットが登録されているかどうかを確認する
if #available(iOS 14.0, *) {
let widgets = WidgetCenter.shared.installedWidgets
for widget in widgets {
if widget.kind == "com.example.widget" {
// ウィジェットが登録されている
}
}
} else {
// iOS 14未満では、WidgetKitフレームワークが利用できない
}
上記のコードでは、WidgetCenterオブジェクトのinstalledWidgetsプロパティを使用して、登録されたウィジェット情報を取得し、kindプロパティを使用して、ウィジェットが特定の種類であるかどうかを確認しています。
結果
installedWidgets
というメソッドは存在しませんでした、、、。
おわりに
私と同じようにChatGPTからinstalledWidgets
を教えてもらった方の助けにこの記事がなればと思います。
Discussion