2017-04-12 14 views
0

iOS、Android、UWPのXamarin Formsクロスプラットフォームアプリケーションを使用しています。 Xam.Plugin.Geolocatorを使用して、各デバイスから場所を取得します。 iOSでの私の挑戦は、デバイス上のアプリの最初の起動時です。私のコードが実行され、Plugin.Geolocator.Abstractions.IGeolocatorオブジェクトのIsGeolocationEnabledがfalseになっていることが検出され、アプリケーションがデバイスの場所を使用できるようにするオプションが表示されます。これにより、アプリが位置情報サービスを有効にしていないことをアプリに通知します。XamarinフォームはiOSでGeoLocationの承認を待たずに

基本的に私は、使用する前に以下のコード行を打っていますが、これまでの位置情報サービスについて尋ねている。他のプラットフォームで

if (!App.gobj_RealGeoCoordinator.IsGeolocationEnabled) 
    ls_ErrorMessage = resourcestrings.GetValue("NoLocationServicesMessage"); 

を待っている間に、UWPは、少なくとも、アプリが一時停止しているようですユーザが位置情報サービスの使用要求に応答する。 Androidがアプリを使用する場合、Androidは自動的に場所へのアクセスを許可しているようです。

ロケーションサービスを使用するリクエストが最初に実行されたかどうかにかかわらず、iOSでどのように検出されるか考えてみましょうか?どんな提案も大歓迎です。

UPDATE(1): 以下のようにinfo.plistにすべて正しい項目があります。私は最終的に私のアプリが既にIsGeolocationEnabledをチェックして、ユーザーがアプリケーションの位置情報サービスを有効にしていないと判断した直後にその場所の使用を要求します。

​​

UPDATE(2): だから私は、次のコードを使用して少し進歩を遂げました。ユーザー対

    try 
        { 
         while (!App.gobj_RealGeoCoordinator.IsGeolocationEnabled) 
         { 
          await Task.Delay(1000); 
         } 

         ViewModelObjects.AppSettings.CanAccessLocation = App.gobj_RealGeoCoordinator.IsGeolocationEnabled; 
        } 
        catch (Exception ex) 
        { 
         XXXXXXX 
        } 

課題は、プラグインは私に、ユーザに知る方法を提供しないように見えるということであるロケーションサービスダイアログに応答しなかった(すなわちIsGeolocationEnabled == falseが)(ロケーションサービスダイアログにノーと言いましたまた、IsGeolocationEnabled == false)。助言がありますか?

+0

これまで誤って拒否していたことはありますか?設定アプリで、アプリの場所が許可されているかどうかをチェックします。また、適切なinfo.plistエントリを追加しましたか? –

+0

すべての情報、plistの内容は正しいです。私は最終的に位置情報サービスを許可する要求を得る。それは、アプリケーションの最初の実行時にのみ発生します。一度私はアプリケーションの最初の実行で位置情報サービスを許可し、それをシャットダウンし、再起動、すべて正常に動作します。これは、ユーザーがアプリケーションのすべての場所の使用を促すタイミングと、その応答を待つようにアプリケーションが表示されないという事実のタイミングです。 –

答えて

0

iOSでこのタイプの許可要求が発生するのは、非同期のダイアログプロンプトです(非同期ダイアログプロンプトは必要な場合にのみ表示され、必要になるまで表示されません)。基本的には、CLLocation APIからコールバックを設定する必要があります。私はこの目的のために使うヘルパークラスを持っているので、それはさらに簡単です。 GetCurrentDeviceLocation()に電話し、コールバック関数を渡してください。コールバックは、ユーザーがアプリへのアクセス権を付与した場合、または以前に許可を受けた場合にのみ呼び出されます。

public class GeoLocationService 
{ 
    readonly CLLocationManager _locationManager; 
    WeakReference<Action<Position>> _callback; 

    public GeoLocationService() 
    { 
     _locationManager = new CLLocationManager(); 
     _locationManager.AuthorizationChanged += AuthorizationChanged; 
    } 

    void AuthorizationChanged (object sender, CLAuthorizationChangedEventArgs e) 
    { 
     Action<Position> callback; 
     if (_callback == null || !_callback.TryGetTarget (out callback)) { 
      return; 
     } 

     if (IsAuthorized(e.Status)) { 
      var loc = _locationManager.Location; 
      var pos = new Position(loc.Coordinate.Latitude, loc.Coordinate.Longitude); 
      callback (pos); 
     } 
    } 

    static bool IsAuthorized(CLAuthorizationStatus status) 
    { 
     return 
      status == CLAuthorizationStatus.Authorized 
      || status == CLAuthorizationStatus.AuthorizedAlways 
      || status == CLAuthorizationStatus.AuthorizedWhenInUse; 
    } 

    public void GetCurrentDeviceLocation (Action<Position> callback) 
    { 
     _callback = new WeakReference<Action<Position>> (callback); 

     if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) { 
      if (_locationManager.Location == null) { 
       _locationManager.RequestWhenInUseAuthorization(); 
       return; 
      } 
     } 

     AuthorizationChanged (null, new CLAuthorizationChangedEventArgs (CLAuthorizationStatus.Authorized)); 
    } 
} 
+0

Keith、これは私のPCLにPlugin.Geolocator.Abstractions.IGeolocatorを使っているXamarin Formsアプリです。 CLLocationManagerオブジェクトはありません。しかし、私はあなたが場所を要求し、私がその応答を得るまで待つために、私が最初の打ち上げ時に何かをする必要があることを示していると思います。私はそれを試みます。 –

+0

次のコード行を追加して、場所を強制的に取得しようとしました。 –

+0

これは私がこれに使用するコードのiOS部分です。あなたの質問に注意したように、他のプラットフォームはこれを簡単な方法で処理します。私はその特定のプラグインを使用しませんが、私はプライベートナゲットパッケージを介していくつかのアプリケーションでこのコードを再利用しています。 –

関連する問題