iOS가 사용자가 강제 종료 한 경우 앱을 백그라운드에서 시작합니까?


219

content-available푸시 알림 에서 플래그를 사용하여 백그라운드 가져 오기를 트리거하고 있습니다. 나는이 fetchremote-notification UIBackgroundModes있었습니다.

AppDelegate.m에서 사용중인 구현은 다음과 같습니다.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

앱이 백그라운드에서 실행 중이면 정상적으로 작동합니다. (알림이 수신되고 앱은 위의 코드와 같이 "알림이있는 것처럼 보입니다"로컬 알림을 트리거했습니다.)

그러나 응용 프로그램이 실행되지 않을 때 와 푸시 통지가와 수신 content-available플래그, 응용 프로그램이 시작되지 않고didRecieveRemoteNotification대리자 메서드는 호출되지 않습니다.

멀티 태스킹의 새로운 기능 WWDC 비디오 (WWDC 2013의 # 204)는 다음을 보여줍니다.여기에 이미지 설명을 입력하십시오

content-available플래그 와 함께 푸시 알림을 받으면 응용 프로그램이 "백그라운드로 시작됩니다"라고 말합니다 .

내 앱이 백그라운드에서 시작되지 않는 이유는 무엇입니까?

실제 질문은 다음과 같습니다.

사용자가 앱을 강제 종료 한 후 iOS에서 백그라운드 작업을 수행합니까?


앱이 백그라운드에서 실행되는지 어떻게 확인합니까?
runmad

1
@runmad 나는 많은 쓰레기를 기록합니다- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Santa Claus

NSLog 만 어떻게 로깅합니까? 앱 구성표 설정에서 실행을 수동으로 설정해야합니다 (답변 참조)
runmad

@runmad 답변에 댓글을 참조하십시오
산타 클로스

@HaimBenchimol Djd 버그 보고서에 대한 답변을 받으시겠습니까? 내 버그 보고서를 제출하지 않았습니다.
산타 클로스

답변:


215

UPDATE2 :

iOS 8에 도입 된 새로운 PushKit 프레임 워크를 사용하여이 작업을 수행 있습니다 . PushKit은 VoIP에 사용됩니다. 따라서 VoIP와 관련된 사용법이어야합니다. 그렇지 않으면 앱 거부의 위험이 있습니다. ( 이 답변을 참조하십시오 ).


UDPDATE1 :

iOS8에 대한 설명서가 명확 해졌습니다 . 설명서는 여기에서 읽을 수 있습니다 . 관련 발췌문은 다음과 같습니다.

이 방법을 사용하여 앱에 대한 수신 원격 알림을 처리하십시오. application:didReceiveRemoteNotification:앱이 포 그라운드에서 실행될 때만 호출되는 메소드 와 달리 시스템은 앱이 포 그라운드 또는 백그라운드에서 실행될 때이 메소드를 호출합니다. 또한 원격 알림 백그라운드 모드를 사용하도록 설정 한 경우 푸시 알림이 도착하면 시스템에서 앱을 시작하거나 일시 중단 상태에서 해제하여 백그라운드 상태로 전환합니다. 그러나 사용자가 강제 종료 한 경우 시스템에서 자동으로 앱을 시작하지 않습니다. 이 경우 시스템이 앱을 자동으로 다시 시작하기 전에 사용자가 앱을 다시 시작하거나 장치를 다시 시작해야합니다.


WWDC 비디오에서는이를 명확하게 알 수 없지만 개발자 포럼에서 빠른 검색을 수행하면 다음과 같은 결과가 나타났습니다.

https://devforums.apple.com/message/873265#873265 (로그인 필요)

또한 앱 전환기에서 앱을 종료하면 (즉, 앱을 종료하기 위해 스 와이프하면) 푸시 알림이나 백그라운드 가져 오기에 관계없이 OS가 앱을 다시 시작하지 않습니다. 이 경우 사용자는 앱을 한 번 수동으로 다시 시작한 다음이 시점부터 백그라운드 활동이 호출됩니다. - pmarcos

그 게시물은 Apple 직원이 작성한 것이므로이 정보가 정확하다는 것을 믿을 수 있다고 생각합니다.

따라서 앱이 스위처로 스 와이프되어 앱이 종료되면 예정된 백그라운드 페치에서도 앱이 시작되지 않습니다.


2
옵션을 시작할 때 "didFinishLaunchingWithOptions"에 작업을 추가하면 작업이 완료되지 않았습니다. 여기 "didreceiveRemoteNotification"과 같은 방법이 있습니다
harsh.prasad

@ harsh.prasad : 흥미 롭습니다. 문제는 앱이 앱 스위처에서 종료되었을 때 앱이 시작되지 않았다는 것입니다.
산타 클로스

3
자동 푸시가 수신되면 앱을 앱 스위처에 표시하지 않아도됩니다. 앱 스위처에 추가하지 않고 백그라운드에서 시작할 수 있으며 실행하고 "일을 수행"한 다음 종료 할 수 있습니다. 너무 오래 활성화 된 앱은 기존과 같은 방식으로 종료됩니다.
MindJuice

1
@chrizstone 해결책은 이것이 의도 된 동작이며 그것에 대해 아무것도 할 수 없다는 것입니다.
산타 클로스

1
@JPK 어, 푸시 알림 자체는 영향을받지 않습니다. 강제 종료 후에는 작동하지 않는 백그라운드 작업을 수행하고 있습니다.
산타 클로스

70

"구성표 관리"에서 대상의 시작 설정을로 변경할 수 있습니다 Wait for <app>.app to be launched manually. 중단 점을 설정 application: didReceiveRemoteNotification: fetchCompletionHandler:하고 푸시 알림을 보내 백그라운드 시작을 트리거하여 디버깅 할 수 있습니다 .

문제가 해결 될지 확실하지 않지만 지금은 디버깅에 도움이 될 수 있습니다.

스크린 샷


이 도움이하지만 문제는 여전히 존재하므로
산타 클로스에게

이상한. 모든 플래시가 plist 등에 설정되어 있는지 두 번 이상 확인했다고 가정합니까?
runmad

또한 앱이 백그라운드에있을 때 모든 것이 완벽하게 작동하기 때문에 모든 것이 올바르게 설정되어 있음을 알고 있습니다. 앱이 전혀 실행되지 않는 경우에만 실행됩니다.
산타 클로스

푸시 알림 시작 트리거가 시스템 결정인지 궁금합니다. 예를 들어 iOS에서 지금 앱을 시작하기에 늦지 않다고 판단하면 나중에 연기 할 수 있습니다. 아마도 실행중인 백그라운드 앱을 모두 닫고 어떻게되는지 보시겠습니까? 나는이 시점에서 추측하고있다 :-/
runmad

그냥 시도했습니다. 평소처럼 아무 일도 일어나지 않았습니다. 개발자 포럼을 요청할 수 있습니다.
산타 클로스

37

대답은 예이지만 '배경 페치'또는 '원격 알림'을 사용해서는 안됩니다. PushKit은 당신이 원하는 답입니다.

요약하면 iOS 8의 새로운 프레임 워크 인 PushKit은 새로운 푸시 알림 메커니즘으로, 앱 전환기에서 스 와이프하여 앱이 종료 된 경우에도 시각적 경고 프롬프트없이 앱을 백그라운드에서 자동으로 시작할 수 있습니다. 앱 스위처에서.

Apple의 PushKit 참조 :

PushKit 프레임 워크는 iOS 앱이 원격 서버에서 푸시를 수신 할 수있는 클래스를 제공합니다. 푸시는 표준 및 VoIP의 두 가지 유형 중 하나 일 수 있습니다. 표준 푸시는 이전 버전의 iOS에서와 같이 알림을 전달할 수 있습니다. VoIP 푸시는 사용자에게 알림을 표시하기 전에 VoIP 앱에 필요한 푸시 처리를 수행하는 데 필요한 표준 푸시 외에 추가 기능을 제공합니다.

이 새로운 기능을 배포하려면 다음 자습서를 참조하십시오 : https://zeropush.com/guide/guide-to-pushkit-and-voip- 장치에서 테스트했으며 예상대로 작동합니다.


9
VoIP를 사용하도록 앱을 설정 해야하는 것 같습니다. 앱이 실제로 VoIP 앱이 아닌 경우 검토 중에 거부되지 않습니까?
duncanc4

6
불행히도 Apple의 검증 프로세스를 알면 응용 프로그램이 거부 된 것이 합리적입니다.
Kepa Santos

3
VoIP에 사용됩니다. 사용자에게 VoIP를 사용하지 않으면 검토 거부 위험이 크게 높아집니다.
Chris

대형 공급 업체가이 시설을 백그라운드에서 물건을 실행하는 변명으로 사용하고 있고 Apple이 눈을 멀게하고있는 것 같습니다. 한 번에 Android 하나의 기능이되었습니다.
TCB13

PushKit은 VoIP, 파일 공급자 및 감시 합병증을 위해 예약되어 있습니다. 이 답변에서 설명하는 사용 사례에는 사용할 수 없습니다.
quellish

15

실제로 백그라운드 가져 오기를 테스트 해야하는 경우 체계에서 하나의 옵션을 활성화해야합니다.

bg 페치 사용

테스트하는 다른 방법 : bg 반입 시뮬레이션

이 새로운 기능에 대한 자세한 정보는 다음과 같습니다. http://www.objc.io/issue-5/multitasking.html


4

나는 며칠 동안 다른 변형을 시도해 왔으며 하루 동안 사용자가 스 와이프하여 죽일 때에도 백그라운드에서 앱을 다시 시작한다고 생각했지만 그 동작을 복제 할 수는 없습니다.

불행히도 행동이 이전과는 상당히 다르다는 것입니다. iOS 6의 경우 흔들림 아이콘에서 앱을 종료 한 경우 SLC 트리거에서 다시 깨울 수 있습니다. 지금, 당신이 슬쩍하여 죽이면, 그것은 일어나지 않습니다.

그것은 다른 행동이며, iOS 6에서 앱을 죽인 경우 앱에서 유용한 정보를 계속 얻는 사용자는 이제는 그렇지 않습니다.

우리는 사용자가 앱을 죽이려고 스 와이프했지만 여전히 알림을 제공하는 데 사용 된 일부 알림 동작을 기대하고 있다면 앱을 다시 열도록해야합니다. 사용자가 앱을 스 와이프 할 때 이것이 분명하지 않을까 걱정됩니다. 결국 기본적으로 정리 된 앱을 정리하거나 최소화하려는 앱일 수 있습니다.


2
그것이 우리가 한 것 (applicationWillTerminate)이지만, 적어도 iOS 7에서는 메모리 제거 중에 알림을 보낸 것으로 생각하지 않습니다 .OS 업그레이드를 위해 재부팅하기 직전에 알림을 표시했음을 알았습니다. 드물게 그렇게 나쁘지 않은 것 같습니다.
snarshad

"iOS 6의 경우 흔들리는 아이콘에서 앱을 종료 한 경우에도 SLC 트리거에서 다시 깨울 수 있습니다. 이제 스 와이프하여 죽인 경우에는 발생하지 않습니다." 이제는 iOS 7 초기 버전에서 일시적인 회귀가 발생했습니다.
funkybro

3

이것은 당신을 도울 수 있습니다

대부분의 경우 시스템은 사용자가 강제 종료 한 후에 앱을 다시 시작하지 않습니다. 한 가지 예외는 위치 앱이며, iOS 8 이상에서는 사용자가 강제 종료 한 후 다시 시작됩니다. 그러나 다른 경우에는 시스템에서 앱을 백그라운드에서 자동으로 시작하기 전에 사용자가 앱을 명시 적으로 시작하거나 장치를 재부팅해야합니다. 기기에서 비밀번호 보호를 사용하도록 설정하면 사용자가 기기를 잠금 해제하기 전에 시스템이 백그라운드에서 앱을 시작하지 않습니다.

출처 : https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.