iOS/Android设备上两个应用程序之间的通信,使用Xamarin

13

我们目前正在开发一款应用程序,这是我们主要应用程序的一个“插件”应用程序,以扩展其功能。

我们思考是否有简单的同一设备内应用程序间通信方式(在互联网上没有找到相关内容…)。我们最初的想法是在我们的插件应用程序上创建一个服务器套接字,并从主应用程序向其发送数据。

下面是服务器端的C#代码:

    public async Task Start()
    {
        Listener = new TcpListener(IPAddress.Parse(GetIP()), 7777);
        var client = Listener.AcceptTcpClient();
        while (true)
        {
            while (!client.GetStream().DataAvailable) ;
            using (NetworkStream stream = client.GetStream())
            {
                byte[] data = new byte[client.Available];
                stream.Read(data, 0, client.Available);
                if (data.Length > 0)
                {
                    String s = Encoding.UTF8.GetString(data);
                    if (!string.IsNullOrWhiteSpace(s))
                        OnMessageRecevied?.Invoke(s);

                }
            }
        }
    }

对于客户端:

    public async Task SendMessage(string msg)
    {
        tClient = new TcpClient();
        var buffer = Encoding.UTF8.GetBytes(msg);
        while (!tClient.Connected)
        {
            tClient.Connect(IPAddress.Parse(Server.GetIP()), 7777);
            Thread.Sleep(100);
        }
        await tClient.GetStream().WriteAsync(buffer, 0, buffer.Length);
        tClient.Close();
    }

似乎不起作用,因为我们的主应用程序获取了焦点,插件应用似乎停止了监听。

这是两个应用程序之间通信的通用方式吗(始终在同一设备上),还是我们必须开发单独的解决方案?如果需要单独的解决方案,对于iOS和Android来说哪种是最好的解决方案?我们使用Xamarin制作Add-on应用程序,并且目前仅针对iOS和Android。

注意:由于是同一设备,我们不想使用远程Web服务进行通信。


插件应用程序是否会有用户界面,还是仅提供后台功能?设备上运行的本地服务可以成为解决方案的一部分,在前一种情况下作为“桥梁”,在后一种情况下作为附加功能的提供者。 - Mark Larter
如果需要,附加应用程序将拥有自己的用户界面,但主要作为服务运行。然而,似乎本地服务仅适用于Android(或在iOS中命名不同,我还没有找到它)。 - cdie
iOS的沙盒要求将防止这种情况发生,您可以使用新引入的扩展架构在两个应用程序之间进行通信。https://developer.apple.com/app-extensions/ - Clint
好的,但是似乎 iOS 的扩展不允许在后台运行... 那么我们怎样才能与主应用程序建立对话以检索和发送数据呢? - cdie
你有生成插件应用程序的教程链接吗?我需要同样的东西。 - Reihaneh Khaksaran
1个回答

1
经过多次搜索,似乎唯一的“跨平台”解决方案是Url Scheme。
对于iOS:https://developer.xamarin.com/recipes/cross-platform/app-links/app-links-ios/ 对于Android:https://developer.xamarin.com/recipes/cross-platform/app-links/app-links-android/ 似乎Android可以处理1Mb的数据以在意图中传递,而iOS可以处理URL中系统内存允许的任何数量。我们将使用base64url编码数据来传递iOS,并将其作为base64添加到intent的extraString数组中以用于Android。
我们需要创建一个Android Activity和一个iOS ViewController来处理Url的调用,因此这是特定于平台的,但主要智能可以在平台之间共享。
通过这样做,我们的插件应用程序将不需要成为iOS应用程序的扩展,并且可以拥有自己的界面和屏幕。

1
你知道一种与“服务”(无UI)通信的方法吗?如此描述:https://forums.xamarin.com/discussion/66481/microservices-simple-message-broker#latest - Apidcloud
@Apidcloud 你找到任何解决方案了吗? - Reihaneh Khaksaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接