見出し画像

iOSエンジニアがAndroidアプリをリリースするまで8 〜ウィジェット①〜

我が編み物カウンターの大きな特徴、ウィジェットです。

iOSで編み物カウンターを作ったきっかけが、「アプリを立ち上げなくてもウィジェットで操作できたら便利じゃん」というところでした。

全ての機能をウィジェットで実現するわけではありませんが、一番メインとなる「カウントアップ」だけでもあれば、大変便利ではなかろうかと。

はい、便利なんです。かなり。

Android版編み物カウンターでも当然やります、ウィジェット。

AndroidのウィジェットとiOSのウィジェット

一言で「ウィジェット」と言っても、AndroidとiOSではいろいろなところが違いました。
簡単に列挙すると

1.アプリ本体とウィジェットのコードの共通化
2.配置できるウィジェットの数
3.ウィジェットを配置できる場所
4.アプリ本体とウィジェットのデータの共通化
5.ウィジェットの大きさの変更
6.設定画面

アプリ本体とウィジェットのコードの共通化

アプリ本体とウィジェットの共通処理について、Androidは特に気にする必要がないが、iOSはEmbed Frameworkとする必要があります。

Androidはアプリ本体もウィジェットも同じパッケージ内で作成できます。

対してiOSは、アプリ本体とウィジェットは別ターゲットとなり、それぞれのコードは共有できません。
iOSでアプリ本体とウィジェットの共通処理を持ちたい場合は、Embed Frameworkとして外出しして、それぞれから参照することになります。

ここはセキュリティの厳しいiOSの特徴が出たところでしょうか。

アプリ本体とウィジェットをそれぞれサンドボックス化し、コードの不要な共有を避けようというものでしょうか。

Embedded Frameworkを使用した、コードの共通化はこちらをご参照ください。

Swift Embedded Framework の導入

Androidは複数のウィジェットを配置できるが、iOSは一つだけ

Androidは複数のウィジェットを配置できるが、iOSは一つだけです。

これもAndroidの柔軟性がよく出た特徴ではないでしょうか。

Androidは複数のウィジェットを配置できるんですね。
今回実装して初めて知りました。

ウィジェットを配置できる場所

Androidはホーム画面のいろいろな場所に配置できるが、iOSは決められた位置のみ(他のウィジェットと上下の位置関係のみ変えられる)。

iOSはホーム画面を右スワイプしたときに表示されるウィジェット群にしか配置できません。

iOS14からはホーム画面に配置できるようですが、iOS13まではウィジェットを配置できる画面が決められています。

アプリ本体とウィジェットのデータの共通化

アプリ本体とウィジェットで使うデータはAndroidは共有できますが、iOSはApp Groupという仕組みを使わないと共有できません。

Androidは一つのアプリ内でアプリ本体もウィジェットも作るイメージですが、iOSでは広義のアプリの中に狭義のアプリ(アプリ本体)とウィジェットがあり、それぞれ独立しています。
そのままではデータの共有かはできません。

そこで、App Groupというものを使います。
Xcodeでは設定できず、Apple DeveloperのCertificates, Identifiers & Profilesのページで設定することができます。

詳しくは以前私がQiitaに投稿したこちらの記事をご覧ください。

【Swift】Realmでウィジェットとアプリ本体でデータを共有する

ウィジェットの大きさの変更

Androidはユーザーが大きさを変えられますが、iOSはできません。

Androidはウィジェットを設置するときでも、設置した後でも変更できます。
ウィジェットを実装する際に、min sizeを設定します。
また、ウィジェットサイズを可変とするかどうかを設定します。
サイズの可変について、設定できる内容は
・横幅のみ変更可
・縦幅のみ変更可
・縦横変更可
・変更不可
の4つです。柔軟!

iOSについては横幅は固定、縦幅はCompactとExpandの2種類です。
iOS14からiOSのウィジェットもだいぶ柔軟になりそうですね。

設定画面

Androidのウィジェットを実装してみて、これが一番驚きました。

ウィジェットへの設定内容をユーザーが設定できる。
しかも、ウィジェット配置時に。

iOSでは、複数のカウンターを作成したときに、どのカウンターをウィジェットに表示させるかは、アプリ本体で設定させました。
というのも、iOSではウィジェットで何を表示するかをウィジェット表示時に設定できないからです。

対してAndroid。
ウィジェットの位置を決めた後に表示されるのが、ウィジェットの設定画面。
こちらも開発者が実装するものですが、ウィジェットを表示するにあたっての設定をここでできるんですね。
Android版編み物カウンターはこのウィジェットの設定画面でカウンターの一覧を表示して、どのカウンターをウィジェットに表示するかを設定できるようにしました。


AndroidとiOS差異を挙げただけでも結構な量になってしまいました。
実際にウィジェットを実装したときの記事は次回。

参考ページ

Swift Embedded Framework の導入
【Swift】Realmでウィジェットとアプリ本体でデータを共有する

この記事が気に入ったらサポートをしてみませんか?