【问题标题】:Xamarin iOS - Handling Geofence intersection triggers after terminating an appXamarin iOS - 终止应用程序后处理地理围栏交叉点触发器
【发布时间】:2018-04-10 16:58:51
【问题描述】:

我正在尝试在我的应用程序终止(不是后台)时处理地理围栏交叉点触发器。即使我的应用程序没有运行,我也想处理来自 CLLocationManager 的进入/退出触发器。它应该在后台唤醒我的应用程序,在进入/退出时进行所需的处理。

为此,很多地方都可以使用后台应用刷新功能。我编写了以下代码,但是一旦我终止应用程序,它就会停止听到地理围栏触发事件。

即使应用程序终止,任何人都可以指导我如何处理这些事件吗?

 public async Task StartLocationUpdates()
    {
        _cts = new CancellationTokenSource();
        _taskId = UIApplication.SharedApplication.BeginBackgroundTask("LongRunningTask", OnExpiration);

        try
        {
            if (CLLocationManager.LocationServicesEnabled)
            {
                LocMgr.DesiredAccuracy = 1;

                LocMgr.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) =>
                {
                    var locations = e.Locations;                       
                };
                LocMgr.StartUpdatingLocation();

                if (CLLocationManager.LocationServicesEnabled)
                {

                    if (CLLocationManager.Status != CLAuthorizationStatus.Denied)
                    {

                        if (CLLocationManager.IsMonitoringAvailable(typeof(CLCircularRegion)))
                        {

                            LocMgr.DidStartMonitoringForRegion += (o, e) =>
                            {
                                Console.WriteLine("Now monitoring region {0}", e.Region.ToString());
                            };

                            LocMgr.RegionEntered += (o, e) =>
                            {
                                Instance.Speak("Just entered " + e.Region.ToString());
                            };

                            LocMgr.RegionLeft += (o, e) =>
                            {
                                Instance.Speak("Just left " + e.Region.ToString());
                            };
                            foreach (CLCircularRegion region in RegionList)
                            {
                                if (region != null)
                                {
                                    StopMonitoringRegion(region);
                                }
                                LocMgr.StartMonitoring(region);
                            }
                        }
                        else
                        {
                            Console.WriteLine("This app requires region monitoring, which is unavailable on this device");
                        }

                        LocMgr.Failed += (o, e) =>
                        {
                            Console.WriteLine(e.Error);
                        };

                    }
                    else
                    {
                        Console.WriteLine("App is not authorized to use location data");
                    }

                }
                else
                {
                    Console.WriteLine("Location services not enabled, please enable this in your Settings");
                }


            }
        }
        catch (OperationCanceledException)
        {
        }
    }

提前谢谢你。

【问题讨论】:

    标签: ios xamarin xamarin.forms xamarin.ios geofencing


    【解决方案1】:

    您似乎已在 info.plist 中添加了隐私密钥以启用定位服务。如果您想在应用处于后台状态或终止时启用它,我们还应该打开后台模式:功能 > 后台模式 > 位置更新。

    然后我们就可以在AppDelegate初始化位置管理器了:

    CLLocationManager locationManager;
    public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        locationManager = new CLLocationManager();
        locationManager.Delegate = new MyLocationDelegate();
        //enable service when app is on background or terminated
        locationManager.PausesLocationUpdatesAutomatically = false;
        locationManager.AllowsBackgroundLocationUpdates = true;
        locationManager.RequestAlwaysAuthorization();
        locationManager.DistanceFilter = 100.0;
        locationManager.DesiredAccuracy = 1;
        // The important request can awake your app
        locationManager.StartMonitoringSignificantLocationChanges();
        locationManager.StartUpdatingLocation();
    
        return true;
    }
    

    如果您的位置已更改,即使您的应用已终止,事件LocationsUpdated() 也会触发:

    public class MyLocationDelegate : CLLocationManagerDelegate
    {
        public override void LocationsUpdated(CLLocationManager manager, CLLocation[] locations)
        {
            //Handle your method here
        }
    }
    

    您可以使用模拟器进行测试:Debug > Location > Freeway Drive。在上述事件中将位置存储到您的沙盒文件夹中。强制退出您的应用程序,几秒钟后打开它,检索您存储的文件。您将找到所有位置记录。

    【讨论】:

    • 嗨,土地,感谢您分享您的想法。如果我不想使用重大的位置更改怎么办。如果我使用它,那么应用程序将监控重大的位置变化。但我想监控地理围栏。可能是用户进入地理围栏的情况,但由于设备时刻并不重要,因此应用程序不会在地理围栏交叉的特定时间唤醒。在处理地理围栏触发器时会非常不一致。请您分享您对此的看法。
    • 在苹果的网站上,它假定应用程序会自动在地理围栏交叉口重新启动。请查看下面的链接。 link
    • @TarunOhri 然后你可以删除它,减少 DistanceFilter 和 DesiredAccuracy。通过检测区域变化来处理你的方法。
    • 但是如果我们移除 StartMonitoringSignificantLocationChanges 那么它将如何将应用程序从终止状态唤醒到后台状态?
    • 我已经用上面的代码试过了,删除它也会唤醒应用程序。你可以用我的方式用模拟器测试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多