LocationManager.DidDetermineState 中的 HTTP 请求

HTTP Request in LocationManager.DidDetermineState

我已经编写了 IBeacon 应用程序,我的目标是在应用程序处于后台时发送 Http 请求。我使用 DidDetermineState 事件来确定区域的 entrance/leave。问题是,当事件被调用时,Http 请求意外地停止在某处。没有抛出异常,无法完成请求。

奇怪的是通话在不同的线路上随机停止。

[Export ("locationManager:didDetermineState:forRegion:")]
    public void DidDetermineState (CLLocationManager manager, CLRegionState state, CLRegion region)
    {
        string message = "";
        if (state == CLRegionState.Inside) {
            message = "Inside";
            var url = String.Format ("{0}About", "https://myAPIURl/");
            try {
                var _httpClient = new HttpClient ();
                _httpClient.Timeout = TimeSpan.FromMilliseconds (30000);
                lock (_httpClient) {
                    try {
                        var getResult = _httpClient.GetAsync (url).Result;
                        if (getResult.IsSuccessStatusCode) {
                            var contentString = getResult.Content.ReadAsStringAsync ().Result;
                            var contentObject = JsonConvert.DeserializeObject<AboutUsModel> (contentString);
                            message = "result ok";
                        } 
                    }
                    //ncrunch: no coverage start
                    catch (Exception e) {
                        message = e.Message;
                    }
                }
            } catch (Exception ex) {
                message = ex.Message;
            }
        }
        if (state == CLRegionState.Outside) {
            message = "Outside";
        }
}

P.S 应用处于前台模式时请求发送成功

感谢任何帮助!

Apple 在后台获得信标回调后,只给你大约五秒的后台执行时间如果网络服务响应不够快,应用程序将直接挂起。

解决此问题的典型方法是要求额外的背景 运行 时间——您只需询问即可获得最多 3 分钟的时间。我写了一篇关于这个过程的博客 post here. 博客 post 专门关于延长背景测距时间,但同样的技术也适用于延长 Web 服务回调的时间。