2016-12-10 13 views
1

すべて、 私は、とりわけデバイスからジオロケーションデータを特定の間隔で取得する必要があるForms/iOS/Androidプロジェクトを持っています。いくつかの調査の後、これを行う正しい方法がFormsでこれをやろうとするのではなく、IOSとAndroidでバックグラウンドサービスを使用していることがわかりました。私はちょうどそれをやったし、依存関係サービスを使ってメソッドを呼び出すことで、IOSとAndroidの両方でX分ごとに緯度/経度情報を報告するようにしています。だから、すべてがコンセプトとしてすごくうまくいっています。Xamarin - デバイス固有のコードからXamarinフォームにデータを戻す

今、メインのPCLプロジェクトですべてを配線しようとしています。これを行うための最善の方法についていくつかアドバイスをしたいと思います。たとえば、iOSでは、CLLocationManagerオブジェクトが位置変更イベントを発生させるイベントハンドラがあります。 Formsプロジェクトにこれを知らせて、親のプロジェクトコードに新しい緯度/経度の値を渡すにはどうすればいいですか?これは私の最初のデバイス特有のコード重いプロジェクトなので、私はここで私にとって未知の海です。

アドバイスありがとうございます。

+2

これはMessagingCenterの便利な使い方です。https://developer.xamarin.com/guides/xamarin-forms/messaging-center/ – Jason

+0

PCLプロジェクトでどのように依存サービスを呼び出しましたか? PCLプロジェクトで依存関係サービスを呼び出すと、緯度/経度の値を取得する必要があります。 –

答えて

0

これはかなり一般的なシナリオであり、いくつかの異なる方法で解決できます。私の個人的な好みは、Xamarin.Formsプラグインで使用されているパターンに従うことです。 Geolocator Pluginが構成されているかを見てみましょう:

// Abstraction for the information you want to access in shared (PCL) code 
public interface IGeolocator 
{ 
    event EventHandler<PositionEventArgs> PositionChanged; 
    ... 
} 

ここで、イベントは、位置の更新を購読するIGeolocatorを使用して、任意のPCLコードの形で持って来ることができます。これはあなたがCLLocationManagerと聞いているようなものです。この情報を転送するために、IGeolocatorのiOS固有の実装では、CLLocationManager.LocationsUpdatedが発生するとPositionChangedイベントが発生します。

manager.LocationsUpdated += OnLocationsUpdated; 
... 

void OnLocationsUpdated(object sender, CLLocationsUpdatedEventArgs e) 
{ 
    foreach (CLLocation location in e.Locations) 
     UpdatePosition(location); 
    ... 
} 

// UpdatePosition copies the lat/long/etc into the PositionEventArgs and calls OnPositionChanged 

void OnPositionChanged(PositionEventArgs e) => PositionChanged?.Invoke(this, e); 

最後に、それはDependencyService.Get<IGeolocator>()を使用してシングルトンまたはいずれかの共有コードで使われています:

try 
{ 
    // Singleton usage 
    var locator = CrossGeolocator.Current; 

    // DependencyService 
    // var locator = DepedencyService.Get<IGeolocator>(); 

    locator.DesiredAccuracy = 50; 

    // Subscribing to event in shared code 
    locator.PositionChanged += OnPositionChanged; 
} 
catch(Exception ex) 
{ 
    ... 
} 

このコードのすべてがhereを見つけることができます。また、このプラグインの使用を検討することもできます。それは役に立つかもしれない他の機能を持っています。 GitHubのページには、その使い方を示しています。

関連する問題