アプリのタイトルに☆を付けたらGoogle Playから削除されてしまった話

2023年1月15日

開発環境
OS:Windows 10
SDK:Android Studio Dolphin | 2021.3.1

一難去ってまた一難

ピートークという、Wi-Fi Directチャットアプリがポリシー違反と指摘され、

指摘から9日後の昨年12月30日に改修を行い、リリース。

改修方針は的を得ていたようでポリシー違反が解除されました!

と思ったのも束の間。

またしてもポリシー違反を指摘されてしまいました。。。

前回のポリシー違反、及び、対処方法は下記をご覧ください。

今回の指摘内容が以下。

メタデータポリシーに違反したとのこと。

そして、アプリステータスは、ストア削除。

なんということでしょう。。。

アプリタイトルに☆を付けてはいけない

メタデータポリシーとはなにか?

メール内のリンクを見るにユーザーに誤解を与えるようなテキストや画像に関する制限のようです。

そして、その制限の一つとして「絵文字、顔文字、特殊文字の使用」がありました。


前回のポリシー違反を修正する際にきまぐれにアプリタイトルを「ピートーク」から「ピー☆トーク」に変更したのがダメだったようです。

改修方針

アプリタイトル、及び、ストアのアプリ名から☆を削除します。

改修のその後

改修アプリをリリースした翌日にはポリシー違反は解除されていました。

今回のポリシー違反は明確でしたね。

