[iOS] Push Notification – 앱 삭제 여부 판별이 가능한가?

‘앱이 Push Notification(푸쉬 알림)을 정상적으로 수신 가능한지 서버에서 판별할 수 있을까?’ 란 의문이 들었다. (‘앱에서 푸쉬 알림을 정상적으로 수신했느냐?’ 와는 다름)

개발 서버에서 APNS (Apple Push Notification Service)에 푸쉬 알림을 신청하기 전(또는 직후)에 디바이스로의 전달여부를 파악할 수 있다면, 실패시 사용자에게 다른 액션을 취할 수 있을 것이다.

APNS가 전송을 100% 보장하지 않음을 알고 있었지만, 혹시나 하는 맘에 iOS Developer Library를 다시 한번 들춰 보았다.

검토한 결론은 아래와 같다.

  • 앱이 삭제된 경우는 확인할 수 있다. (Feedback 서비스)
  • 앱에서 Push Notification 수신을 허가한 후, 사용자가 설정에서 알림 받기 거부로 설정한 경우는.. 명확치 않다. (Feedback 서비스를 통해 식별 가능한지 테스트가 필요하다. 안될 것 같긴 하다. )
  • 실제 디바이스에 푸쉬 알림이 도착했는지에 대한 여부는 알 수 없다.
  • 디바이스가 장시간 꺼져 있거나 잠시 꺼져있는 동안 여러 개의 푸쉬 알림이 온 경우,  알림이 유실될 수 있다.

이와 관련한 iOS Developer Library 문서 내용을 이번 포스팅에서 정리한다. (서버를 이용한 실제 테스트는 차후 해볼 예정이다.)

Push Notification

기본적으로 Push Notification 은 단방향 서비스이다. 개발 서버에서 APNS 에 푸쉬 알림을 요청하면 APNS가 알아서 디바이스에 전송한다. 개발 서버는 APNS에 요청하면 할 일은 끝이다.

 

< from iOS Developer Library >

개발 서버는 APNS 에 푸쉬 알림을 요청할 때, 데이터 format 등에 대한 정상 여부는 리턴 받지만 실제 도착여부에 대해서는 리턴을 받지 못한다.

앞에서도 언급했듯이 APNS 는 100% 전송을 보장하지 않는다. 개발문서에서 기술하고 있는 유실 케이스는 디바이스 전원이 꺼져있는 경우다. APNS의 QoS (Quality of Service) 컴포넌트는 디바이스 전원이 꺼져있는 경우, Notification을 잠시 저장했다가 다시 사용 가능해질 때 Notification이 전달되도록 하지만, 다음의 경우 저장된 Notification이 폐기된다.

  • 잠시 꺼져 있는 경우(얼마나 잠시인지 명시되지 않았음) , APNS는 Notification을 저장을 하는데 저장 가능한 Notificaiton은 하나다. 디바이스가 꺼졌있는 동안 하나의 앱에서 여러 개의 푸쉬 알림을 보낸다면, 제일 나중에 보내진 Notification만 저장되어 전달된다. 이전에 저장된 Notification 은 폐기된다.
  • 장시간 꺼져 있는 경우 (장시간이 얼마나인지는 명시되지 않았음), 저장된 Notification은 폐기된다.

개인적으로 아이폰 베터리가 다되어 충전 후 다시 켰을 때, 하나의 앱에서 여러 개의 푸쉬가 전달되는 경험을 한 것 같다. 애플 내부에서 개선이 되고 있는데 여전히 100% 장담이 안되어 개발 문서를 업데이트 하지 않은 건지, 아니면 본인의 착각인지 이것도 테스트 해봐야 겠다.

Feedback Service

The feedback service gives providers information about notifications that could not be delivered—for example, because the target app is no longer installed on that device. For more information, see “The Feedback Service.”

위 개발 문서의 내용과 같이 Feedback 서비스는 Notification 전달 실패 정보를 개발 서버에 알려주기 위한 서비스다. APNS는 Feedback 서비스를 이용한다. (Feedback 서비스를 통해 불필요한 푸쉬 요청을 피하고 전반적인 Performance 향상을 얻을 수 있다.)

푸쉬 알림이 앱이 삭제된 이유로 전달되지 못했다면 , APNS 는 이를 Feedback 서비스에 알리고 Feedback 서비스는 실패한 디바이스의 토큰을 리스트에 저장한다. APNS 에서 푸쉬 알림을 디바이스로 전송하기 전에 실패한 – data format error 등  – 경우에는 Feedback 서비스의 리스트에 등록되지 않는다. (APNS는 실제로 디바이스에 Notification을 전달해보고 앱의 삭제 여부를 파악하는 듯하다.)

몇 번이고 확인해봤지만, 사용자가 Push 접근을 허락한 이후 설정에서 이 기능을 disabled 한 케이스에 대해선 언급이 없다. 실제로 ‘알림센터에서 보기’를 끄더라도 알림 타입이 ‘None’이 아닌 다른 것 – 배너 등- 으로 선택되어 있다면 푸쉬 알림을 받는다. 앱의 푸쉬 알림에 대한 모든 설정을 전부 Off 로 해놔야 특정 앱에 대한 푸쉬 알림을 받지 못하는데, 이 경우에 Feedback 리스트에 등재가 될지 테스트를 해봐야겠다.

개발 서버는 APNS 연결과는 별개로 Feedback 서비스에 접속해서 디바이스 토큰 리스트를 요청해야 한다. Feedback 서비스는 리스트가 요청될 때마다 리스트를 전달한 후 리스트를 초기화(clear) 한다.

Feedback 서비스로부터 받은 리스트의 데이터에는 timestamp 정보가 포함되어 있다. 이를 이용하여 리스트에 있는 디바이스 토큰이 Push Service에 재등록되어 있는지를 확인할 수 있다. (푸쉬 알림을 보낸 시각과 디바이스 토큰의 timestamp 를 비교하면 디바이스 토큰의 재등록 여부를 확인할 수 있을 것 같다.)

< Binary format of a feedback, from iOS Developer Library >

Feedback 서비스로의 요청을 위한 url, port 및 format 등의 내용은 The Feedback Service를 참고하자.

개발 문서에는 적어도 하루에 한번 Feedback 서비스를 확인하라고 나왔는데, 서비스마다 Push Notification 이용처가 다르니 필요에 따라/용도에 맞게 확인 주기를 결정해야 할 것 같다.

삭제된 앱이 삭제되기 전 디바이스에 남은 최후의 push-enabled 앱이였다면, 앱이 삭제되는 순간 디바이스와 push service 간의 커넥션이 끊겨버려 Feedback 서비스에 추가되지 않는다고 한다. (아마 개발폰일 경우에나 간혹 발생할 일일 것 같다.)

마무으리

몰랐던 내용을 알아서 좋긴 한데, 찾고 있던 답은 아닌 것 같다. 좀 더 고민해보고 테스트해서 결론을 정리하자.

* Reference

 

Advertisements
Leave a comment

1 Comment

  1. yiabb

     /  December 6, 2014

    Apns 도달통계는 볼수있는데가 없나요?

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: