デベロッパーが最も怖れる最恐のリジェクト「4.2 Minimum Functionality」とは
アプリをiTunesConnectでAppStoreに申請し審査された時に、以下の様なリジェクションが出て不許可になることがあります。
4.2 minimum functionality We found that the usefulness of your app is limited by the minimal features it includes.
iOSアプリ開発申請に慣れたデベロッパーであれば一瞬で凍りつきます。なぜならこのリジェクトは他のリジェクトとは異なる最恐のRejection「4.2 Design: Minimum Functionality」だからです。
ここでは過去に3つのアプリでこのリジェクトを受け最終的に審査をパスした経験からこのリジェクションの恐ろしさと問題点を書こうと思います。
4.2 Design: Minimum Functionalityってなに?
これはなにか
一言で言うと「これはク○アプリですね」ということです。
AppStore側の立場から言えば、その様な陳腐なアプリが大量に登録されるということは検索ノイズが増え、全体の品質のブランディングにも影響するので、たしかにこのルールは間違いではありません。
しかし開発者はそのアプリに価値があり世の中の人に使ってもらいたいという思いがあるからこそ、AppStoreに申請しています。納得がいくわけがありません。
シンプルだからこそ使いやすいのはApple製品の価値そのものでありますし、アプリを使いはじめて数分の人に何がわかるんだという気分になります。
しかしそれがAppleの答えなのです。
なぜ恐ろしいのか
先が見えない
他のリジェクト理由はほぼ100%修正方法が明確になっていて、そのリジェクトに対策する工数が測れます。
例えば「アプリ名に余計な文字列が入っている」リジェクトが出たとすれば「アプリ名を改変する工数」として見積もり可能です。
「メタデータを変えてね」というリジェクトなら「メタデータを変更する工数」、「テストできないから動画送ってね」というリジェクトなら「動画を作成する工数」として大体把握できます。
「アイコンがXXと似ている」でも「XXと似ていないアイコンを作る工数」として把握出来ます。
その工数と審査が通る価値を天秤にかけて、意思決定が出来ます。
しかし、4.2リジェクトに関しては性質が全く異なります。
4.2リジェクトは「とにかく駄目、機能を増やすかコンセプトを変えて」というリジェクトです。
じゃあどう変えればいいの?変えた結果、ちゃんと審査が通るの?全く保証も情報もありません。
ここからコストを1千万かけようが1億かけようが、審査が通る保証は全くないのです。
レビュー担当の主観次第
他のリジェクト理由はGuidelineにはっきりと問題がそのルールに適合するかどうかが記載されています。
それに対して4.2を決めるのは「レビュー担当の主観」です。つまり悪く言えば「雰囲気で決めている」ということです。
道路の横の壁に落書きがあったとしましょう。それをみて「いい絵だ」「だめな絵だ」、感じ方は人それぞれです。100人いたら100人ともが「いい絵だ」と感じることも100人ともが「だめな絵だ」と感じることもありえません。それぞれの感じ方、さらには絵じゃなくて見ている人のその日の体調や気分によっても思いは変化します。
「Appleがそんな曖昧な仕組みを設けるわけがない」と思う人もいるでしょう。しかし、以下の2点がネット上で多数報告されている事実からこの審査が個人なりグループの主観に頼っているのは間違いないでしょう。
- 一度審査が通ったアプリがUI変更のないバージョンアップで4.2リジェクトされた
- BundleIDを変えて同じソースコードのビルドを出しなおしたら審査が通った
答えを教えてくれない
人工知能が発達したとは言え、アプリの価値を評価するのには完璧ではないでしょう。そこを人力の主観に頼るのは致し方ないことです。
しかし、ここが4.2リジェクトの更に恐ろしいところ。
「どうすればいいのかは絶対に教えてくれない」
そう、こちらがどんな質問をしようが先程の「とにかく駄目機能追加して」の定型文が機械的に送られて来るだけで、どうすればいいのかは全く教えてもらえない、というか人間の返事も送られてこないのです。
質問内容によらず、前回と全く同じ定型文が送られてくる、まるで壊れたロボットとやり取りしている様な気分になります。
いくら主張してもジャッジする人がいない
「そんなバカな、そんな失礼なことをするならその事を問題にすればいいではないか」と思われるでしょう。その答えは「誰に?」です。
後述しますが、レビューは一度担当が決まると、そのバージョンはずっとその担当が行います。いくらメッセージで主張しても、その担当しか見ないのですから、それを咎める人もいません。
誰も見ていないところで2人だけでフィギュアスケートで競っているのと同じです。ジャッジする人がいないので勝ち負けもあったものじゃありません。
シンプルじゃなくても適用される
「じゃあミニマムじゃないように機能増やせば?」となりますが、そうではありません。
Minimum Functionalityはあくまで章の名前で、その規定はどんなアプリにでも適用されます。
例えば「特定のインターネットサイトからの情報しか使っていない」リッチなアプリでも「Minimum Functionality」です。(It would be appropriate to ensure that your app has exclusive content related to your app which can not be easily viewed on the internet.)
正確には「担当の気分でいつでもMinimum Functionalityを適用することができる」となります。
だってAppStore上には特定のインターネットサイトからの情報しか使っていないアプリの方が多いのですから。
ンポイントで対処しても、何食わぬ顔でリジェクトテンプレートが変わります。その内容は「ネイティブ機能が弱い」などガイドラインのどこにも書いていない独自ルール。( Revise your app concept to provide a more robust user experience by including native iOS features and functionality. )
警察官が気に入らない容疑者を逮捕できる公務執行妨害と似ています。なんでもありのワイルドカード。それが4.2 Minimum Functionalityなのです。
バージョンアップでも関係なし
「このアプリは以前に審査に通ったから大丈夫」? 安心してはいけません。
全くUIを変えてない?いいえ、担当が変わります
レビューの仕組み
ここではAppStore/iTunesConnectのレビューの仕組みを書きます。あくまで経験的な想像ですが、正しい部分もあると思います。
一度リジェクターにアサインされたら外してもらえない
先程も書きましたが、あるバージョンを審査に出したら担当がアサインされます。バージョンアップの場合だからといって前回と同じ担当とは限りません。
担当は言語やジャンルなどによって専門があります。例えば日本語オンリーのアプリを申請にだしたら、かなり特定されたレビューエンジニアが担当になるでしょう。
しかも開発者からのチェンジはききません。リジェクトされる度に説明を申し送りするのは不効率なので当たり前といえば当たり前なのですが、、、
ちなみに審査側の事情で担当が変わる場合はあるようです。急に動画請求の傾向が変わったり、出ていなかったリジェクトが審査過程で新たに出る場合、担当が変わった時に再度イニシャルチェックをしている可能性が高いです。
そして、運悪く「リジェクター」が担当についた場合、今まで出ていなかった4.2 Minimum Functionalityが出ます。それはリジェクト地獄の開始の合図です。
電話がかかってくる
リジェクトを繰り返すとアメリカの担当から電話がかかってきます。日本への電話の場合は日本語を話す担当がかけてきます。
これはレビュー運営のルールで決まっているのでしょう。「開発者に電話でしっかりと説明したよ」というフラグ立てです。
そして「定型文を読み上げられます」
内容はいつもの4.2 minimum functionalityのテンプレとほぼ同じ。
電話だからといってこちらの質問、「どうすればいいのか」には一切答えてくれません。相手はロボットと思ったほうがいいでしょう。
NotesとResolution Centerはリジェクターしか見てない
リジェクト時のAppleとのコミュニケーション手段は正式ルートで2つ。NotesとResolution Centerです。
Notesはアプリを再申請する時に記載する文、Resolution Centerはリジェクトに対する直接の返信でアプリをPrepare For Submissionにすると送信が出来なくなります。
どちらも見てはいるのですが、「見てはいる」レベルで、返信はほぼ来ません。
しかもどちらも同じ特定の担当しか見ていないので、どんなにその対応について否定しても、空の星に向かって喧嘩しているのと同じです。
アピールボード
唯一担当以外にメッセージを送れる手段がアピールボードです。
ここに何か送っても「ここはレゾリューションセンターが消えてしまった人向けの窓口だからレゾリューションセンターに書いてね」
と返ってきます。が、(おそらく唯一)担当以外にアピールできる手段ではあります。
ノルマ
レビュー担当はWaiting for Reviewに対する評価ノルマはありますが、リジェクトされたアプリのResolution Center問い合わせに対する返答ノルマはありません。対してアピールボードについては、アピールボード担当者が返答するノルマがあります。(ただしその返答は上記のようにResolution Centerに書いてねという返答ですが。)
つまりResolution Centerの問い合わせは何ヶ月放置しても担当としては問題ないということです。
BundleIDを変えると担当が変わる
驚くべきことにネットでの報告で、4.2 minimum functionがパス出来た方法として、「Bundle ID」を変えるというものが多数あります。
つまり、「別のアプリ」として申請するということです。先程も書きましたが、担当はバージョンごとに固定されますが、別アプリとして出すと、再度担当割当が行われ、運が良ければ担当が「リジェクター」から外れるということです。
なんの宝くじでしょう!
対処
ここでは経験的に4.2 minimum functionalityに対処してパスした方法を記します。
ユニークさをひたすら主張
これは「地球一シンプルなメッセンジャー」を申請した時にパスした方法です。
タイトルに「地球一シンプルなメッセンジャー」と書いてあるので当たりまえですが4.2 Minimum Functionality。「地球一シンプルなメッセンジャー」という名前のアプリに「シンプルだし駄目」とはなんという問答でしょう。
それでもひたすら、そのユニークさと使い勝手の良さをResolution Centerで主張したら、メッセージの返事も一切なくアプリが再申請もしていないのに突然「In Review」になって「Ready for Sale」に変更されました。
再申請なしでもそんなこと出来るんだなと驚きました。
シンプルでも申請は通ります。 なぜなら「地球一シンプルなメッセンジャー」がパスしたのですから
担当が忙しくなるタイミングまで断続機能追加
これは自動型動画視聴アプリを申請した時のこと。見た目もある程度リッチで機能もたくさん設けたつもりなのに4.2 Minimum Functionality。
電話もResolution Centerもロボット的対応で全く質問や主張には答えてくれないので、途方にくれていました。
そしていつかは通るだろうと、ちょっとした機能などを加えて、毎日申請しました。どれもすぐにリジェクトされ、文章はすべて同じ定型文。
電話で言ってた内容を素直に実装しても同じ。もちろん「電話で言ってたじゃん」は通用しません。(担当の苦情を言う相手がいない)
本当に見ているのか??最初から気に入らないから何をしても通すつもりないんじゃないだろうかとへこたれましたが、しつこく毎日それを続けました。
そしてある日「Ready for Sale」
今考えても、最後に追加した機能はそれまでと比べても比較的意味の薄いものでした。単なるWebリンク追加だったと思います。
今思えば、その機能を認められたというよりは、たまたま担当のレビューしなきゃいけないアプリが増えてきて、そろそろいいか的に通されたような感じでした。
裏を返せば、サラリーマン的に反対に暇な時は仕事を絶やさないように、そういった行いをしているのかもしれません。勘ぐりすぎかもしれませんが。
こんな方法で通るの??
4.2Minimum Functionalityと一緒に別の、例えば「メタデータを変えてね」などが来たらラッキーかもしれません。ここでメタデータを変えて、機能はそのままで通った例が報告されています。
そして上にも書いたBundleIDを変えて担当をリジェクターから外す技、やったことはありませんが、仕組みを考えると納得がいきます。
別件の電話中に突然4.2
こんなこともありました。ユーザー投稿型のアプリには報告ボタンをつけなければいけないのでつけていたのですが、あるバージョンアップ(UI変更なし)でリジェクト。
アメリカから突然電話がかかってきました(今回はMinimum Fumctionalityではありません)。
「報告ボタンはワンアクションでないといけないです。」
そこで「はいわかりました」と言って切ればよかったのですが思わず反論してしまいました。
「ワンアクションだと、ユーザーが"なぜ報告するのか"がわからないじゃないですか、報告を受けた側も困りますよね?どうればいいんですか?」
珍しく担当も「スライドをつかえ」など反論してきますが、スライドだけじゃ全てに対処できないと口論気味にちょっと熱くなってしまいました。怒らせてしまったかな?
すると突然
「・・・ところでこのアプリ、4.2のMinimum Functionalityかもしれませんね」
・・・(゚0゚)
今まで3回バージョンアップして今回もUI変更なし、報告ボタンと動画の提出の話でしかリジェクトされていなかったアプリが、突然、Minimum Functionalityされた瞬間です。
ミニハラ被害をなくそう
担当者の気分次第で簡単に起きるMinimum Functionality。
「アプリ変更してね、どうすればいいかは内緒。コストを1千万かけようが1億かけようが、審査が通る保証は全くないから。今までかけたコスト?知らない」
まさに「ミニハラ被害」と呼んでもいいくらいの不条理さです。
愚痴っぽくなってしまいましたが、私はAppleが大好きですし、これからも製品や開発を続けていこうとおもっています。そしてMinimum Functionalityのガイドライン自体はもちろん必要だと思います。
ただ、「人による主観評価のゆらぎ」「だめというだけでどうすればいいかを伝えない」ことについては、同じことを感じている開発者の方が多数いらっしゃるかと思います。
ぜひとも改善し、開発者とのより良い関係に、ソフトウェア世界の発展に繋げて頂きたいものです。
コメント
- やまだしろう yamada_shirou@ironfistpunch(03:16)
一度勢力を得てしまった会社は強いなって感想です。Microsoftとかが後から入っても無理なの、基準緩くしても〇〇アプリばかり、厳しくしてもアプリ集まらないってなるもの。 / “デベロッパーが最も怖れる最恐のリジェクト「4.2 …” https://t.co/sGLBoBYLhA - CK@デジモノに埋もれる日々@ckom(17/10/11)
本当にもう、、。 / “デベロッパーが最も怖れる最恐のリジェクト「4.2 minimum functionality」とは | 節約テクノロジ” https://t.co/kShEuVhuRC
関連ツイート
この記事を見た人がよく読んでいる記事
目次
- 企業別の情報処理安全確保支援士(RISS/登録セキスペ)ランキングを作ってみた(2017秋季版10/02更新)
- よく行く店を来店記録できるWebアプリ[ランチメモリー] v1.6.0
- 日本語に無い数学用語を勝手に定義してしまうページ「かっテイギ」
- XcodeからAppStoreへのアップロードが「Authenticating with Itunes Store」て止まって出来ない→解決
- 指定したGPXファイルのトラックログと高度グラフを表示するWebアプリ
- 現在のページのタイトルとURLをMarkdown風のリンクにする(ChromeのAlertダイアログがコピー出来ない問題に対応)
- どこ?->ここ-> OKの3言メッセンジャー - ドコヤ(iPhone/iPad)
- Chromeの警告ERR_CERT_COMMON_NAME_INVALID(missing_subjectAltName)の対処法
- TVチャンネルライクにYouTubeを視聴するアプリTubeBot(iOS/iPhone/iPad) v1.2.0
- PastePadクリップボードテンプレートメモノート(iOS/iPhone/iPad)
- 家や自動車のローン金利だけでもう一つ買える? 元利均等返済ローン金利シミュレーション計算機 [金利計算くん] v1.1.0
- CoffeeScriptからBabel(ES6)へ乗り換えは早とちり?CoffeeScript2の概要
- 情報処理安全確保支援士の本当のメリットは個人よりも会社にある
- 2ちゃんねる新着チェック用ブラウザ ストリーム2ch(iOS/iPhone/iPad)
- UNIXコマンドメモ(MacOS向け)
- 現在地周辺のWikipedia記事をストリーム表示 - ウィキレーダー(iOS/iPhone/iPad)
- GPSで周りのTwitterのつぶやきをリアルタイム表示するiPhone/iPadアプリ ツイレーダー(2016/10/23更新)
- 速度に応じて地図を拡大縮小シフトするアプリSpeedZoomap(iOS/iPhone/iPad)(2016/10/23更新)
- RPN電卓 DeepStack (iOS/Android)
- 地球上で一番シンプルなメッセージングアプリ「YA」
- iPhone/iPad等iOSに自己署名オレオレCA証明書からサーバー/クライアント証明書を署名しインストールする(2017/4/29更新)
- ホワイトボードとタックメモだけで出来る デペンドToDoリスト(DTD)[+iOS/Android版]
- iOS10にしたらPush通知で「Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません」(TitaniumでiOSのAPNSプッシュ通知サンプル)
- Amazon楽天Yahooの最安をその場で検索し欲しい物をメモ[Webバーコード価格比較] v1.6.0
- GPSで自分の近くの施設の公式ホームページを一覧 [GPSホームページ探索] v2.0.3
- GPSで自分の近くのWikipediaページを一覧 [GPS Wikipedia探索] v2.1.1
- しょうがくせい向けDiffie-Hellman(ディフィー・ヘルマン/DH)共通鍵交換方式のしくみ
- GNU makeは最強の並列スクリプト言語。ビルドだけではもったいない
- CasperJSがMacOSXとフレッツ光で不安定な時にある設定で治った話
- node.jsでフォームからAmazonS3へ画像ファイルをアップロードする29行
- BitCoinの仕組みを紙とスタンプのごっこ遊びに例えてみる(2015/3改訂版)
- App Storeの審査でIn Reviewが長いまま1週間以上放置しておいた話
- glibcで見つかった致命的な脆弱性「GHOST」は具体的になにが問題なのか
- PayPal APIでHello World!10分で作るnode.js寄付サイト
- その労働は何パーセント戻ってくるのか[概算とられる君 作成中] v0.1.0
- GCMとTitaniumとnode.jsでHelloWorld! (GoogleCloudMessaging for Androidのサンプルコード)
- PCブラウザ用 矢印と単語だけのシンプルな図形メモ[WordsAndArrows] v1.0.0
- 平均合計とグラフ表示対応の間欠ストップウォッチ - NoSplit (iOS/Android)
- HTTPS SSL3.0のPOODLE脆弱性の仕組み(PaddingOracle攻撃の具体例)
- 今走っている現在地の国道や県道をWikipediaで調べるアプリ [GPS道ペディア] v1.2.0
- Titanium iOSシミュレーターで言語が日本語にならない場合の対処方法
- USBGPSドングルGT-730FとThree.jsを使った表示デモ
- 手持ちの割引クーポンの使用期限をメモできるWebアプリ[クーポン管理君] v1.0.0
- Javascript正規表現クックシート(よく使うサンプル集)2014/11/13更新
- マイナス思考の人は使用禁止。自分の残された時間を知り1秒1秒を大切に使う[寿命時計] v1.0.0
- 今いる場所の過去の気象データを調べるWebアプリ[お天気タイムマシーン] v1.1.0
- GoogleEarthにGPXトラックをプロット表示[GoogleEarth GPXViewer] v1.2.0
- iPhoneのSiri音声入力での記号入力方法をまとめてみた(2014/11/10更新)
- 自分の残された時間を知る寿命時計のbashシェルスクリプト版
- IngressのIntelMapでレゾネータの数を表示するIITCプラグイン(実験中)
- MacOS X Mountain Lion/Mavericksの通知をコマンドラインから出す方法
- 中古マンションの土地建物価格を簡易計算 [不動産マルチ計算機マンション版]
- 木造中古物件の建物価格や減価償却率を簡易計算 [不動産マルチ計算機 一戸建て版]
- Twitterのリストを削除できない・メンバー追加出来ない問題時の対処方法
- ChromecastでHelloWorld!(任意のURLのMP4を再生)
- 5を掛けたり5で割る計算が驚くほど簡単に暗算できる速算法「五算術」
- Amazonや楽天などの通販サイトの価格表示を自分の労働時間で表示 時給換算君v1.1 (140602ChromeWebStore掲載)
- ×km先のゴールに向けて□秒差で○Km/hで走っている先の集団に追いつくには何km/h出せばいいのか[追いつき計算機]
- エブリィやアトレーなどの軽バンに乗用タイヤを履かせるには Javascriptタイヤ直径計算機 [タイヤサイズ計算機]
- 明日が晴れならiPhoneに通知をする方法(IFTTTのかんたんチュートリアル)
- MacOS Xのターミナルから一発でWolframAlphaを開くスクリプト
- GoogleComputeEngineとAmazonEC2の最低料金比較(常時稼働の低スペックWebサーバーを想定)2014/3値下げ発表対応
- バーコードや手動入力で消費賞味期限をメモ[買い置き名人] v1.0.0
- 売上やカロリーや走行距離など日毎に積算し記録する[シンプル日々積算]v1.0.0
- しょうがくせい向けハミング符号のしくみ
- たった26行でiPhone用のQRコード/JANバーコードを読み取るHTML/JavaScriptWebアプリを書く
- 漫画喫茶で読み終わった巻数をメモ管理 [漫喫バーコードメモ] v1.0.0
- 最後に美容院に行った日を記録メモ [髪切りメモリー] v1.0.0
- SVGクックシート(よく使うサンプル集)
- GoogleのMobileBookmarkBubbleでバルーンが出なくなった時にリセットする方法
- GPSで近くの高速道路ICから100km以内の最遠出口ICを検索 [GPS高速100km地点IC探索] v1.1.1
- MacOSXターミナルのシェルスクリプトからSafariやChromeのWebページのボタンを自動的に押す方法
- プログラミング言語ランキングを比較する
- クレジットカード課金の寄付サイトを10分で作る Google In App Payments APIとJWTのサンプル
- GoogleログインボタンでHelloWorld!〜Google+SignInButtonのサンプル
- ユークリッド互除法をつかいRSA暗号で秘密鍵と公開鍵のペアを求める方法
- よく行く施設やコース毎に積算カロリーをメモ [カロリー貯金箱] v1.0.0
- Three.jsでHelloWorld〜18行で書けるiOS対応3Dプログラム
- よく行く湯を来店記録[温泉メモリー] v1.0.0
- ハイブリッドのエコカーに買い替えるのは本当に得? 自動車コスト計算機(update13/12/13)
- しょうがくせい向けRSA暗号の仕組み
- 今見ているページのについてのTwitterつぶやき一覧を表示するブックマークレット(公式利用版)
- 定規とコンパスだけで足し引き掛け割りの四則演算をする(数学の思考パーツ集)
- GoogleMaps地図のクリックした場所の高度と住所を調べるWebアプリ[タップ高度君] v1.1.0
- GitHubにJavaScriptファイルを置いて直接Scriptで読み込む方法(GitHub直リンク抽出ブックマークレット)
- CSSを使わずにHTMLのIMGタグのALT要素を画像に並べて表示する方法(+jQueryプラグイン)
- Google Analyticsで自分除外用のCookie生成を簡単に行う方法(ブックマークレット)
- JavaScriptでブックマークレットbookmarkletなどを作る時に便利なスニペットSnippet集v1.0
- 見ているページの過去や昔の状態をタイムマシン検索する方法(WaybackMachineブックマークレット)
- クロスドメインXMLHttpRequestを実現するnode.js/expressプロキシ
- Google ChromeでHTTP Headerを表示するには
- node.jsでブログにトラックバックを送信するモジュール
- Garmin eTrexシリーズのGPSログをMacOSでUSB経由でダウンロードするには
- ブラウザで好きなページのHTMLのtextareaをタブTABキー入力可能モードにするブックマークレット
- Markdownクックシート(よく使うサンプル集)