【iOS】アプリのウィジェットを設置しているかどうかを知る方法

2023/04/01に公開

ユーザーがウィジェットを追加しているかどうかで、アプリ側の挙動を変更したいと思ったので調べました。

環境

  • Xcode 14.2
  • iOS 16.2

ユーザーのウィジェットに関する情報を取得する

getCurrentConfigurations

WidgetCentergetCurrentConfigurationsを使用することでアプリのウィジェットに関する情報を取得することが出来ます。

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を教えてもらった方の助けにこの記事がなればと思います。

lilossa-banner

参考

Discussion