iOS8에서는 Notification에 대한 내용이 다소 변경되었다. 이 부분은 iOS 개발자 뿐만 아니라 Server 담당자와 기획자도 알고 있으면 좋을 듯 하여 테스트를 진행하며 간단히 설명해보도록 하겠다.
우선 변경된 내용을 간략하게 정리해자면, Local / Remote Notification 에 위에 첨부한 것과 같이 액션이 추가되었다. 더불어 Notifiation에 category가 추가되어 카테고리에 따라 다른 액션을 보여줄 수도 있게 되었다. 이 변경점은 개발자뿐만 아니라 기획자도 꼭 알고 넘어가야할 부분이라고 생각되어 기획자가 고려해야 할 부분도 짚어보도록 하겠다.
[ 기획자 ]
기존의 Notification 에서는 단일 Action만 존재(터치 시 해당 앱 호출)했으며, userinfo나 payload에 추가 scheme을 적용, 혹은 didReceivedNotification 메소드에서 데이터를 재호출해서 앱 내에서 분기동작을 수행하도록 하였다. 참 번거로운 작업이었고 Remote Notification 의 경우에는 제한된 payload 사이즈 때문에 이마저도 제한이 많았다. 하지만 iOS8 부터는 Notification에 Action을 지정할 수 있는 기능이 추가되었다. 위에 첨부한 화면을 예로 들어 설명하자면 캘린더 초대가 들어왔을 때 “거절(Decline)”, “승락(Accept)” action을 앱에 진입하지 않고도 수행할 수 있다. 이 “거절(Decline)”과 “승락(Accept)” action에 대한 정의는 앱을 실행할 수도 있고 백그라운드에서 수행도 가능하다. 또한, Action에 대한 Category도 지정이 가능하여, Notification 종류에 따라 action이 다르게 보여질 수 있다. 역시 쉽게 이해할 수 있도록 예를 들자면 “승락”을 하였는데 초대자가 일정에 대한 변경 요청을 Notification으로 다시 보낼 경우 “거절(Decline)”, “코멘트(Comment)”, “승락(Accept)” 로 보낼 수 있다는 것이다. 물론 Category 별 지정된 Action의 경우 일부 같도록 하거나 완전히 다르게 하는 것이 가능하다. A category에 A-1, A-2 의 액션, B Category에 B-1, B-2, A-1 이 가능하다는 것이다. 하지만 제약도 있는데 이 category는 이미 앱 내에 미리 정의가 되어 있어야 한다. 자 해볼게 많지 않은가? (없으면 말구..)
[ 서버 개발자 ]
APNS (Apple Push Notification Service) 담당 개발자라면 기존에 사용하던 모듈 변경을 해야하는데 Payload에 Category Identifier를 추가해줘야 한다는 것 외에는 큰 변경점이 없다. 아! 큰 변경점을 놓칠뻔 했군. payload 사이즈가 256B에서 2KB로 늘어났다~ 얏호~
[ iOS 클라이언트 개발자 ]
iOS8에서 할 일이 늘어난 건 어쩔 수 없이 iOS 클라이언트 개발자이다. (엉엉;) 우선 간략화 시킨 구조도를 보자. 아래 그림처럼 Action < Category < Settings와 같은 구조를 가진다.
1. 준비하기
먼저 Action. 이 action은 action을 구분할 identifier를 가지며, UI에 나타낼 title, Background에서 수행할지 Foreground에서 수행할지 정의하는 activationMode, 사용자의 인증이 필요한지 정의하는 authenticationRequired 프로퍼티를 가진다.
정의를 위해서는 위와 같이 UIMutableUserNotificationAction class의 인스턴스를 생성하면 된다. Action이 정의되었으면 Category를 지정한다. Category는 Action의 모음이라고 간주하면 되며, Category 들의 구분을 위해 identifier를 가진다.
정의를 위해서는 UIMutableUserNotificationCategory class를 이용하며 setAction:forContext: 메소드를 이용하여 배열로 미리 정의된 action을 포함시킨다. 여기서 또 하나 짚고 넘어가야할 것이 있다. 예제에는 forContext 인자에 UIUserNotificationActionContextDefault가 명시되어 있는데 그럼 다른 옵션도 있다는 얘기?! 맞다. 또 하나의 옵션이 더 존재하며 UIUserNotificationActionContextMinimal이란 이름을 가지고 있다. 잠금 화면에서는 swipe left를 이용해 정의된 action을 볼 수 있는데 2개가 최대이다. Default만 명시되어 있다면 배열의 첫 번째와 두 번째만 보여주게 되는데 이 때 사용할 수 있는 것이 Minimal 옵션이다. 즉, 잠금 화면에서 보여줄 action 두 개를 지정할 수 있다. (Default는 최대 4개까지만 가능하다고 한다.)
* 현재 iOS8 beta 3에서 테스트를 진행하면서 글을 쓰고 있는데 action 쪽 버그가 있는 듯 하다. 아래 화면처럼 절대 안나옴… Developer Forum에서도 이에 대한 버그 보고가 있는 듯 하다. beta 4를 기다려야.. 베타니까~
마지막으로 위 단계를 거쳐 정의된 action과 category를 NSSet으로 묶어 UIUserNotificationSettings 인스턴스에 정의하고 UIApplication에 등록한다.
이렇게하면 Notification에 대한 앱에서 준비과정은 끝난다. 위 코드는 Local Notification에 대한 정의고 Remote Notification을 정의하기 위해서는 registerForRemoteNotifications 메소드를 추가로 정의하도록 한다. (예상컨데 PUSH TOKEN 생성을 위함으로 보인다.)
참고로 Local Notification 생성은 위와 같이 기존의 방법과 동일하다. Remote Notifiation은 위에서 설명했으니 패스.
2. 동작 정의
1단계에서 action은 정의했는데 각 action 별 구체적인 동작 정의는 없었다. 동작 정의는 UIButton 에서의 selector를 이용하는 것이 아니고 AppDelegate의 메소드를 이용한다.
기존에 사용하던 메소드들은 위와 같았겠지만, iOS8 부터는 아래의 메소드들을 이용한다.
다수의 category와 다수의 action이 정의되었을 때 처리 방법은 아래 예제처럼 구현하면 된다.
마치며..
변경점이 많지도 않고 생각보다 구조가 복잡한 것도 아니다. 간과할 수 없는 건 기획자가 이를 어떻게 이해하느냐인데.. 앞에서 기획자를 위한 설명도 있었지만 어떤 요구사항을 줄지 누가 알겠는가? 그래서 기획자를 위해 설명을 해봤는데 충분치는 않은 듯 해서 괜히 미안한 마음을 억지로 감추며 끝.
2 comments
이제 글쓰기가 물이 올랐네요~!!! 멋집니다. 화이팅!
올만에 뵙습니다 🙂 감사합니다~