Windows Phone アプリ登録初体験 - センサーチェッカーアプリ

実は、MSCやUX-TVでお見せしたセンサーアプリをMarket Placeに登録して、どうやら問題があるらしく、公開できない旨のメールを受け取っていました。
時間が無くて放っておいたwのですが、昨日のTFセミナーでテンションが上がった(というか高橋エバの話を聞いて)ので、セミナーの内容にしたがって(実は何回も過去に聞いた話だし、最後は達彦エバにも聞いたのですが(笑))トライしてみました。

先ず、App Hubを開いて滞っているアプリのページの下のほうのリンクをクリックして、何が悪いのか書いてあるPDFを見ました。
そうすると、

The following requirements apply to applications
that receive the location of a user's mobile device:
2.7.2 The privacy policy of your application must
inform users about how location data from the
Location Service API is used and disclosed and the
controls that users have over the use and sharing
of location data. This can be hosted within or
directly linked from the application.

と書いてあり、要するに、私がアップしたセンサーアプリは、Location APIを使っていて、位置情報はプライバシー情報に関わることなので、Location APIをアクセスする機能を有効にする前に、ちゃんとユーザーに「位置情報にアクセスするけどいいかな?」と聞いて「えぇいいわよ♪」という許可をとる仕組みを入れなさい・・・ていうことでした。
ちゃんと見て読んでみれば、「なんだそんなこと?」というレベルなので、早速、MainPageクラスに

        private bool isLocationAccessEnabled = false;

というフラグをメンバー変数として追加し、ページがロードされる時にコールされるLoadedメソッドで、

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("Sensor Checker includes Location Access Feature. Do you permit accessing your current location?", "Location Access Permission", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                isLocationAccessEnabled = true;
            }

というコードを入れて(本当はYesNoのほうがよい気がするのだが)、ユーザーの承認を得て、isLocationAccessEnabledがtrueの時だけLocation機能を起動するボタンを有効にするコード、

            if (isLocationAccessEnabled)
            {
                buttonLocation.IsEnabled = true;
            }
            else
            {
                buttonLocation.IsEnabled = false;
            }

をこのメソッドの最後に入れたわけです。他にも、CompassのVisual表示のページでも、BingMapとLocation APIを使っているので、Compass機能を起動するボタンのハンドラーで、

        private void buttonCompass_Click(object sender, RoutedEventArgs e)
        {
            string newPageUrl = "/PageCompass.xaml?NavigatedFrom=Main Page";
            if (cbShowVisual.IsChecked.Value)    <== ここから
            {
                newPageUrl = "/PageCompassVisual.xaml?NavigatedFrom=Main Page";
            }
            if (isLocationAccessEnabled)
            {
                newPageUrl += "&isLocationOK=true";
            }
            else
            {
                newPageUrl += "&isLocationOK=false";
            }        <== ここまで
            this.NavigationService.Navigate(
                new Uri(newPageUrl, UriKind.Relative));
        }

というコードに変えて、PageCompassVisualページにユーザーの許可情報を渡し、PageCompassVisual.xaml.csのOnNavigatedToメソッドの中で、

            string isLocationOK;
            NavigationContext.QueryString.TryGetValue("isLocationOK", out isLocationOK);
            if (bool.Parse(isLocationOK))
            {
                cbShowMap.IsEnabled = true;
            }
            else
            {
                cbShowMap.IsEnabled = false;
            }

 と、パラメータを取り出して、BingMapによる地図表示を有効にするチェックボックスの有効・無効を制御を入れて出来上がり。ついでにCompassセンサーへのアクセスが頻繁すぎてBingMapのロードに時間がかかるので、

            mySensor = new Compass();
            mySensor.TimeBetweenUpdates = TimeSpan.FromSeconds(2); <== 2秒間隔でデータを取得する
            mySensor.CurrentValueChanged += new EventHandler<SensorReadingEventArgs<CompassReading>>(mySensor_CurrentValueChanged);
            mySensor.Start();

と、測定間隔を微調整。これで地図表示があっという間に。

あ、これだと、各センサーのページからメインのページに戻る度に、ユーザーに許可を求めるメッセージボックスが表示されてしまい、「どんだけ慎重なの?」って感じになってしまうので、MainPageクラスにもう一つフラグを追加し、

        private bool isLocationAccessAsked = false;

Loadedメソッドを下のように変更。

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            if ( !isLocationAccessAsked && MessageBox.Show("Sensor Checker includes Location Access Feature. Do you permit accessing your current location?", "Location Access Permission", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                isLocationAccessEnabled = true;
            }
            isLocationAccessAsked = true;

これで、蚤の心臓を解消。これで、昨晩、再度Market Placeの審査に挑戦中です。審査が通れば万歳です。もし通らなかったら、また、ブログネタとして投稿します。
以上、センサーチェッカーは、https://mangosensorchecker.codeplex.com/ で公開しているので、参考にしてください。