RabbitBox v1.9.0 - v1.12.0 の更新内容

アプリの方はちょこちょこ更新していたのですが、エルデの王を目指すのに忙しくこちらを更新できていませんでした。

新機能の紹介を中心にまとめて更新内容を紹介していこうと思います。

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

一部Plus機能の体験機能

一部のPlus機能を1日3回まで使用できるようになりました。

Plus機能を実装しても誰にも利用されない🥲ので開発モチベーション維持も兼ねて実装してみました。 回数や対象機能の範囲は調整していこうと思っています。

画像比較機能(Plusのみ)

類似画像を比較する機能を追加しました。

この機能では複数の画像を素早く切り替えながらチェックできます。 削除、グループマークを設定してからApplyボタンをタップすることでそれぞれの処理を適用できます。

ダウンロード済みアイコン(Plusのみ)

ImageBox内に存在する画像ファイルがダウンロード候補にある場合、アイコンが表示されます。

タグのコピー&ペースト機能

画像に付与されている全てのタグをクリップボードへコピーします。 コピーしたタグは他の画像へペーストできます。

タグ一覧のキーワードフィルタ機能

タグ一覧をキーワードでフィルタできるようになりました。

Downloadタグ内の子タグが増えてきた際などに文字列で表示を絞り込めます。

その他の機能追加および変更

  • ImageBox一覧を並べ替えられるようになりました
    • ロングタップで自由に移動させられます
  • Webブラウザが前回表示していたURLを記憶するようになりました
    • ImageBoxごとに記憶します
  • iPhoneなどスクリーンの小さいデバイス上において、ダウンロード候補一覧サムネイルのサイズを小さくしました
  • 親タグ変更ボタンをタグ情報の編集フォーム内へ移動させました

不具合修正

  • イメージ検索機能適用中にタグ編集などが正しく行えない不具合を修正しました
  • 親タグ変更ボタンが正しく機能しない不具合を修正しました
  • カラムレイアウト時のイメージ一覧表示時に先頭の画像が表示されない不具合を修正しました
  • iPhoneなどを横向きで撮影した画像が正しい向きで表示されない不具合を修正しました
  • その他、クラッシュや小さな不具合を修正しています

今後の開発予定

使い勝手の改善を中心に今後も開発を続けていく予定です。 また、現在問題なのがiPhone環境での使い勝手で、改善が必要と考えています。

RabbitBoxはiPad用アプリとして開発しており、おまけ程度にiPhone対応も行っています。このため、お世辞にも使い勝手が良いとは言えないのですが、実情はiPhoneでのダウンロードが8割程度となっており、残念ながらほとんどのユーザにおまけ程度で対応しているUIで使用されているようです。 あくまでiPadをメインターゲットにしますが、iPhoneでのUI改善も注力していく予定です。

RabbitBox v1.7.0 & v1.8.0

アプリをバージョンアップしたら記事にしようと思ってたんですが、v1.7.0は書いてませんでした。

ということでまとめて更新内容を紹介していこうと思います。

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

ランダムソート機能

イメージ一覧時のソートにランダムを追加しました。 選択するとランダムソートします。

f:id:usagin-box:20220222084819j:plain

ストレージ使用量の確認機能

設定画面からストレージの使用状況を確認できるようになりました。

f:id:usagin-box:20220222084828j:plain

Total Image Sizeは管理している全画像ファイルの合計サイズです。

DB Sizeは内部で使用しているデータベースのサイズです。 タグやイメージの検索情報を格納しています。 どちらかといえばデバッグ向け機能で通常は見てもあんまり意味ありません。

また、キャッシュは次の2種類が表示されています。

  • Thumbnail Cache
    • 画像やタグ一覧などに使用されているサムネイル画像です。
  • Download Cache
    • Webページの画像を一覧表示するために一時的に保存している画像です。
    • アプリ起動時に自動削除されます。

タグ編集機能の改善

タグの編集機能を使いやすくしました。タグの候補表示が見づらかったりしていたのですが、見た目を調整しています。

また、詳細パネルから直接タグを編集できるようになりました。

f:id:usagin-box:20220222084836j:plain

イメージ再圧縮機能(サブスクリプションのみ)

