2016-09-20 1 views
2

Ich mache diese App in Xamarin Formen (PCL - iOS und Android), wo ich eine große Daten vom Server abrufen (mit httpclient), zeige ich Fortschritte Dialog, um dem Benutzer anzuzeigen, dass Daten abgerufen werden.Eine Aufgabe in iOS im Hintergrund fortsetzen, wenn das Telefon gesperrt ist

Lets sagen, Benutzer versehentlich das iPhone gesperrt, das sind die Dinge, die ich sehe, dass in meiner App geschieht.

  1. Geht in den Hintergrund. Aber dann scheint diese App beendet zu werden.
  2. Entsperren des Telefons wird der App mit dem gleichen Bildschirm dargestellt, die vor dem Entriegeln aber kein Hintergrundprozess gezeigt wurde passiert

Meine Anfragen (wahrscheinlich weil App beendet (aber, warum beendet app)?): 1. Warum fährt die App nicht mit dem Datenabruf fort? Scheint in Android gut zu funktionieren. 2. Was passiert eigentlich mit den Aufgaben, sobald das iPhone gesperrt ist? 3. Wie führe ich die Aufgabe im Hintergrund in iOS weiter, sage ich, dass ich den http-Aufruf in pcl ausführe?

Antwort

3

Hier unterscheiden sich iOS und Android. Während Xamarin es einfacher macht, für beide zu entwickeln, sind sie am Ende nur noch Android- und iOS-Apps, die den Regeln dieses Betriebssystems entsprechen müssen.

In iOS, wie der Version 9 können Sie Code im Hintergrund nicht ausführen, im Gegensatz zu Android, wo Sie können. Für iOS musst du dafür etwas zaubern. Es gibt this blogpost, denen Sie folgen können, beschreibt etwas was Sie tun möchten.

Er sagt;

Backgrounding ist der Begriff, den wir für den Prozess nutzen, um einige der Code in unserer App zuzulassen auszuführen fortzusetzen, während eine andere App im Vordergrund ist. Auf iOS, vor iOS 9, darf nur eine einzige Anwendung den Code gleichzeitig ausführen. Dies wird als Vordergrund-App bezeichnet. Wenn Sie Ihren Code nicht ändern, um iOS mitzuteilen, dass Sie Code im Hintergrund ausführen möchten, wird Ihre App zwangsweise beendet und aus dem Speicher entfernt, wenn Ihr Code im Hintergrund ausgeführt werden soll. Android ermöglicht tatsächlich Code in einer Hintergrundaktivität ausführen, aber Hintergrundaktivitäten sind eine der ersten Dinge, die beendet werden, wenn das Betriebssystem mehr Arbeitsspeicher benötigt. Stattdessen sollten wir unter Android eine andere spezielle Klasse namens Service verwenden.

So haben Sie auch einen anderen Blick auf, wie Sie es in Android tun, denn wenn Sie es falsch machen, wird Ihre Übertragung ebenfalls unterbrochen werden.

Für iOS Implementierung in der er verwendet diese:

In der AppDelegate.cs Datei im iOS Projekt werden wir Messaging -Center verwenden, um die Start- und Stopp-Nachrichten zu abonnieren. Für die Bequemlichkeit, Ich habe die iOS Apis in eine andere Klasse namens iOSLongRunningTaskExample gewickelt. Die wichtigen Methoden hier für iOS sind UIApplication.SharedApplication.BeginBackgroundTask ("LongRunningTask", OnExpiration) und UIApplication.SharedApplication.EndBackgroundTask (taskId).Dies sind die Methoden, die iOS sagen, dass wir Code im Hintergrund ausführen und unsere App nicht beenden werden.

er dann setzt sie wie folgt aus:

[Register ("AppDelegate")] 
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 
{ 
    public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
    { 
     MessagingCenter.Subscribe<StartLongRunningTaskMessage> (this, "StartLongRunningTaskMessage", async message => { 
      longRunningTaskExample = new iOSLongRunningTaskExample(); 
      await longRunningTaskExample.Start(); 
     }); 

     MessagingCenter.Subscribe<StopLongRunningTaskMessage> (this, "StopLongRunningTaskMessage", message => { 
      longRunningTaskExample.Stop(); 
     }); 
    } 
} 

public class iOSLongRunningTaskExample 
{ 
    nint _taskId; 
    CancellationTokenSource _cts; 

    public async Task Start() 
    { 
     _cts = new CancellationTokenSource(); 

     _taskId = UIApplication.SharedApplication.BeginBackgroundTask ("LongRunningTask", OnExpiration); 

     try { 
      //INVOKE THE SHARED CODE 
      var counter = new TaskCounter(); 
      await counter.RunCounter(_cts.Token); 

     } catch (OperationCanceledException) { 
     } finally { 
      if (_cts.IsCancellationRequested) { 
       var message = new CancelledMessage(); 
       Device.BeginInvokeOnMainThread (
        () => MessagingCenter.Send(message, "CancelledMessage") 
       ); 
      } 
     } 

     UIApplication.SharedApplication.EndBackgroundTask (_taskId); 
    } 

    public void Stop() 
    { 
     _cts.Cancel(); 
    } 

    void OnExpiration() 
    { 
     _cts.Cancel(); 
    } 
} 

Für die Details einen Blick auf die Post haben.

+0

Danke für die ausgezeichnete Erklärung Gerald! Können Sie mir sagen, ob es eine Möglichkeit gibt, die Aufgaben insgesamt zu stoppen, wenn ich das Telefon sperre oder die App in den Hintergrund wechselt? Da ich jetzt herausgefunden habe, dass das Holen fast 5 Minuten dauert, möchte ich es nicht im Hintergrund machen. Oder ist es in Ordnung? –

+0

Das einzige, was Sie tun können, ist zu erkennen, dass Ihre App in den Hintergrund geht und es oder etwas pausiert. Überprüfen Sie die Standard-Ereignisse in Ihrem 'App.xaml.cs'. Ich glaube nicht, dass Sie erkennen können, dass das Gerät gerade gesperrt wird. Aber vielleicht müssen Sie das nicht, weil dann wahrscheinlich auch die Veranstaltung für den Hintergrund aufgerufen wird. –

Verwandte Themen