2016-09-20 2 views
2

서버에서 대용량 데이터 (httpclient 사용)를 가져 오는 Xamarin 양식 (PCL - ios 및 Android)에서이 앱을 수행 중이며 진행 상황을 보여줍니다. 대화 상자를 사용하여 데이터를 가져 오는 중임을 사용자에게 표시합니다.휴대 전화가 잠겨있는 경우 iOS의 작업을 계속 진행하십시오.

사용자가 우연히 아이폰을 잠그면, 이는 내 앱에서 발생하는 것입니다.

  1. 배경으로 이동합니다. 하지만 그 응용 프로그램이 끝난 것 같다.
  2. 전화를 잠금 해제, 응용 프로그램은 잠금 해제하기 전에 보였다 같은 화면이 나타되어 있지만 백그라운드 프로세스는 일어나지

내 쿼리 (응용 프로그램이 종료 이유는 응용 프로그램이 종료 (그러나 아마 때문에)?) : 1. 왜 앱에서 데이터 가져 오기를 계속하지 않습니까? 안드로이드에서 잘 작동하는 것 같습니다. 2. 아이폰이 잠기면 실제로 작업이 어떻게됩니까? 3. iOS의 백그라운드에서 작업을 계속 수행하려면 pcl에서 http 호출을 실행한다고합니다.

답변

3

iOS와 Android가 다른 곳입니다. Xamarin은 두 가지 모두를 쉽게 개발할 수 있지만 결국에는 해당 운영 체제의 규칙을 준수해야하는 Android 및 iOS 앱입니다.

iOS의 경우 버전 9부터 Android에서 가능한 반대로 백그라운드에서 코드를 실행할 수 없습니다. iOS의 경우이를 위해 약간의 마법을 사용해야합니다. this blogpost 당신이 할 수있는 일은 다소 묘사되어 있습니다.

그는;

배경 처리는 우리가 다른 앱이 전경에있는 동안 계속 실행하는 우리의 응용 프로그램에 코드의 일부를 허용하는 공정에 사용하는 용어입니다. iOS에서는 iOS 9 이전에는 코드 한 번에 하나의 앱만 실행할 수 있습니다. 이를 포 그라운드 앱이라고합니다. 코드를 변경하지 않고 iOS에 코드 을 실행할 것을 알리면 코드가 백그라운드에서 실행될 경우 앱이 강제 종료되고 메모리에서 가 제거됩니다. Android는 실제로 백그라운드 작업에서 코드를 실행할 수 있도록 허용하지만 백그라운드 작업은 운영 체제에 더 많은 메모리가 필요하면 의 경우 종료되는 첫 번째 작업 중 하나입니다. 대신 안드로이드에서 은 서비스라는 또 다른 특별한 클래스를 사용해야합니다.

잘못 입력하면 전송이 중단되기 때문에 안드로이드에서 어떻게 사용하는지 또 한번 살펴보십시오.

은 아이폰 OS를의 구현을 위해 그는이를 사용하여 아이폰 OS 프로젝트의 AppDelegate.cs 파일에서

, 우리는 메시지를 시작으로 구독 중지하는 메시징 센터를 사용합니다. 편의상, iOS API를 iOSLongRunningTaskExample이라는 다른 클래스에 래핑했습니다. iOS의 중요한 메소드는 UIApplication.SharedApplication.BeginBackgroundTask ("LongRunningTask", OnExpiration) 및 입니다.이것들은 이고 iOS에게 우리가 배경 코드 에서 코드를 실행하고 우리의 앱을 종료하지 않을 것이라고 알려주는 메소드입니다.

그는 다음과 같이이를 구현 : 자세한 사항은

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

이 포스트를 보라.

+0

훌륭한 설명 Gerald에게 감사드립니다! 휴대 전화를 잠 그거나 앱이 백그라운드 상태로 전환 될 때 작업을 완전히 중단 할 수있는 방법이 있는지 말해 줄 수 있습니까? 가져 오기 작업을 완료하는 데 거의 5 분이 걸리는 것을 알았으므로 백그라운드에서 수행하지 않으려 고합니다. 아니면 괜찮습니까? –

+0

당신이 할 수있는 유일한 일은 앱이 배경으로 가고 있다는 것을 감지하고 일시 중지하는 것입니다. 'App.xaml.cs'에서 기본 이벤트를 확인하십시오. 나는 당신이 장치가 구체적으로 잠겨 있음을 감지 할 수 있다고 생각하지 않는다. 그러나 아마도 배경으로가는 이벤트가 아마 호출되기 때문에 그렇게하지 않아도됩니다. –

관련 문제