iOS8에서는 Notification에 대한 내용이 다소 변경되었다. 이 부분은 iOS 개발자 뿐만 아니라 Server 담당자와 기획자도 알고 있으면 좋을 듯 하여 테스트를 진행하며 간단히 설명해보도록 하겠다.
![스크린샷 2014-07-10 17.46.22](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-10-17.46.22.png?resize=250%2C375)
![스크린샷 2014-07-10 17.47.09](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-10-17.47.09.png?resize=250%2C375)
우선 변경된 내용을 간략하게 정리해자면, 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는 이미 앱 내에 미리 정의가 되어 있어야 한다. 자 해볼게 많지 않은가? (없으면 말구..)
[ 서버 개발자 ]
![스크린샷 2014-07-11 14.49.06](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-14.49.06.png?resize=400%2C203)
APNS (Apple Push Notification Service) 담당 개발자라면 기존에 사용하던 모듈 변경을 해야하는데 Payload에 Category Identifier를 추가해줘야 한다는 것 외에는 큰 변경점이 없다. 아! 큰 변경점을 놓칠뻔 했군. payload 사이즈가 256B에서 2KB로 늘어났다~ 얏호~
[ iOS 클라이언트 개발자 ]
iOS8에서 할 일이 늘어난 건 어쩔 수 없이 iOS 클라이언트 개발자이다. (엉엉;) 우선 간략화 시킨 구조도를 보자. 아래 그림처럼 Action < Category < Settings와 같은 구조를 가진다.
![스크린샷 2014-07-11 16.31.24](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-16.31.24-1024x606.png?resize=600%2C356)
1. 준비하기
먼저 Action. 이 action은 action을 구분할 identifier를 가지며, UI에 나타낼 title, Background에서 수행할지 Foreground에서 수행할지 정의하는 activationMode, 사용자의 인증이 필요한지 정의하는 authenticationRequired 프로퍼티를 가진다.
![스크린샷 2014-07-11 15.45.16](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-15.45.161-1024x185.png?resize=600%2C109)
정의를 위해서는 위와 같이 UIMutableUserNotificationAction class의 인스턴스를 생성하면 된다. Action이 정의되었으면 Category를 지정한다. Category는 Action의 모음이라고 간주하면 되며, Category 들의 구분을 위해 identifier를 가진다.
![스크린샷 2014-07-11 15.49.59](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-15.49.59-1024x219.png?resize=600%2C128)
정의를 위해서는 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를 기다려야.. 베타니까~
![스크린샷 2014-07-11 16.41.20](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-16.41.20.png?resize=250%2C375)
마지막으로 위 단계를 거쳐 정의된 action과 category를 NSSet으로 묶어 UIUserNotificationSettings 인스턴스에 정의하고 UIApplication에 등록한다.
![스크린샷 2014-07-11 15.53.33](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-15.53.33-1024x136.png?resize=600%2C80)
이렇게하면 Notification에 대한 앱에서 준비과정은 끝난다. 위 코드는 Local Notification에 대한 정의고 Remote Notification을 정의하기 위해서는 registerForRemoteNotifications 메소드를 추가로 정의하도록 한다. (예상컨데 PUSH TOKEN 생성을 위함으로 보인다.)
![스크린샷 2014-07-11 15.58.35](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-15.58.35-1024x402.png?resize=600%2C236)
참고로 Local Notification 생성은 위와 같이 기존의 방법과 동일하다. Remote Notifiation은 위에서 설명했으니 패스.
2. 동작 정의
1단계에서 action은 정의했는데 각 action 별 구체적인 동작 정의는 없었다. 동작 정의는 UIButton 에서의 selector를 이용하는 것이 아니고 AppDelegate의 메소드를 이용한다.
![스크린샷 2014-07-11 16.18.25](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-16.18.25-1024x130.png?resize=600%2C76)
기존에 사용하던 메소드들은 위와 같았겠지만, iOS8 부터는 아래의 메소드들을 이용한다.
![스크린샷 2014-07-11 16.16.53](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-16.16.53-1024x364.png?resize=600%2C213)
다수의 category와 다수의 action이 정의되었을 때 처리 방법은 아래 예제처럼 구현하면 된다.
![스크린샷 2014-07-11 16.17.27](https://i0.wp.com/y8k.me/wp-content/uploads/2014/07/스크린샷-2014-07-11-16.17.27-1024x725.png?resize=600%2C425)
마치며..
변경점이 많지도 않고 생각보다 구조가 복잡한 것도 아니다. 간과할 수 없는 건 기획자가 이를 어떻게 이해하느냐인데.. 앞에서 기획자를 위한 설명도 있었지만 어떤 요구사항을 줄지 누가 알겠는가? 그래서 기획자를 위해 설명을 해봤는데 충분치는 않은 듯 해서 괜히 미안한 마음을 억지로 감추며 끝.
2 comments
이제 글쓰기가 물이 올랐네요~!!! 멋집니다. 화이팅!
올만에 뵙습니다 🙂 감사합니다~