今月のみてみて(2022年12月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2022年12月18日~2023年1月14日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

年末にメッセージ機能のUIを少し改良したもののそれほど効果はなかった模様。

いかにメッセージ機能を使ってもらうか、そこの焦点を当てて改善したほうがよさそう。

(インストールの上位国)

先月からの大きな変化は見られず。

2023年1月14日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

flutterでWeb版を作成してみました。

みてみてWeb

アプリの簡易版として利用予定でアプリと連携させてみたいと思っています。

まだまだ無料でやれそうです。

2022年12月15日~2023年1月14日のAdMob

今月はAdMob広告収入:179円、 Firebase使用料:0円となりました。

みてみての投稿を見てみて

(今月の投稿ピックアップ)

三方焼き。美味しいので食べて欲しい。

今後の改善案

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

先々月からの継続と

・Web版UI改善

を行う予定。

,

Pトーク、アプリ内エクスペリエンスに反するってよ

ポリシー違反にざわつく日曜日

久々にポリシー違反メールを受け取ってしまいました。

とは言うものの、

ポリシー違反を指摘をされたアプリの最終更新日は、2022年6月3日。

しばらく違反状態だったようです。。。

それはさておき、指摘内容は何かと言うとこちら。

ポリシー違反メール

そして、これが証拠画像だと添付されていた画像がこちらです。

添付画像を見ても違反らしいものは見えないのですが・・・

アプリ内エクスペリエンス

アプリ内エクスペリエンス、初めての指摘内容です。
(過去に指摘されたものは水平展開しているので同じ指摘をされると困るわけですが。。。

今回指摘されたアプリ内エクスペリエンスを解釈してみるに、

「ユーザー作成コンテンツ」の表示やアクセスができるアプリなのに

ユーザー作成コンテンツに関するポリシーが適用されていないよね?

ってことのようです。

Pトークとはざっくりと言えば、Wi-Fi Directを使ったチャットアプリです。

「アプリ内エクスペリエンス」を考慮しつつ、アプリを動かしてみると

確かに「データを相互に交換できること」に対する考慮が足りてないようです。

改修方針

ユーザー作成コンテンツに関するポリシーの遵守のため、

下記の対策をとります。

・アプリの利用規約の定義

・利用規約の同意画面を表示し、同意しない場合はアプリの使用を遮断する(←添付画像は今、これがないよねという指摘と捉えたが果たして。。。

それでは改修を行い、申請は通るのか。

結果が出たらまた記事にしようかと思います。

追記

ポリシー違反メール受信から5日後、Admob停止の通知がきました。。。

今月のみてみて(2022年11月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

はっ、としていたら、12月もなかばを過ぎてしまいました。。。

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2022年11月16日~12月17日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

先月少しインストール数が上向いたのもつかのま。

今月は手付かずです。

(インストールの上位国)

今月もフィリピンに支えられた形です。

残念ながら、トルコ、インドでは飛躍できず。

ここにきてサードパーティからの参照に伸びが。

12月17日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

あれ?1ヶ月前のデータを見ているのか?

いやいやそんなことはありません。

ダウンロードが10倍になっています。

2022年11月16日~12月17日のAdMob

今月はAdMob広告収入:186円、 Firebase使用料:0円となりました。

みてみての投稿を見てみて

(今月の投稿ピックアップ)

鶴橋での一食。美味しかったです。

今後の改善案

・UIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

先月から継続です。

,

今月のみてみて(2022年10月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

アプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2022年10月1日~11月02日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

先月のUI改善が功を奏したのか少し上向いてきました。

まだまだUI改善の余地はあるので早めに対処していきたい。

(インストールの上位国)

またわずかながらトルコで動きがありました。

そして、インドでもインストールされたようです。

インドはなんとかできないかと注目している国です。

11月3日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

よくよく見てください。

わずかながら使用されていますよ。

2022年10月1日~11月02日のAdMob

今月は、AdMob広告収入:167円、 Firebase使用料:0円となりました。

また少し盛り返したのでまだこれから。

みてみての投稿を見てみて

(今月の投稿ピックアップ)

最新の投稿は。。。テスト投稿ですね、これは。

今後の改善案

・UIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

開発が滞ってしまっているが、せっかく盛り返しているので注力したい。

,

APNsは正常に動作しているのか?

2022年10月17日

開発環境
OS:macOS Monterey
SDK:Xcode14.1

概要

プッシュ通知が実装されたandroidアプリとiosアプリ。

プッシュ通知の動作確認のため、androidとiphoneのデバイスでデバッグをするものの、

Firebase経由で発行したプッシュ通知がandroidには届くが、iosには届かない。

なぜiosに届かないのか調査します。

APNs

APNs(Apple Push Notification service)とは、アップルプッシュ通知サービスのこと。

プッシュ通知におけるandroidとiphoneの大きな違いはAPNsの存在。

androidの場合、Firebase → androidデバイスとプッシュ通知が配信されるのに対し、

iosの場合、Firebase → APNs → iPhoneデバイスとプッシュ通知が配信されます。

iPhoneにプッシュ通知が届かない。

しかし、Firebaseではプッシュ通知が配信されている。(androidは受信できているので)

それが確かであるなら、iphoneに届かない理由は、「APNsが正常に動作していない」からに絞られます。

そこでAPNsが正常に動作しているかどうかを確認します。

確認手段は、cURLコマンド。

curlコマンドでAPNsに直接、プッシュ通知依頼をかけ、iPhoneにプッシュ通知を配信できているかを確認します。

curlコマンド

まずはcurlコマンドを実行するためのバッチファイルを作成します。

#!/bin/bash

set -x

AUTH_KEY_FILE_PATH="xxxxxxxx.p8"
AUTH_KEY_ID="xxxxxxxx"
TEAM_ID="xxxxxxxxx"

APP_BUNDLE_INDENTIFER="com.sample.test"
DEVICE_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
API_ENDPOINT="https://api.development.push.apple.com/3/device/"

base64() {
   openssl base64 -e -A | tr -- '+/' '-_' | tr -d =
}

sign() {
   printf "$1"| openssl dgst -binary -sha256 -sign "${AUTH_KEY_FILE_PATH}" | base64
}

TIME=$(date +%s)
HEADER=$(printf '{ "alg": "ES256", "kid": "%s" }' "${AUTH_KEY_ID}" | base64)
CLAIMS=$(printf '{ "iss": "%s", "iat": %d }' "${TEAM_ID}" "${TIME}" | base64)
JWT="${HEADER}.${CLAIMS}.$(sign ${HEADER}.${CLAIMS})"

curl -v \
   -d '{"aps":{"alert":{"title":"Test","body":"Hello from request with P8 certificates"}}}' \
   -H "Content-Type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   -H "apns-topic: ${APP_BUNDLE_INDENTIFER}" \
   --http2 \
   ${API_ENDPOINT}${DEVICE_TOKEN}

上記内容を定義したcommandファイルを作成し、認証キー(p8ファイル)と同階層に配置します。

ちなみにバッチファイル内の可変項目は以下の5つ。

1)AUTH_KEY_FILE_PATH → Apple Developerで取得した認証キー(p8ファイル)名

2)AUTH_KEY_ID → Apple Developerで定義されたキーID

3)TEAM_ID → Apple Developerで定義されたチームID

4)APP_BUNDLE_INDENTIFER → アプリに定義したバンドルID

5)DEVICE_TOKEN → アプリから取得したAPNsデバイストークン

