2016-02-22 10 views
9

Attualmente stiamo sviluppando un'applicazione che è una sorta di app "add-on" per la nostra app principale per estendere le sue possibilità.Comunicazione tra 2 app sullo stesso dispositivo iOS/Android con Xamarin

Ci siamo chiesti se c'è una comunicazione inter-app semplice sullo stesso dispositivo (niente trovato su Internet per questo ...). Il nostro primo pensiero è stato quello di creare un socket server sulla nostra app aggiuntiva e inviare i dati dall'app principale ad esso.

Ecco codice C# per il server:

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

       } 
      } 
     } 
    } 

E di cliente:

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

Non sembra funzionare, perché noi la nostra applicazione principale si messa a fuoco, l'add-on app sembra di smettere ascoltando.

Si tratta di un modo generico di comunicazione tra queste due app (sempre sullo stesso dispositivo) o dovremo sviluppare una soluzione separata? se soluzioni separate, qual è la soluzione migliore per iOS? Android? Abbiamo usato Xamarin per la nostra app aggiuntiva e attualmente utilizziamo solo iOS e Android.

Nota: poiché è lo stesso dispositivo, non vogliamo utilizzare il servizio web remoto per comunicare.

+0

L'app aggiuntiva ha un'interfaccia utente o fornisce solo funzionalità in background? Un servizio locale in esecuzione sul dispositivo potrebbe essere parte della soluzione, sia come "ponte" nel primo caso, sia come fornitore di funzionalità aggiuntive in quest'ultimo. –

+0

L'app aggiuntiva avrà la propria interfaccia utente se necessario, ma funziona principalmente come servizio. Tuttavia, sembra che il servizio locale sia disponibile solo per Android (o lo si chiami diversamente in iOS e non l'ho trovato) – cdie

+0

I requisiti sandbox di iOS impediranno questo genere di cose, puoi comunicare tra due app utilizzando la nuova architettura delle estensioni introdotta https://developer.apple.com/app-extensions/ – Clint

risposta

0

Dopo molte ricerche, sembra che l'unica soluzione "multipiattaforma" sia Url Scheme.

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

Per Android: https://developer.xamarin.com/recipes/cross-platform/app-links/app-links-android/

Sembra che Android in grado di gestire 1MB di dati da passare in un intento, e iOS in grado di gestire tanto quanto la memoria di sistema permette di URL. Base64url codificheremo i dati per passarlo per iOS e aggiungerlo come base64 nell'array extraString di intent per Android.

Dovremo creare un'attività Android e un ViewController iOS per gestire le chiamate dell'URL, quindi questa è una piattaforma specifica, ma l'intelligence principale può essere condivisa tra le piattaforme.

In questo modo, la nostra app aggiuntiva non deve essere un'estensione dell'app iOS e può avere una propria interfaccia e schermate.

+0

Conosci un modo per comunicare con i "servizi" (nessuna interfaccia utente)? Come descritto qui: https://forums.xamarin.com/discussion/66481/microservices-simple-message-broker#latest – Apidcloud

Problemi correlati