×

Arshes v1.14.0 リリースノート

ベータテストへの参加はこちらから。

リリース内容

新機能

  • フォーカス機能
    • タップした場所にフォーカスを合わせることができる
  • エフェクトパラメータがメディアに保存されるようにした
    • メディア(写真や動画)を撮影したときにエフェクトの種類に加えてパラメータも一緒に保存される
    • メディアからカメラを起動する時に復元してくれる

機能改善

  • タブのUI調整
    • “Media”タブを”Gallery”タブにリネーム
    • “Library”タブのアイコンを変更

バグ修正

  • フィルター編集画面でアスペクト比を変更できない
    • 実装が漏れてたので修正した
  • カメラ画面のメディアのプレビューからカメラを起動できてしまう
    • カメラ画面が無限にスタックしていくので塞いだ
    • 次のバージョンで呼び出せるようにします

フォーカス機能

タップした場所をフォーカスする機能をようやく実装した。

Arshesではtouch uniformを使うことで、画面タップイベントをシェーダーで読むことができるため、フォーカスとタッチで操作が競合しないようにする必要がある。 悩ましいが、ひとまずカメラ画面の左端にフォーカスボタンを追加して、これを押すことでフォーカスモードのオンオフを切り替えられるようにした。

この機能は一般的なカメラでいうところのオートフォーカスに対応する。多くの場合はこれで十分だが、マニュアルフォーカスが欲しくなるようなケースも考えられるので、必要になったら別途追加するかも。

タブのUI調整

Before

After

まず、MediaタブをGallery タブにリネームした。Mediaタブはv1.13.0で追加されたのだが、v1.13.0のリリースノートに既に書いたように、Galleryの方がそれっぽい気がしたのでリネームした。ArshesではMedia = 写真 or 動画 なので間違いではないが、こっちの方が”一覧感”がでるように思う。

Arshes v1.13.0 リリースノート

Libraryタブのアイコンを books.vertical から square.3.layers.3d.down.right に変更した。 本のアイコンだと、なんだか微妙に”撮影した写真一覧” 感があり、Galleryへのミスリードになってしまう。

Libraryという名前の参考元であるSpotifyでは、抽象化されたCDラックみたいなアイコンが使われている。

これが結構いい感じなので、SF Symbolsの中でそれっぽいやつを探すと、四角が重なってるアイコンが15個もある。

なんとなくで square.3.layers.3d.down.right を採用した。

non-user visibleな変更

開発環境と本番環境を完全に分離した

Arshesはサーバーサイドはこういう感じになっている。

NeonにDBがあって、それと接続したHasura CloudがGraphQL APIサーバーとして動いている。 Hasuraでは足りない部分だけをやってる小さいサーバーがあり、それはCloud Runで動いている、という感じ。

環境の切り替えは、 DBはNeonのブランチで分離して、Hasuraは環境ごとに別プロジェクトにしていたが、GCPは1つのプロジェクトの中でサービスやバケットを別にしてやりくりしていた。Firebase周りはどうにもならんので、devとprodでFirebase Authが共有されていたりして大変うさんくさい。 クライアントの接続先(= Hasura Cloud)の切り替えはというと、Debugビルドかどうかで切り替えていて最悪である。

流石にうさんくさすぎるので重い腰を上げて、dev用のGCPのプロジェクトを作った。 GCPは元々Terraformで管理していたのでdev用のプロジェクトの作成と移行はシュッとできて、いい話である。

それからクライアントもdev版を作った。App Store Connect上ではアプリが2つあることになる。 見分けがつかないので、アイコンも別にした。いい感じ。

Firebase Analyticsを導入した

アプリの画面数が増えてきて、どの動線が便利なのかとか使われているのかなどを気にする必要がでてきた。 便利だと思っているものが使われていないなら、見え方を工夫するべきだし、逆に使われてなさそうなものは消したり優先度を下げたりするのが良い。

特に難しいことはなく、1つのクラスにイベントの情報を全部書いて .environment でUIに配って使う。 XcodeのPreviewで発火しないように、ログの送信部分だけ抽象化している。

final class ArshesAnalytics {
  private let logger: AnalyticsLogger