イメージの再圧縮機能を追加しました。 これは管理しているイメージをJPEG形式で再圧縮し、使用容量を削減する機能です。 現状それほど高機能ではありませんが、高画質PNGなどをシンプルにJPEG圧縮してファイルサイズを削減できます。

なお、再圧縮機能を使用するとオリジナルファイルは削除されます。このため、再圧縮した画像を元に戻すことはできません。

f:id:usagin-box:20220222084851j:plain

SwiftUIでタップがうまく反応しなかった話

RabbitBox v1.6.0で修正した不具合なのですが、Viewの一部がタップできない不具合がありました。この挙動が若干謎で同じViewでも内容によって発生したり発生しなかったり、またタップできない範囲が変わったりとよくわかりませんでした。

今回の記事ではその不具合の原因と修正方法について書きます。

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

発生していた不具合

下図のようにタグを一覧するビューで赤枠のように場所がなぜかタップしても反応しないという問題が発生していました。

f:id:usagin-box:20220206170052j:plain

このビューは次のようにHeaderViewとTagListViewをZStackで重ねて表示しています。 TagListViewをスクロールした際にHeaderを上に隠す機能を実装するため、このような構造になっています。

f:id:usagin-box:20220207021857p:plain

原因

原因はHaderViewに表示しているImageがタップイベントを奪っていたせいでした。 イメージとしては下図のように本来トリミングしているはずの見えないImageにタップ判定が残っていたため、その部分と重なっているTagアイテムがうまくタップできない状態です。

f:id:usagin-box:20220207022134p:plain

簡単なコードで表現すると次のような実装になります。GeometryReaderでViewのサイズを取得し、それに応じてImageをリサイズしています。

import SwiftUI

struct HeaderView: View {
    var body: some View {
        GeometryReader { gr in
            VStack {
                Image(systemName: "mic.square").resizable().aspectRatio(1, contentMode: .fill).frame(width: gr.size.width, height: 100).clipped()
                
                Text("Header Title")
            }
        }
    }
}

struct ContentView: View {

    var body: some View {
        ZStack {
            VStack {
                Spacer(minLength: 180)
                HStack {
                    Spacer()
                    Image(systemName: "hand.tap.fill").onTapGesture {
                        print("TAP!")
                    }
                    Spacer()
                }
            }
            
            VStack {
                HeaderView().frame(width: 400, height: 150).onTapGesture {
                    print("HEADER!!")
                }.background(.blue)
                Spacer()
            }
        }
    }
}

上記コードを実行すると次のような画面になります。

f:id:usagin-box:20220207022643p:plain

指のマークをタップすると"TAP!"と表示されることを期待しますが、実際には"HEADER!!"が表示されます。

解決方法

ほかにもっと良い解決方法がありそうな気がしますが、とりあえず単純にImageがタップイベントに反応しないようにする方法で解決しました。

具体的には次のようにHeaderView側のImageに allowsHitTesting(false) を追加します。

Image(systemName: "mic.square").resizable().aspectRatio(1, contentMode: .fill).frame(width: gr.size.width, height: 100).clipped().allowsHitTesting(false)

これにより、HeaderViewからはみ出しているImageがタップイベントを奪うことがなくなり見た目通りの反応になります。

clipped()でImage自体は切り取られているっぽいんですが、使い方が悪いんでしょうか?なんかモヤモヤしますがとりあえず現状で回避しています。

iOSのバージョンアップとかで挙動変わるかもしれませんし覚えておかないと……

RabbitBox v1.6.0 を配信しました。

RabbitBox v1.6.0の審査が完了して配信されていました🎉🎉🎉

なんか6分で審査終わったらしいです。

f:id:usagin-box:20220201023533p:plain

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

更新内容

基本的には細々とした使い勝手の改善をおこなっています。

まず一つ目にイメージ表示画面で詳細パネルの開閉状態を記憶するようになりました。 これによりイメージファイルの情報を素早く確認できるようになりました。

f:id:usagin-box:20220201024453j:plain

また、WebブラウザのURLバーに新ボタンを追加しました。 このボタンを押すとクリップボード中のURLを貼り付けて、そのページを表示します。

