2012年9月20日木曜日

Data Isolation(iOS6でのプライバシー対応)で開発時に困ったこと

iOS6でData Isolationという仕組みが導入されました。簡単に言えば、カレンダーや連絡先のデータを取り扱う場合には、予め利用者に許可を求める仕組みですね。

今申請中の「SpeedPlan」という予定入力補助アプリの開発時、というかテスト時に引っかかったところがありました。
「”このApp”が連絡先へのアクセスを求めています <許可しない><OK>」
「”このApp”がカレンダーへのアクセスを求めています <許可しない><OK>」
といったプロンプトは初回(の一度きり)しか表示されないのです。これは戸惑いました。
解決法はわかってみれば簡単で、「もう一度表示させるには設定をリセットすれば良い」という、「もー、早く言ってよ!」的な。
(設定App  > 一般 > リセット > 位置情報とプライバシーをリセット)

…とかなんとか訳知り顔で言ってますが、これはWWDC2012の「Privacy Support in iOS and OS X」というセッションで説明されているものです。(注:下記リンクは開発者のログインが必要です)

WWDC2012 - Privacy Support in iOS and OS X

教訓:WWDCのセッションはちゃんとチェックしましょう。

    2012年9月6日木曜日

    Localizable.stringsが反映されない罠にかかった

    昨日、ほとんど1日ハマったので、誰かの役に立つかも、と思い記します。

    多言語対応(ローカライズ)をするにはLocalizable.stringsを言語毎に編集するわけですね。何日か前にそれを施して、期待通りの挙動をしておりました。
    で、昨日になって、ふと気がつくと、シミュレーター上で日本語が表示されていません。「あれ、英語だ、おかしいな」みたいな状況。実機でも確認しましたが、駄目。
    何かこの辺を壊すようなことしたっけ?うーん、わからない。
    ということで、

    • UTF16かどうか
    • 実ファイルとXcodeが期待するパスがずれたりしてないか

    とか確認したのですが問題なし。
    仕方なく、一度Localizable.stringsを削除してもう一度設定し直したら、今度は起動の度毎に日本語になったり、英語になったり。
    これは変、相当変。で、この時点でお手上げ。
    気分転換もかねて、しばらく違うことをしながら挙動を観察していたところ、英語として立ち上がったように見えて、実はローカライズそのものが適用されていない事実を目撃。

    例えば、水曜日のことを、英語では"Wed" = "W"としていたのに、そのまま「Wed」と表示される、とか。日本語が表示された場合は、"Wed" = "水"と正しく機能しているので、これはつまり、「日本語だったり英語だったり」ではなく、「Localizable.stringsが反映されたり、されなかったり」ということが起きているのか、と。

    で、その日の朝に導入したものをそこで初めて疑いました。(←遅いぞ、俺)
    以前、記事にしたことがあるAppiraterです。

    今回はGitHubから最新のビルドを落としてきたのですが、以前とほぼ同じ書き方で問題なく動作してしまったので、中身を良く見ないまま実装しておりました。
    改めて中身を見直すと、Appirater自身がLocalizable.stringsを独自に抱えているではないですか。きっとLocalizable.stringsが複数存在しているからバッティングしているのに違いない、と思って早速Appirater側のLocalizable.stringsを削除してビルドすると、…問題は消えました。


    記事に書いた通り、前回はローカライズするのが面倒な仕様だったのでこれはこれで進化しているわけですけど、そのせいで泣きました…。




    でも解決したので良しとします。