頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


アプリにレビューが1つ付いてた!

どうやらiTunes Connectがちょっと変わったと聞いたので行ってみました。
なんでも、レビューが見やすくなったとか。

なるほど、今までは全部の国が表示されていたのが、レビューがある国だけ表示するようになったんだな。

「赤ちゃんの成長グラフ」アプリに全然レビューがないよ、って話を昨日
ナビゲーションバーのボタンの文字列を得る
でも書いたところでしたが、なんと、1カ国"Germany"と表示されてますやん!

いざ見てみると、評価は星1つで、何やらドイツ語でごにょごにょ書いてる。
ドイツ語なんて理解できないのでGoogle翻訳で調べると、

今までダウンロードした中で最悪のアプリだ!金の無駄だ!

とのこと。


それだけかいな?
どうせならもっと具体的に書いてくれると助かるんですがね。


ナビゲーションバーのボタンの文字列を得る

日本国内専用アプリだとどうしようもないことがわかっているし、せっかく世界中で販売できる環境なんだからやっぱりそうしたい。
でも、ローカライズするのって難しい、、、というかその言語を知らないから無理です。
機械的に翻訳した表現が無茶なのはわかっているけど、仕方なく使ってて、結局海の向こうのユーザーから「あんたのドイツ語はむちゃくちゃだから直すか、英語で表示せえや、ゴラァ!」って英文メールを頂いたりしております。

特にGoogle翻訳なんかで難しそうなのが文章よりも、見出しのような短い表現。
アプリで言えばボタンやタイトルのような部分。
無駄に長くなってもダメですしね。

でも、よく考えたらもともとフレームワークでボタンに使っている表現はiPhoneの言語設定変えたら表示されるやん、これ使えばいいんじゃね?
ということで、やってみました。
ほら、ナビゲーションバーの左右にボタンを設定できるじゃないですか。
こういうやつ :

ナビゲーションバーのボタン

この"Done"って文字を取得したいわけです。
このボタンを表示するにはコードはこんな感じ :

UIBarButtonItem *doneButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(hoge)];
self.navigationItem.rightBarButtonItem = doneButtonItem;
ところが、コードにあるようにこのボタンってUIButtonクラスのオブジェクトではありません。
リファレンスのUIBarButtonSystemItemのところを見ると、これで表示できるのはこのようなDoneやCancelボタンだけでなく、画像なんかもありますからねえ。

UIBarButtonSystemItem

ということで、簡単には文字列を取得させてくれません。
仕方ないので、ナビゲーションバーの構造(下にどんなビューがあるか)を調べてみました :
NSLog(@"self.navigationController.view");
    
for (UIView *subview1 in self.navigationController.view.subviews) {
    NSLog(@"- %@",[[subview1 class] description]);
        
    for (UIView *subview2 in subview1.subviews) {
        NSLog(@"-- %@",[[subview2 class] description]);
            
        for (UIView *subview3 in subview2.subviews) {
            NSLog(@"--- %@",[[subview3 class] description]);
                
            for (UIView *subview4 in subview3.subviews) {
                NSLog(@"---- %@",[[subview4 class] description]);
            }
        }
    }
}
結果はコレ :

ナビゲーションバーの構造

見たことないクラスが出てきますが、名前から予想するに、subview4は不要そう。
UIButtonLabelクラスってのがそれっぽそうかも?
ってことで、このUIButtonLabelの親クラスを調べてみます :
NSLog(@"self.navigationController.view");
    
for (UIView *subview1 in self.navigationController.view.subviews) {
    NSLog(@"- %@",[[subview1 class] description]);
        
    for (UIView *subview2 in subview1.subviews) {
        NSLog(@"-- %@",[[subview2 class] description]);
            
        for (UIView *subview3 in subview2.subviews) {
            NSLog(@"--- %@",[[subview3 class] description]);
                
            if ([[[subview3 class] description] isEqualToString:@"UIButtonLabel"]) {
                NSLog(@"superclass of UIButtonLabel is %@",[[subview3.superclass class] description]);
            }
        }
    }
}
下の結果にあるように、この親はUILabelクラスです! :

UIButtonLabelの親クラス

ということで、オブジェクトをUILabelにキャストして、"text"プロパティからめでたく文字列を取得することができました。
ローカライズ用の"Localizable.strings"ファイルにコピペで完了!
参考にいくつか紹介すると、、、

英語 :
"button_done" = "Done";
"button_cancel" = "Cancel";
"button_edit" = "Edit";
"button_save" = "Save";
"button_send" = "Send";

日本語 :
"button_done" = "完了";
"button_cancel" = "キャンセル";
"button_edit" = "編集";
"button_save" = "保存";
"button_send" = "送信";

中国語 :
"button_done" = "完成";
"button_cancel" = "取消";
"button_edit" = "编辑";
"button_save" = "存储";
"button_send" = "发送";

タイ語 :
"button_done" = "เสร็จ";
"button_cancel" = "ยกเลิก";
"button_edit" = "แก้ไข";
"button_save" = "บันทึก";
"button_send" = "ส่ง";