Macなんかを使っている方はユニバーサルクリップボードと組み合わせて、Macで見ているページのURLをコピー→RabbitBoxで保存という流れがシームレスに行えます。

f:id:usagin-box:20220201024526j:plain

最後にタグ付与時に最近使ったタグが表示されるようになりました。

f:id:usagin-box:20220201024900j:plain

この機能は実装ずみだったはずだったのですが、バグで動いていませんでした🥲

さいごに

このほかにも小さなバグ修正をおこなっています。 バグに関してはSwiftUIの謎挙動によるものもありましたので、今度記事にしようと思います。

続々・AdMobの広告が表示されない件

以前、AdMobの広告が配信されないという記事をかきましたが、本日配信されてましたー🎉 今回は何日間配信が続くかわかりませんが、様子を見ていこうと思います。

usagin-box.hatenablog.com

リクエスト数など

ということで直近30日間のリクエスト数など書き残しておこうと思います。

  • リクエスト数: 1360(30日間) ≒ 45(1日)
  • アクティブユーザ: おそらく4,5人程度(1日)

2週間ほどnendのメディエーション配信してたのでこちらがどのようにカウントされているかはよくわかんないです。クラッシュ問題があったのでとりあえず再配信の予定はないですが😑

AdMob AdaptiveBanner + nend + iPad = クラッシュ? - うさぎさんのブログ

そのほか

そういえば、関係あるかどうかはわからないですが、広告ユニットを分割しています。もともとは1つの広告ユニットを全てのViewに貼り付けていたのですが、「もしかするとよくないのでは?🤔」と思いViewごとに別の広告ユニットを配置しています。

AdMob AdaptiveBanner + nend + iPad = クラッシュ?

RabbitBox 1.6.0のリリース準備中です。 最終確認としてTestFlightのアプリをテストしていたのですが、謎のクラッシュが発生しました。

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

再現方法が見つからず……

使用中に突然落ちたり、アプリ起動すらしなくなるかと思いきや、普通に起動できるようになったり再現方法が今ひとつよくわかりませんでした。

さすがに原因不明のクラッシュはまずいのでApp審査の申請は取り下げしました😭

広告表示で落ちてる?

とりあえずきちんとデバッグしようと言うことでXcodeでログを確認しました。

f:id:usagin-box:20220129122113p:plain

NADViewとかいうので落ちてるっぽいですが、RabbitBoxで実装したコードじゃなさそうです。 ググったところnendの広告表示用のモジュールのようで、確かにAdMobのメディエーションで使用しています。

あれ?これ広告のせい?

とりあえずnendの配信を停止してお茶濁し……

なんか新バージョンの機能実装は終わっているのに広告バナーのデバッグのせいでリリースを遅らせるのもアホらしいので、とりあえずnendの配信をオフにしてリリースすることにしました。

とりあえず配信オフれば問題なさそうなので本格的な対応は後回しにしようと思います。AdMobが広告配信してくれればこんなこと起きないのに……😡

続・AdMobの広告が表示されない件

usagin-box.hatenablog.com

1月14日から制限されていたAdMobの広告制限が解除されましたー🎉🎉🎉

RabbitBox - 画像収集と整理アプリ

RabbitBox - 画像収集と整理アプリ

  • Yoshinobu Sugain
  • 写真/ビデオ
  • 無料
apps.apple.com

解除までの期間について

広告制限から1週間ちょいくらいで制限解除(配信されるとは言ってない)されたみたいです。 制限解除(配信されるとは言ってない)されるまで1月くらいかかることも考えていたので早々に解除(配信されるとは言ってない)されてよかったです。

……お察しの通り、ポリシーセンターでの制限はなくなりましたが、広告配信はされていません😇

ただ、数日前からAdMobのメディエーションなる機能を使って別の広告配信サービスの広告を配信してみていてこちらはちゃんと表示されているようです。(AdMobの配信制限中でも配信されていました)

現状について

とりあえずリクエスト数が安定していない説があっているとして、現状どのようなリクエスト数なのかメモしておきます。

  • リクエスト数: 377(過去7日間)≒ 54(1日平均)
  • ダウンロード累計:63
  • アクティブユーザ(1日): おそらく5,6人前後

AdMobからの広告はいつ配信されることやら……