【问题标题】:Xamarin background disconnected signalrXamarin 后台断开信号器
【发布时间】:2019-12-07 01:48:43
【问题描述】:

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

我已经尝试过自动重新连接,甚至更改了 ServerTimeout 和 KeepAliveInterval 的时间。但我一直没有成功。应该注意的是,我居住的地方还存在严重的连接问题,但我的理论仍然是应用程序进入后台时。

这是我初始化服务的代码(我使用的是单例服务)。

       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 上断开连接,或者我的代码会做错什么?

【问题讨论】:

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


    【解决方案1】:

    您将无法在 Android 上保持 SignalR 连接处于活动状态,除非您正在运行前台服务,这实质上使应用程序保持活动状态。这就是音乐应用等可以在后台保持运行的方式。

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

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

    本质上是你创建了一个服务:

    [Service]
    public class MyForegroundService : Service
    {
    }
    

    然后你从你的 Activity 用一个 Intent 开始它:

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

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

    问题是。您真的需要前台服务并继续在后台运行 SignalR 吗?

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

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

    如果您也决定以 iOS 为目标,您将遇到更大的限制。在那里,您将无法保持 SignalR 连接。

    【讨论】:

    • 非常感谢您抽出宝贵时间,我会尝试后台服务。目前,我在 Signalr Server 上使用队列系统在离线时接收消息(ConcurrentDictionary > UnconfirmedMessages) 我认为我没有问题,当前的问题是当我尝试发送消息后离开应用程序并返回它断开连接。我只使用过来自 AppCenter 的推送通知,但我不知道如何实现它来接收信号器消息,或者您的意思是用推送通知替换信号器?
    • 我想在用户收到新消息时实现推送通知,但我不知道从哪里开始,如果您有任何链接或建议可以给我,我将不胜感激很多。
    • 通过在后台放置一个服务可以完美运行,感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2016-01-28
    • 2014-02-18
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多