티스토리 뷰
[iOS] push 메세지 내용 변경하기, 특정 push 안받게 하기? ( feat. slient push )
SweetDev 2020. 7. 31. 18:03iOS10 이전에는 푸시는 서버에서 오는 메세지를 바꿀 수 없었다. 무조건 오는 그대로! 보여줬어야 했다.
하지만 iOS10부터, (silent notification이 아닌 경우에 한하여) UNNotificationServiceExtension을 만들어서 push notification의 내용을 변경하는것이 가능해졌다.
먼저, 서버에서 푸시를 보낼 때 내용에 mutable-content: 1을 꼭 써줘야 한다. 이걸 써줘야 UNNotificationServiceExtension이 콜 되기 때문!
이 extension은 Xcode에서 아예 다른 타겟으로 분리해서 만들어야 하고 (delegate가 아니라 아예 App Extenstion으로 분리되어있기 때문이다), NotificationService class 에 두개의 함수를 채택해야 한다.
1. didReceiveNotificationRequest withContentHandler - 기기에 push가 receive되고, 사용자에게 보여주기 전에 콜 된다. 여기에서 내용을 바꿔주면 된다. 푸시를 아예 안보여주는건 불가능하다. 함수를 콜을 안해줘서 iOS에서 자동으로 일정 시간이 지나면 푸시를 그대로 보여줘 버린다. 이에 대한 내용은 밑에서 더 설명함.
2. serviceExtensionTimeWillExpire - notifies your application if didReceive withContentHandler did not complete in time 오류시 콜되는 함수 정도?
그리고 push가 오는데 그 push를 사용자가 받지 않게 필터링 하는것은 iOS에서는 불가능하다. 안드로이드에서는 푸시를 보여줄지 여부를 앱에서 결정할 수 있는데, iOS는 앱이 아예 꺼져있는 상태에서는 push가 오면 무조건 띄워주긴 해야한다. 앱이 백그라운드와 포그라운드 상태일 때는 핸들링 할 수 있는 함수가 있어서 안보여줄 수도 있다.
[백그라운드]
func application(_: UIApplication, didReceiveRemoteNotification userInfo)
[포그라운드]
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification)
하지만 아예 방법이 없는건 아닌데, slient notification을 쓰면 앱이 꺼져있을 때도 push를 사용자에게 보여줄 지 핸들링 할 수 있다. 하지만 여러가지 치명적인 단점이 있는데, 한시간에 2-3개 밖에 못보내고 push가 무조건 receive된다는 보장이 없다. 그리고 글의 처음에서 말했듯이, UNNotificationServiceExtension을 사용할 수 없다.
그러면 이 slient notification은 왜 쓰는걸까?? slient notification 자체는, 애초부터 유저에게 푸시를 보여주려는 의도로 만들어진건 아니다. slient notification이 들어오면, iOS가 앱을 자동으로 백그라운드로 띄워준다. 그러면 아까 언급했던 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) 이 함수가 콜 될거고, 개발자는 그 사이에 앱이 content를 미리 다운받거나, 정보를 동기화 시키거나, 하는 등의 액션을 미리 처리해둘 수 있는 것이다. 애초부터 푸시를 위한 함수가 아니라서, 내용을 바꾸거나, 하는 등의 액션은 불가능 한 것이다.
[공식 문서]
developer.apple.com/documentation/usernotifications/unnotificationserviceextension
[참고 자료]
'macOS, iOS' 카테고리의 다른 글
[iOS] 앱에 jwt 적용하기 - false가 오면 refresh해주고, 원 함수를 콜해주는 알고리즘? (0) | 2020.07.31 |
---|---|
[iOS] scrollview 안에 textview 넣기 (0) | 2020.07.31 |
[iOS] JSON 형식의 푸시 처리하기 (0) | 2020.07.31 |
[iOS] Alamofire - 'there is no such file' 문제 (1) | 2020.07.19 |
[iOS] long press touch 처리하기 (0) | 2020.07.16 |