AppStoreでアプリを公開するときには公開する国を選べる。自分はUIは英語で書いて、あとは英語UIでも使える人に使ってもらえれば、というスタンスなので、基本的に出せる国すべてに対して出している。例外なし。
で、各国のユーザはアプリに対してレビューを書けるんだが、それを見る開発者の側にはロクなインターフェイスがない。iTunes Connectの真っ白な画面の中にどかんとセレクトボックスがあり、そこで選んだ国のレビューが画面遷移ののちに表示される、という仕組みだ。
89カ国も選んでられるかボケ!!!!!
選んでみないとレビューがあるかどうかすら分からん。これはひどいUIですね。コンシューマデバイスのUIはあんなにいいのに、開発者向けのはなんでこんなに最悪なのAppleさん……。。。
bookmarkletを作った
やってられないので、全部読み込むためのbookmarkletを作った。 (スクロールバーつきで右に飛び出さないように、あとCtrl+Aで選択できるようにしたいんだけど、どうすりゃいいんだ? textarea + rows="1"も指定してみたけどうまくいかない……。)
javascript:(function(){var loadjquery = function(callback){var jquery_script_tag = document.createElement('script');jquery_script_tag.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js";document.body.appendChild(jquery_script_tag);setTimeout(callback, 1000);};var loadreview = function(options, hostname, action, referer, fieldname, chain){if (options.size() < 1) {return false;};var one = options.eq(0);var other = options.slice(1);var country_name = one.html();var param = {};param[fieldname] = one.attr('value');var uri = 'https://' + hostname + action;jQuery.ajax({data: param,success: function(html, type){var reviews_html = html.substring(html.indexOf('<center>') + 8, html.indexOf('</center>'));jQuery('div#reviews_backet').after('<div id="review"' + one.attr('value') + '><h3>' + country_name + '</h3>' + reviews_html + '</div>');var new_action = 'https://' + hostname + jQuery(html).find('form#mainForm').attr('action');chain(other, hostname, new_action, uri, fieldname, chain);},url: action,xhr: function(xhr){xhr.setRequestHeader('Referer', referer);},});};var loadreviews = function(loadreview){var action = jQuery('form#mainForm').attr('action');var selections = jQuery('div.app-reviews fieldset ul li').filter(':has(label:contains("Country :"))').children('div select').eq(0).contents();var fieldname = selections.attr('name');jQuery('div.app-reviews').after('<div id="reviews_backet"></div>');loadreview(selections.contents().slice(1), location.hostname, action, location.href, fieldname, loadreview);};loadjquery(function(){loadreviews(loadreview)});})();
これをbookmarkletとして保存(コピー、ブックマークの新規作成、URL欄に貼り付け)し、iTunes Connectのレビュー表示画面("Manage Your Applications" → アプリケーション選択 → "Versions"から対象バージョン選択 → "Customer Reviews")にてブックマークレットを実行。
これで選択肢にある各国のレビューが全部読み込まれます。
自分のアプリ(ひとつしかない)の現行バージョン(ひとつしかない)でしか試せてないので、他の人が試してみてどうなるか、できれば誰か教えてください。
Firefox 3.6 で書いて、いちおうSafari 5でも動作を確認。Chromeでも動くんじゃないかなー。IE? 知らん。まあみんなMac持ってるはずだし、IEは別にいいでしょ。
もちろん現行iTunes Connectに合わせて書いたもの(2010/10/3現在)で、将来的にページ構造などが変われば動かなくなると思います。
細かいこと
サーバ側でユーザが読み込んだページの動線を記録しているせいで、ブックマークレット使用後は 'Done' のボタンその他がいっさい効かなくなっています("You backtracked too far." とか言われてログイン画面に飛ばされる)。これに対処するのもちょっと面倒そうだったので、スルーしました。ログイン画面から入り直してください。*1
iTunes Connectの画面はprototype.jsを使ってますが、このスクリプトは唐突にjQueryを読み込んでます。自分が最近jQueryづいていて、かつprototype.jsの使い方を学ぶのがめんどくさかったためです。誰かprototype.js版を作ってください。自分もそっち使いたいです。w
jQueryの読み込み(&ブラウザ側でのローディング)のために setTimeout(func, 1000) してますが、遅い回線からだとこれでは不十分かもしれません。その場合は適当にこの数値を増やしてみてください。
バックアップのためも含めて、bookmarklet化する前のjsを全文ここに貼り付けておきます。githubにも上げた。
(function(){ var loadjquery = function(callback){ var jquery_script_tag = document.createElement('script'); jquery_script_tag.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"; document.body.appendChild(jquery_script_tag); setTimeout(callback, 1000); }; var loadreview = function(options, hostname, action, referer, fieldname, chain){ if (options.size() < 1) { return false; } var one = options.eq(0); var other = options.slice(1); var country_name = one.html(); var param = {}; param[fieldname] = one.attr('value'); var uri = 'https://' + hostname + action; jQuery.ajax({ data: param, success: function(html, type){ var reviews_html = html.substring(html.indexOf('<center>') + 8, html.indexOf('</center>')); jQuery('div#reviews_backet').after('<div id="review"' + one.attr('value') + '><h3>' + country_name + '</h3>' + reviews_html + '</div>'); var new_action = 'https://' + hostname + jQuery(html).find('form#mainForm').attr('action'); chain(other, hostname, new_action, uri, fieldname, chain);}, url: action, xhr: function(xhr){xhr.setRequestHeader('Referer', referer);}, }); }; var loadreviews = function(loadreview){ var action = jQuery('form#mainForm').attr('action'); var selections = jQuery('div.app-reviews fieldset ul li').filter(':has(label:contains("Country :"))').children('div select').eq(0).contents(); var fieldname = selections.attr('name'); jQuery('div.app-reviews').after('<div id="reviews_backet"></div>'); loadreview(selections.contents().slice(1), location.hostname, action, location.href, fieldname, loadreview); }; loadjquery(function(){loadreviews(loadreview)}); })();
Javascriptむずかしいなー。