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();
}
}
이 포스트를 보라.
훌륭한 설명 Gerald에게 감사드립니다! 휴대 전화를 잠 그거나 앱이 백그라운드 상태로 전환 될 때 작업을 완전히 중단 할 수있는 방법이 있는지 말해 줄 수 있습니까? 가져 오기 작업을 완료하는 데 거의 5 분이 걸리는 것을 알았으므로 백그라운드에서 수행하지 않으려 고합니다. 아니면 괜찮습니까? –
당신이 할 수있는 유일한 일은 앱이 배경으로 가고 있다는 것을 감지하고 일시 중지하는 것입니다. 'App.xaml.cs'에서 기본 이벤트를 확인하십시오. 나는 당신이 장치가 구체적으로 잠겨 있음을 감지 할 수 있다고 생각하지 않는다. 그러나 아마도 배경으로가는 이벤트가 아마 호출되기 때문에 그렇게하지 않아도됩니다. –