Xamarin背景断开信号器

时间:2019-12-06 17:02:43

标签: android xamarin xamarin.forms signalr signalr-hub

我正在使用Xamarin Forms开发一个应用程序,该应用程序使用Signalr服务来实现聊天。该聊天在UWP版本和Android模拟器中均能完美运行,因此当我在手机(Android)上进行调试时也是如此,但是当我将手机与PC断开连接时,混乱便开始了。问题是我认为当应用程序进入后台时,它会与Signalr服务器断开连接。

我尝试过自动重新连接,甚至更改ServerTimeout和KeepAliveInterval的时间。但是我没有成功。应该注意的是,我另外居住的地方还存在主要的连通性问题,但是我的理论仍然是当应用程序转到后台时。

这是我的代码,用于初始化服务(我使用Singleton服务)。

       hubConnection = new HubConnectionBuilder()
        .WithUrl(URL, options =>
        {
            options.AccessTokenProvider = () => Task.FromResult(_myAccessToken);
        })
        .WithAutomaticReconnect()
        //.WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) })
        //.WithAutomaticReconnect(new RandomRetryPolicy())
        .Build();

这是我在关闭连接时要连接的代码

            hubConnection.Closed += async (error) =>
            {
                OnConnectionClosed?.Invoke(this, new MessageEventArgs("Connection closed...", 
                string.Empty));
                IsConnected = false;

                await Task.Delay(new Random().Next(0, 5) * 1000);
                try { await ReConnectAsync(); } catch (Exception ex) { Debug.WriteLine(ex); }
            };

这是我要连接的代码

        public async Task ReConnectAsync()
        {
            await ConnectAsync();
        }

        public async Task ConnectAsync()
        {
            if (IsConnected)
            {
                return;
            }

            Debug.WriteLine(hubConnection.State);

            if (hubConnection.State== HubConnectionState.Disconnected)
            {
                await hubConnection.StartAsync();

                //CancellationToken cancellationToken = new CancellationToken();
                //await ConnectWithRetryAsync(hubConnection, cancellationToken);
            }

            IsConnected = true;
        }

我还能尝试阻止它在Android上断开连接还是在代码中做错什么?

1 个答案:

答案 0 :(得分:2)

除非运行了Foreground Service(从本质上使App保持运行),否则您将无法在Android上保持SignalR连接处于活动状态。音乐应用程序等可以这样在后台保持运行状态。

前台服务还需要向用户显示其正在运行的通知。

Xamarin提供了一个很好的小示例,展示了如何在https://github.com/xamarin/monodroid-samples/tree/master/ApplicationFundamentals/ServiceSamples/ForegroundServiceDemo

处创建前台服务。

基本上,您创建服务:

[Service]
public class MyForegroundService : Service
{
}

然后,从您的“活动”中启动一个意图:

var intent = new Intent(this, typeof(MyForegroundService));
StartForegroundService(intent);

在您的服务中,您需要通过StartForeground覆盖调用OnStartCommand,否则该服务将被终止。

尽管有疑问。您是否真的需要前台服务并在后台继续运行SignalR?

您是否考虑过不时轮询后端以获取最新消息?

您是否考虑过在用户收到新消息时发送推送通知?

如果您决定同时定位iOS,则会遇到更大的限制。您将无法保持SignalR连接保持活动状态。

相关问题