菜鸟教程小白 发表于 2022-12-13 09:49:45

ios - Xamarin iOS - CLLocationManager 在后台以设定的时间间隔获取位置


                                            <p><p>我正在尝试向我的应用程序添加一项功能,该功能需要以设定的时间间隔获取用户的当前位置。问题是每当我使用 <code>System.Threading.Timer</code> 时,创建一个新的 <code>System.Threading.Thread</code> 并使用 <code>Thread.Sleep()</code>,或使用 <code>NSTimer.CreateScheduledTimer</code> 当应用程序在后台时,应用程序将停止 <code>CLLocationManager</code> 运行。</p>

<p>LocationManager.cs</p>

<pre><code>public class LocationManager
{
    protected CLLocationManager locationManager;
    /// &lt;summary&gt;
    /// Time in milliseconds between location checking.
    /// &lt;/summary&gt;
    private int serviceMillisecondTimeout = 10000;

    public LocationManager()
    {
      this.locationManager = new CLLocationManager();

      // iOS 8 additional permissions requirements
      if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
      {
            locationManager.RequestAlwaysAuthorization();
      }

      locationManager.LocationsUpdated += onLocationUpdated;
      locationManager.DistanceFilter = 1;
      locationManager.DesiredAccuracy = 1;
    }

    public CLLocationManager LManager
    {
      get { return locationManager; }
    }

    public void startLocationUpdates()
    {
      if (CLLocationManager.LocationServicesEnabled)
      {
            locationManager.StartUpdatingLocation();
      }
    }

    public void stopLocationUpdates()
    {
      locationManager.StopUpdatingLocation();
    }

    public void onLocationUpdated(object sender, CLLocationsUpdatedEventArgs e)
    {
      // stop location updates until timer calls StartUpdatingLocation
      locationManager.StopUpdatingLocation();

      var coordinate = e.Locations.Coordinate;
      double lat = coordinate.Latitude;
      double lon = coordinate.Longitude;

      // do stuff with coordinates

      // This will work until the application goes into the background.
      // The same thing seems to happen whenever I try creating
      // new threads, or any other form of a timer.
      //
      // Without any sort of timer or new thread, it will call
      // StartUpdatingLocation in the background and will
      // continue to run indefinitely.
      NSTimer t = NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(serviceMillisecondTimeout), delegate
      {
            if (CLLocationManager.LocationServicesEnabled)
            {
                locationManager.StartUpdatingLocation();
            }
      });
    }
}
</code></pre>

<p>如何设置明确的时间间隔并仍然能够在后台运行位置更新?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>平台不支持此功能。您可以在后台或离开设置的地理围栏时订阅重要的位置更改,但您不能强制您的代码在后台以特定间隔获取位置修复。这是 iOS 平台的限制/限制,您对此无能为力。 </p>

<p>最接近你想要的可能是<a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW10" rel="noreferrer noopener nofollow">Getting Location Events in the Background</a> .</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Xamarin iOS - CLLocationManager 在后台以设定的时间间隔获取位置,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31949539/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31949539/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Xamarin iOS - CLLocationManager 在后台以设定的时间间隔获取位置