チンチラのフンみたいなもの

毎日の学んだことを書いていきます

アプリリリースしました!!!!③

前回 

アプリに使った技術 地図編

 地図にはGoogle Maps SDKのライブラリを使っています。なぜMapKitではなくGoogleMapを使うのかと言うと、ストリートビューを使うことができるからです。訪問営業アプリなので、現在地やデフォルメされた地図だけでなく、実際に写真で見れた方が圧倒的に分かりやすいだろうと思っていました。なので私の中でストリートビューは割と必須項目でした。でも私のアプリにはストリートビューがありません。技術不足でした。。。GoogleMapのようにしたかったので、左下にUIViewを置いて、そこにストリートビューをaddSubViewして表示するところまではできました。しかし、そのビューの中でずっとぐるぐるとロード中のマークが回ってました。ロードが終わるまではビューをタッチしても何も反応しないようになってました。この問題の解決策が分からず、ストリートビューはアプリの必要条件ではないということでお見送りさせて頂きました。ただこのことはアプリ開発のかなり初期にあったものなので、今の私ならイケるのじゃないかと謎の自身があります。また今度挑戦してみます。
 次に現在地の取得の話です。現在地を取得してもいいかどうかはiPhoneの設定のアプリ一覧から設定することができます。ここで面白いのが現在地の取得の許可の他に、正確な位置情報という欄があります。これをぜひお手元の「セールスマップ」か地図アプリで試して欲しいのです。オンの時はいつもの状態ですが、オフの時はぶわっと円が広がり、現在地も半径数キロメートル以内というかなり大雑把なものになります。このアプリ開発を通じて初めて知ったのですが、アプリの設定がこんな風に反映されるんだと少し感動した覚えがあります。Google Maps SDKのチュートリアルの中にpreciseLocationZoomLevelとapproximateLocationZoomLevelというかなり長い変数があると思います。これはこの正確な位置情報がオンの時とオフの時のカメラのズームレベルを表しています。要は円全体が見えるようにカメラを動かすというものです。訪問営業記録アプリ「セールスマップ」の場合、家が正確に分かるまで地図を拡大する必要があるのでpreciseLocationZoomLevelの値が高めに設定されています。
 チュートリアルではカメラの動きを、CLLocationManagerDelegateという位置情報を取得した時に通知するデリゲートの中で全部設定しているのですが、実はこれ結構罠です。CLLocationManagerDelegateが通知するタイミングが最初に現在地を取得した時、何メートルか動いた時の他にアプリがバックグラウンドからフォアグラウンドになった時があります。これがかなりうっとおしいです。現在地と異なる場所に地図のカメラがあり、そこからちょっと調べようと思って他のアプリに行って、戻ってくると現在地に戻ります。これでは現在地の記録以外させませんと言っているようなものです。これはいけないと思い、無理やりな感じですがisFirst変数を使って最初の起動時に現在地を取得したらfalseにするようにしています。この起動時のみカメラが動くという設定自体はGoogleMapと多分同じです。
 最後に地図アプリを申請する際はぜひやって欲しいことを説明します。「セールスマップ」もしくはAppleマップの位置情報の取得の許可を許可しないに変えてみて下さい。そうすると、上のNavigationBarに「位置情報サービスがオフです>」というボタンが現れます。これを押すとアプリの設定に遷移して、位置情報の取得の許可を促すのですが、このボタンをぜひ設定して欲しいです。私は当初このボタンを設定しないままアプリを申請しました。するとAppleから「ガイドライン4.3に反しているためリジェクトする」とメールが来ました。詳しくはこの記事とかこの記事を読んで欲しいのですが、要は他のアプリと同じだからスパム扱いになっているというものです。私はこれに対して何度かメールで抗議しましたが、全く態度が変わる感じがありませんでした。もしかしたら、このアプリは起動時に位置情報を取得しなかった場合日本地図が表示されるように設定されているので、ただ日本地図を表示するアプリだと勘違いしているのではと考えました。そこでそのボタンを作って提出した所見事「ガイドライン4.3問題」は解消されました。位置情報ぐらいONにしろよと思ってしまいますが、そのせいで操作方法が分からなくなるユーザーもいるということを学ぶいいきっかけになったかなと思います。
次回