3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterAdvent Calendar 2024

Day 23

Bluesky投稿専用クライアントをつくった

Last updated at Posted at 2024-12-22

今年、春に「SkyThrow」というソーシャルメディアBluesky(ブルースカイ)へ投稿するだけのクライアントアプリをつくりました。
マルチアカウントでハッシュタグを便利に投稿したいと作ったのですが、共有による他のSNS(主に𝕏)への投稿ができることからマルチポストにも活用してもらっています。

Blueskyクライアントを作るのに利用したpackageをpubspec.yamlから棚卸しします。

Bluesky公式クライアント

棚卸しといいつつFlutterのパッケージではありません、公式クライアントのリポジトリです。
Reactで作られています。
ドキュメントやリポジトリよりもこちらのコードで実装を確認することの方が多いです。
新しい機能も、こちらのコミット状況から予測することができます。

利用しているパッケージ

atproto / atproto_code / bluesky / bluesky_text

Shinya Katoさんがメンテされているatproto/bluesky Dartライブラリ。
ぶっちゃけこのライブラリがあったからこそ、慣れたFlutterでクライアントを作る気になれました(なかったら公式クライアント同様、知見がないReactで作らざるをえなかった or 作らなかった)

以下のBlueskyフルクライアントもこのライブラリを元に作られています。

flutter_localizations / intl

i18n、国際化対応。
日本語と英語だけ対応しました。訳は公式クライアントを踏襲しつつDeepLとかに頼っています。

go_router

ルーティングと画面遷移。機能は少ないので以下のツリーしかありません。

  • startup
  • root
  • signin
  • post
  • tags
  • taggroup
  • settings
    • linkcard
    • afterpost
    • theme

provider

状態管理。全体管理と各アカウントの2系統を管理。
最近はriverpodの方がよく使われると聞くので試してみようと思いつつまだ使ってみたことすらありません。

url_launcher

外部URLラウンチ、launchUrlStringだけ使ってます。

shared_preferences

設定の保存。
独自のサーバは立てておらずデバイスのローカルにしか保存されません。
BlueskyのAT ProtocolにはユーザのPDSに独自データを保存できるので、それに対応することを検討しています。

image_picker

画像・ビデオ選択、春に画像の選択枚数制限ができるようになりました。
既に選択している画像を渡したり、「❶、❷...」と番号付きの選択にしたいなと改造を検討しつつまだなにもやってません。

video_player

ビデオ再生パッケージ、プレビューのため。
なぜかWindowsだけ非対応です。

flutter_video_info

ビデオのアスペクト比取得のため。

mime

lookupMimeType、ファイルとバイナリのmimeタイプを取得。

image

投稿制限に収まるよう画像のリサイズ、jpeg再圧縮の処理。

flutter_native_splash

起動時のスプラッシュスクリーンを表示。

dart_jsonwebtoken

Blueskyのセッション管理、アクセストークンのデコード。

characters

UNICODEの文字列長や末尾、1文字削除等の文字列処理。

flutter_svg

BlueskyアイコンのSVGファイル表示。

emoji_picker_flutter

ブラウザ、デスクトップ版(未公開)でのemoji入力。

flutter_slidable

リストの左右スライドアクション機能。
動かない!? と思ったらメジャーアップデートで仕様が変わってマイグレートが必要だったり。

sealed_languages

言語選択メニューを作るため。

string_validator

文字列のURL判定、…にしか使ってません。
Uri.tryParseでもいいのではとも。

collection

Listの便利コレクション。確認したら以下の4つを利用していました。

  • lastWhereOrNull
  • firstWhereOrNull
  • compareAsciiUpperCaseNatural
  • slices

package_info_plus

アプリ名、バージョン、ビルド番号を取得。

share_plus

投稿内容(テキストと画像、ビデオ)を他のアプリへ共有。
共有できたら便利かなと対応したところ、𝕏アプリがきっちり共有の受け取りに対応していました。そのため冒頭に書いたように、マルチポストに有効だと使ってくれている方が多いです。

app_settings

OSのアプリ設定画面(SkyThrowの場合は写真アクセス許可)を開きます。

flutter_settings_ui

設定メニューを簡易に構築することができます。

in_app_review

OS各ストアのアプリレビューを表示してくれます。

quick_actions

アプリアイコン長押しメニュー(iOSのクイックアクション、Androidのアプリショートカット)への対応。
「投稿」ができるように登録してます。

croppy

画像クリッピングパッケージ。
切り抜くだけではなく拡大縮小、回転、傾きとかなり高機能です。
ただHeroアニメーションへの対応がうまくいかず、フォークして修正した上で利用しています。

http

OGP対応でウェブページ読み込みのため。

metadata_fetch_plus

OGP対応でHTMLのMETAデータを取得。
JSON-LDへの対応が甘かったのでフォークして修正した上で利用しています。

flutter_charset_detector

UNICODE以外の文字コードから自動で変換してくれます。
OGP対応でUTF8以外の文字コードのサイトへ対応するため。

receive_sharing_intent

他のアプリからの共有を受けるために利用。
特にiOSでは手順がいくつかあったりバージョンアップで仕様が変わることがありました。

keep_keyboard_popup_menu

ソフトウェアキーボードを出しつつポップアップメニューを表示するため。
最新のFlutterでは動かず、既にアップデートもされていませんが、フォークして動くように修正して利用しています。

super_clipboard

テキスト以外、特に画像のクリップボードからのペーストに対応するため。

flex_color_picker

アカウントごとのテーマカラーを選択するため。

kana_kit

日本語の判定と変換。
ハッシュタグはひらがな・カタカナをローマ字に変換して検索するようにしてます。

pretty_qr_code

QRコード生成モジュール。
アカウントのプロフィールへのQRコードを生成しています。

気になっているパッケージ

flutter_image_compress

画像のリサイズ、圧縮ライブラリ。
標準のImageでも機能は事足りるのですが、より効率的だと謳ってます。
あと、いま共有するのに画像をそのままshare_plusに渡しているので、最低限必要なサイズに落とした方がいいかなとも考えてます。

appinio_social_share

各サービスSDKベースの共有ライブラリ。
Facebook、Instagram等、OSの共有では思ったように画像が渡らないアプリへの共有に使えないかなと。

あとがき

しかしフルクライアントを作られている方が日本でも何人もいるのですが、投稿のみのクライアントだけで作るのも仕様を追うのも大変なのに、フルクライアントなんてその比じゃないはず。
かつてTwitter向けのクライアントを作られていた方々もそうですけど、改めてみんな凄いなと感心しました。

そしてもうひとつ、Flutterで作ったBlueskyアプリを紹介しておきます。

bskylog

冬コミの同人誌を書くのに、Blueskyへの過去の投稿をtwilogのようにログ検索したいと作ったFlutter製デスクトップアプリ(macOS、Windows)です。
11月頭から作り始めて月末に公開しました。
twilogと違いサーバに溜めるのではなくローカルのSQLite(driftを利用)に保存、検索するつくりになってます。

macOS版のFlutter、テキストフィールドでの日本語変換が二重に入力されたり不具合があります。
同様の不具合は、iOSでATOKから日本語を入力すると確認出来るのですが、こちらはATOK側の設定で回避可能です。
修正される気配もないので、Flutterのエンジンを追って調査しないと…と考えているのですがなかなか時間が取れません。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?