2016-02-22 9 views
9

Aktualnie tworzymy aplikację, która jest rodzajem "dodatkowej" aplikacji dla naszej głównej aplikacji, aby rozszerzyć jej możliwości.Komunikacja między 2 aplikacjami na tym samym urządzeniu iOS/Android z Xamarin

Zadaliśmy sobie pytanie, czy istnieje prosta komunikacja między aplikacjami na tym samym urządzeniu (nic nie znaleziono w Internecie dla tego ...). Naszą pierwszą myślą było stworzenie gniazda serwera w naszej aplikacji dodatkowej i wysłanie do niego danych z głównej aplikacji.

Oto kod C# dla serwera:

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); 

       } 
      } 
     } 
    } 

I dla klienta:

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(); 
    } 

To nie wydaje się działać, bo my nasz główny app bierze ostrość, add-on aplikacji wydaje się zatrzymać słuchający.

Czy jest to ogólny sposób komunikacji między tymi dwoma aplikacjami (zawsze na tym samym urządzeniu) lub czy będziemy musieli opracować osobne rozwiązanie? jeśli oddzielne rozwiązania, jakie jest najlepsze rozwiązanie dla systemu iOS? Android? Użyliśmy Xamarin dla naszej aplikacji dodatkowej, a obecnie kierujemy ją tylko na iOS i Androida.

Uwaga: ponieważ to to samo urządzenie, nie chcemy używać odległych usług sieciowych do komunikacji.

+0

Czy aplikacja dodatkowa ma interfejs użytkownika, czy tylko udostępnia funkcje tła? Lokalna usługa uruchomiona na urządzeniu może być częścią rozwiązania, albo jako "most" w poprzednim przypadku, albo jako dostawca dodatkowej funkcjonalności w tym drugim. –

+0

Dodatkowa aplikacja będzie miała swój własny interfejs, jeśli będzie to potrzebne, ale głównie działa jako usługa. Wygląda jednak na to, że usługa lokalna jest dostępna tylko dla systemu Android (inaczej jest nazwana inaczej w systemie iOS, a ja jej nie znalazłem). – cdie

+0

Wymagania dotyczące Sandboxing w iOS zapobiegną temu zjawisku, możesz komunikować się między dwiema aplikacjami, korzystając z nowej architektury rozszerzeń wprowadzonej https://developer.apple.com/app-extensions/ – Clint

Odpowiedz

0

Po wielu poszukiwaniach wydaje się, że jedynym rozwiązaniem "wieloplatformowym" jest Url Scheme.

na iOS: https://developer.xamarin.com/recipes/cross-platform/app-links/app-links-ios/

Dla Androida: https://developer.xamarin.com/recipes/cross-platform/app-links/app-links-android/

Wydaje się, że Android może obsługiwać do 1 MB danych, by być przenoszony w intencji oraz iOS może obsłużyć aż umożliwić pamięci systemowej w adresie URL. Będziemy kodować dane 64, aby przekazać je dla systemu iOS i dodać je jako base64 w tablicy extraString dla Androida.

Będziemy musieli stworzyć Android Activity i iOS ViewController do obsługi połączeń Url, więc jest to specyficzne dla platformy, ale główna inteligencja może być dzielona między platformami.

Dzięki temu nasza aplikacja do dodawania nie musi być rozszerzeniem aplikacji iOS i może mieć własny interfejs i ekrany.

+0

Czy znasz sposób komunikacji z "usługami" (brak interfejsu użytkownika)? Jak opisano tutaj: https://forums.xamarin.com/discussion/66481/microservices-simple-message-broker#latest – Apidcloud

Powiązane problemy