APNsデバイストークンはAPNsとの通信で取得するため、アプリでログ出力して取得します。

func application(_ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken

    let token = deviceToken.map { String(format: "02.2hhx", $0)}.joined()
    printf("apnsToken:%s\n",token)
}

いざ、実行

バッチファイルの準備が整ったら、実行します。

bash apns.command

そして、実行した結果が、

HTTP/2 400 BadDeviceToken

異常です。

デバイストークンが無効とのこと。

やはりAPNsが正常に動作していなかったようです。

Apple Developer再定義

Apple Developerの定義を見直します。

ここでApple Developerに詳しい方にヘルプ。

定義を確認したもらった結果、2点の間違いが発覚。

①デバッグ用デバイスの定義漏れ

②開発用定義になっていない。(Distoribution → Development)

改めて定義をしなおし、Provisioning Profileを読み直してリビルドします。

そして、再度、apns.commandを実行してみると、

結果は、HTTP/2 200となり、プッシュ通知が届きました。

実際にiPhoneによるデバッグでもプッシュ通知が届くことを確認。

なかなかにAppleの管理は厳密ですね。

ジェスチャーナビゲーションを一時的に無効化する

2022年10月14日

開発環境
OS:Windows 10
SDK:Android Studio Dolphin | 2021.3.1

概要

Android 10から実装されたジェスチャーナビゲーション。

この機能とDrawerLayoutとの相性が悪いので一時的に無効化します。

ジェスチャーナビゲーションを初めて知る

Android 13のサポート対応のため、伊勢125社巡りをデバッグしていたときのこと。

Android 13の仮想デバイスを用意し、マップ画面を確認していた際に違和感が。

マップ画面は、DrawerLayoutで構成しており、画面左右にNagivationViewをセット。

画面左端から右へスワイプ、または、画面右端から左へスワイプするとメニューが表示される作りになっています。

その想定で画面左端から右へスワイプした結果、画面左端に下記のような矢印(<)が表示されました。

そして、次の瞬間、マップ画面が閉じて、ホーム画面が表示されました。

えっ。。。

戸惑います。

もう1度、同じ操作をしてもやはりホーム画面に戻されます。

そこでネットで調べたところ、ジェスチャーナビゲーションが機能していたことが判明しました。

このとき、初めてジェスチャーナビゲーションの存在を知りました。。。

ジェスチャーナビゲーションを無効化する

このジェスチャーナビゲーション。

有効な状態だとマップ画面でスワイプ操作によるメニュー表示ができません。

そこで、マップ画面表示中だけ無効化するようにします。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_maps)


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val layoutMap = findViewById<DrawerLayout>(R.id.layout_map)
        val rect = Rect(0 , 100, 100, 200)
        layoutMap.systemGestureExclusionRects = listOf(rect)
    }

}

ロジックはいたって簡単。

マップ画面のDrawerLayoutでsystemGestureExclusionRectsをコールし、ジェスチャーを無効化するエリアを指定すればいいだけです。