"Done"、"Cancel"、"Edit"、"Save"はUIBarButtonSystemItemより上記の方法で取得しました。
最後にある"Send"はメール送信時に使うMFMailComposeViewControllerクラスに表示されるボタンから同様の方法で取得しました :

送信ボタン

とりあえず、ボタンの表現に関してはこれでクレームは来ないかな?!


AppStoreのレビューページへのリンク

初のアプリ「赤ちゃんの成長グラフ」をリリースしてすでに2ヶ月以上が経ちました。
リリース前はどんな恐ろしい、どんな心が折れるようなレビューが来るんだろうと戦々恐々としておりましたが、、、まだ1つもレビューがありません。

ユーザーにとってよほどのモチベーション(感動した!とか起動しねえぞゴラァ!金返せや!とか)がない限りわざわざAppStoreに行って、検索してそのアプリを評価するなんてしませんよね。
自分もそうそうしません。

そんなわけで、今度のバージョンアップ時にAppStoreへのリンクボタンを設置しようかと思い、その方法を調べていました。

リンクしたいページはAppStoreのアプリ紹介のページじゃなくて、そのレビューを表示してるページ。
なぜなら直接ここに来る方が、ユーザーにとってラクチンだからです。


例えば最近楽しんでいる「Temple Run」ってゲームだとAppStoreで検索とかランキングから行くと

Temple Runトップページ

↑まずこういうページがありますよね。
このページでダウンロードできるわけです。
ここからつーっと下の方へ行くとスクリーンショットの下に

Temple Runトップページの下の方

↑こういう部分があります。
ここの評価のところをタップすると画面が遷移して、

Temple Runレビューページ

↑このようにユーザーのコメントがずらずらーっと表示され、上部には「レビューを書く」というボタンがあるページにたどり着きます。


ユーザーにレビューを書いてもらおうとすると、トップページの下の方に来てからタップが1回必要、となるのでやはり直接この「レビュー」ページに飛ばしたいわけです。

で、その方法を調べてみたところ、こういう情報が。

iphone - App store link for "rate/review this app" - Stack Overflow

うーむ。
なんとも奇々怪々な文字列が並んでるなあ (- - ;

試しに実機で動作を確認してみたら、確かに期待通り動いてくれましたが。
直接飛ばすとアプリ名が表示されないのが若干不安な気分。
リンク先間違えたらえらいことになりますねえ。


二色の浜のパン屋cocochinoに行ってきた

なんか工事してるなあ、どうもパン屋ができるのか?
と前から気になっていた南海二色の浜駅すぐ近くのパン屋さんが、9月16日にオープンと聞き、当日早速行ってきました。

そのパン屋さんは駅から少し海側に行ったところにcocchinoと書いた看板を掲げていました。
Natural Bakery & Preserved Flowersってレシート等に書いてあってその通り、店内の棚の1/3くらいは(多分)プリザーブドフラワーが売られていました。
Natural Bakeryってのがよくわかりませんが、添加剤・着色料等はなし、とかそういう感じなのか、、、見た目が地味なパンが並んでいました。
一般的なパン屋さんに比べると品数が少ないのが残念。

きっとどれも健康に配慮したパンなんだろうな、というのは自分の想像でお店のコンセプトがわかる広告なりサイトなりを見たことがないのでよくわかりませんが。
ちなみに、営業時間、休日などがわかる紙(あれば持って帰ろうと思ったんだけど)なんかも店内には見当たらず、、、
公式サイトの登場に期待。

なんだか残念な風にばかり書いてますが、2つほど買って食べたパンはおいしかったんだよな。
それだけにこれからのバージョンアップに期待であります。

カレーパン

↑タイムセールで100円だったカレーパン。


タブ間(クラス間)でデータを共有するコード例

頭と尻尾はくれてやる! タブ間でデータを共有する
という記事に関して質問があったので追記です。

赤ちゃんの成長グラフ

↑「赤ちゃんの成長グラフ」だと、どのタブでも(例えば)登録している子供の名前、性別や、現在選択している子供などの情報が必要になります。
また、あるタブでその情報を書き換えてそれを他のタブで使って、なんてことも当然あります。

どうやったらタブ間(クラス間)でデータを共有したらラクチンなのか、、、?
いろいろなやり方があるとは思いますが、ここではデータを管理するクラス(DataManagerクラス)のオブジェクトを作り、その参照を各タブ(を扱うviewController)に教える、という方法でやっています。

かなりシンプルなコードをgithubにアップしてみました → CommonData - GitHub

ちなみに、このコードでは参照の渡し方をあえてタブ1とタブ2で変えていて、タブ1は初期化時に渡してて、タブ2では初期化の後に単純にプロパティに設定してます。

実行結果

↑実行結果はNSLogで共有データの内容を表示しています。

サンプルコードでは読み込みだけで書き換えは実装していませんが、タブ1で文字を入力、タブ2でそれを表示、なんてこともできます。




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.