質問: ### 発生している問題・エラーメッセージ Xamarin.iOSのプロジェクト上で、アプリ起動後のViewController表示時に位置情報及びカメラの利用確認を行います。 想定では 「位置情報使用確認アラート」表示→「カメラ使用確認アラート」表示 の順で確認が行われると考えていましたが 実際には 「カメラ使用確認アラート」が一瞬見える→「位置情報使用確認アラート」表示→「カメラ使用確認アラート」表示 と、カメラのアラートが不自然に先に表示されてしまいます。 また、位置情報の利用確認処理とカメラの利用確認処理を前後入れ替えて実行した際も、何故かアラートの表示される順番は変わりありませんでした。 アラートが一瞬重なってしまうことを回避することはできないのでしょうか ``` // in ViewController public override void ViewDidLoad() { base.ViewDidLoad(); if (CLLocationManager.Status != CLAuthorizationStatus.AuthorizedWhenInUse) { // 位置情報の取得確認アラートを表示する。 new CLLocationManager().RequestWhenInUseAuthorization(); } if (AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video) != AVAuthorizationStatus.Authorized) { // カメラ(動画)の使用許可確認アラートを表示する。 AVCaptureDevice.RequestAccessForMediaType(AVMediaType.Video, (bool granted) => { // アラートの選択内容に関わらず、何もしない }); } } ``` ### 補足情報(FW/ツールのバージョンなど) Win Visual Studio 2017 15.9.6 Xamarin.iOS and Xamarin.Mac 12.2.1.12
回答: `new CLLocationManager().RequestWhenInUseAuthorization();` で「位置情報使用確認アラート」を表示した後、その結果を待たずに、 `AVCaptureDevice.RequestAccessForMediaType()` へ進んでしまうので、”「カメラ使用確認アラート」が一瞬見える” 状態になるのだと思います。 `RequestWhenInUseAuthorization()` の結果を待つ(受信する)には、 * ios - CLLocationManager AuthorizationStatus callback? - Stack Overflow のようにコールバックを使う必要がありますが、実際めんどうなので、 * jamesmontemagno/PermissionsPlugin: Check and Request Permissions Plugin for Xamarin and Windows を使ってみてはどうでしょうか? PermissionsPlugin はクロスプラットフォーム向けのライブラリですが、 Xamarin.iOS 単品で使っても問題ないです。 こちらを使うと ``` var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location); ``` のように、「結果を待つ」を async/await で記述できるので、便利です。