(念のため、Android 10(APIレベル29)以降でのみ動作するようにしています。

そして、再度、デバッグしてみると。

画面左端から右スワイプするとメニューが表示されるようになりました。

ジェスチャーナビゲーション

設定画面の「システム」ー「ジェスチャー」ー「システムナビゲーション」から設定できます。

機能を有効化すると画面端あたりをスワイプすると戻る操作となるようです。

USBTypeC変換ハブを買う。そして、買いなおす。

2022年10月13日

開発環境
OS:macOS Monterey
SDK:Xcode14.1

概要

Mac Bookでの初めてのアプリ開発。

まずは最初にすること、それは、TypeC変換です。

USBTypeC変換ハブは必須

iPhoneアプリの開発依頼を受け、Mac Bookが家に届きました。

初めてのMac Book。

まず戸惑ったのが、

USBポートがTypeCしかない。

マウスにしろ、デバッグ用ケーブルにしろ、手持ちのデバイスは全てUSB TypeA。

Mac Bookにはそのまま使えないのか。。。

早速、近くの電気屋に行って、USB変換ハブを買いました。

まず手に取ったのがこちら。

Digio2 STIX(UH-C2482)シリーズ

購入価格(税込み)1233円

デザインはシンプルでスタイリッシュ、そのうえ、安い!

いい買い物したね、と思いながら、早速、使ったみたところ。。。

カッチカチ。

USBの挿し口がかなりきつく、差し込みにしろ、抜くにしろ、とてつもなく固い。

1度差してそのままずっと使うなら良いのですが、そうはいかない。

買いなおしです。。。

そして、次に買ったのがこちら。

ELECOM U3HC-A429Bシリーズ

購入価格(税込み)2545円

ケーブルの長さが微妙ですが、さすがELECOM。

USBの抜き差しは問題なし。

経験上、耐久性はあれですが、使いやすさは間違いないですね。

これでやっとアプリ開発が始められます。

今月のみてみて(2022年9月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

アプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2022年9月1日~9月30日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

ほぼ完全に動きが止まりました。。。

唯一の救いが獲得と減少の山がシンクロしていないという所ぐらい、か。

(インストールの上位国)

残念ながらトルコは伸びず。

フィリピンには足を向けて寝れないが、他の国にも波及して欲しい。

9月30日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

投稿情報を定期的に削除する仕様にしているので使用量が伸びません。
(良いことではない(´;ω;`)

2022年9月1日~9月30日のAdMob

今月は、AdMob広告収入:33円、 Firebase使用料:0円となりました。

低調です。

みてみての投稿を見てみて

(今月の投稿ピックアップ)

I 💛 Monster Hunter

今後の改善案

・UIブラッシュアップ

・フレンド共有機能追加

上記を進めつつ、ベースのシステムを固める予定。

再来月あたりでコンテンツ投入して動きを見れるようにした。

,

ファミリーポリシーを遵守すべきなのか、決断する

概要

アプリのターゲットユーザーを13歳未満とする場合に考慮すべきファミリーポリシー。
以前にもファミリーポリシーを遵守するために広告を制限するなどあれこれと試行錯誤してきましたが、ついに決断の時がきました。
ファミリーポリシーをこのまま遵守し続けるべきなのか?

以前に行った対策は以下。

リリース審査でリジェクトされる

ヒットアンドブローを題材にしたWi-Fi Directゲーム、サムライロード

アプリをAndroid13に対応させようと軽微な改修を行い、リリースしたところ、ファミリーポリシー違反によるリジェクトとなりました。

リジェクト理由として添付されていた画像は以下。

リジェクト理由としては「広告コンテンツがファミリーポリシーに反している」とのこと。

そして、そのポリシー違反の広告が「Pickaroo」というアプリの広告のようです。

では、「Pickroo」とはどんなアプリなのか?

ネットで調べてみると、日常用品のデリバリーサービスアプリでした。

ちなみにファミリーポリシーの規約に関するサイトに違反例として掲げられているのがこちら。

違反例を参考に判断すると、ポリシー違反ではないような気もします。。。

異議申し立てをすることでリジェクトを回避できるかもしれませんが、そもそもファミリーポリシーを遵守すべきなのだろうか?

13歳未満をターゲットにする意図

13歳未満をターゲットにしなければ、ファミリーポリシーの遵守は必要ありません。

では、なぜ13歳未満をターゲットに含めたのか?

それは、13歳未満を対象にすることでユーザー層を拡大したい、親子で楽しんでもらいたい、という思いがあったからです。

ですが、ここで改めて実際に13歳未満のユーザー数を調べてみます。

「android 世代別」で検索した結果、ヒットした記事を参考にすると、

Androidユーザー全体に対する10代男女の割合が、5.4%。

13歳未満に限るともっと少ないはずです(おそらく1%未満)。

つまり、ユーザー層の拡大に対する期待値は予想以上に低いという事実。

そして、その期待値の割に対し、広告の制約が大きいということ。

ターゲットユーザーを13歳以上とする

上記の理由から、サムライロードについては、13歳未満のユーザーに対するアプリの普及を断念することにしました。

それにより、以下の変更を実施。

・Google Play Consoleでターゲットユーザーを13歳以上に変更

・AdMobのアプリ設定から広告制限を撤廃

・アプリ内の広告リクエストからレーティング制御を削除

・アプリのタイトル変更(サムライロードからサムライキルに。敢えてキルと言う表現を避けていた)

変更後、リリースした結果、無事、リリース審査に合格しました。

総括

13歳未満のユーザーターゲットとAdMobの相性はやはり良くないですね。

広告収入を抜きにした目的(13歳未満のユーザーと親和性の高い商品展開をしていてサービスとしてアプリを提供するなど)がないと厳しいかなと感じました。

残念ですが、サムライロードは13歳未満のユーザーターゲットから撤退です。