  init(logger: AnalyticsLogger) {
    self.logger = logger
  }

  /// エフェクト一覧からエフェクトを開いて CameraPlayer に遷移したとき。
  func openEffect(effectId: String, source: EffectOpenSource) {
    logger.log(
      name: "open_effect",
      parameters: ["effect_id": effectId, "source": source.rawValue])
  }
}

/// `open_effect` の入口。`source` パラメータの値になる。
enum EffectOpenSource: String {
  case home
  case libraryRecent = "library_recent"
  case libraryFavorites = "library_favorites"
  case libraryMyEffects = "library_my_effects"
  case favoriteList = "favorite_list"
  case myEffectList = "my_effect_list"
  case createMyEffects = "create_my_effects"
  case userPage = "user_page"
  case widget
}

Firebase AnalyticsはBigQueryにexportする機能があるので、BigQueryで中間テーブルを作ってLooker Studioでダッシュボードを作ることになりそう。

アナリティクスを導入する上で、App Store Connect上でのアプリのプライバシーの設定も更新した。

こんな感じになるはずだが、ストア公開前にもうちょいちゃんと調べた方がよさそう。 ストアに公開したとして、GDPRに対応するのか?みたいな話もある。 個人情報を取り扱うのは大変だが、やっていくしかない。

次やること

ストア公開の準備

ストア公開のblockerだった環境の分離が終わり、強制アップデート機能も実装したので、あとはメンテナンスモードを入れてしまえば、いよいよストアに出しても良いように思う。 何かあればメンテナンスに入ればいいし、古いクライアントについては強制アップデートで気にしないことにすればよい。 持続可能にするためのお金周りの話はユーザーが増えてから考えれば良い。

カメラ起動中にエフェクトを切り替えられるようにする

既に手元では動いていて、結構便利で良い感じ。 これくらい、さっさとやれと思われそうだが、歴史的経緯によって少し大変な作業であった。 というのも、カメラ画面は元々はシェーダー画面であり、パスで言えば/shaders/{shader_id}に対応する。 つまり、この画面を開く時にはシェーダー(= エフェクト)のIdは確定しているという前提で全てが作られている。 カメラ起動中にエフェクトを切り替えるということは、この辺の前提をひっくり返す必要があり、内部の設計を色々整理する必要があった。

カラーグレーディングの見直し

計算式がちょっと正しくないところがありそうなので調査している。 コンテンツに対する破壊的変更になり得るのでさっさとやった方が良い。

デバッグのついでに、ヒストグラム表示機能とかも入れる予定。

カメラ画面のUIの改修

エフェクトによってはtouchで画面のタップイベントを取得したり、microphoneでマイク入力を使ったりする。 こういうエフェクトの性質をゲームのステータスアイコンみたいな形で表示すると親切なように思う。

というか、もう少し自分好みのテンションがあがる画面にしたい。 先日のdraw(tokyo);で、やはりシステムっぽいHUDが好きだということを思い出したのであった。

これは昔のUIで、不便なんだけどエフェクトの名前がバーンと表示されていて、なんか雑誌の表紙感あって好き。 こういう感じになるかはわからんが、 全体的にAppleのHIG、SwiftUI、Liquid Glass などを気にし過ぎていたので、良いと思うものをちゃんと考えてちゃんと作るべきである。

モジュール機能粉砕

モジュール機能を実装したがちょっと早すぎた感じがするので、ストア公開前に一旦粉砕したい。 今は公式のモジュールだけだし、それもあんまり使われてなさそう。 古いコンテンツが壊れる可能性があるが、それについては頭を下げる。 今は数も多くないので、一旦こちらで手動で修正するとかでもよい。

Arshesでやりたいことを整理する

アプリで何ができるかではなく、アプリを通して何をやりたいのか、ということをちゃんと考えて言語化するべきなように思っている。 それはアプリ自体に対する意思決定にも反映されるべきだし、ユーザーに対してもちゃんと伝えるべきなように思う。

少しずつまとまってきつつあるが、もうすこし”願いの蒸留”が必要そう。

願いの蒸留

Continues

Continued by

References