iOS8에서의 Notification (action, category and settings)

iOS8에서는 Notification에 대한 내용이 다소 변경되었다. 이 부분은 iOS 개발자 뿐만 아니라 Server 담당자와 기획자도 알고 있으면 좋을 듯 하여 테스트를 진행하며 간단히 설명해보도록 하겠다.

 

스크린샷 2014-07-10 17.46.22

홈화면(SpringBoard)에서 Notification 수신 시 화면 예.

스크린샷 2014-07-10 17.47.09

잠금화면에서 Notification 수신 시 화면 예.

우선 변경된 내용을 간략하게 정리해자면, 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

Remote Push Notification Payload 예제

APNS (Apple Push Notification Service) 담당 개발자라면 기존에 사용하던 모듈 변경을 해야하는데 Payload에 Category Identifier를 추가해줘야 한다는 것 외에는 큰 변경점이 없다. 아! 큰 변경점을 놓칠뻔 했군. payload 사이즈가 256B에서 2KB로 늘어났다~ 얏호~

[ iOS 클라이언트 개발자 ]

iOS8에서 할 일이 늘어난 건 어쩔 수 없이 iOS 클라이언트 개발자이다. (엉엉;) 우선 간략화 시킨 구조도를 보자. 아래 그림처럼 Action < Category < Settings와 같은 구조를 가진다.

스크린샷 2014-07-11 16.31.24

Notification Action, Category, Settings 구조

1. 준비하기

먼저 Action. 이 action은 action을 구분할 identifier를 가지며, UI에 나타낼 title, Background에서 수행할지 Foreground에서 수행할지 정의하는 activationMode, 사용자의 인증이 필요한지 정의하는 authenticationRequired 프로퍼티를 가진다.

스크린샷 2014-07-11 15.45.16

Notification Action 정의 예제

정의를 위해서는 위와 같이 UIMutableUserNotificationAction class의 인스턴스를 생성하면 된다. Action이 정의되었으면 Category를 지정한다. Category는 Action의 모음이라고 간주하면 되며, Category 들의 구분을 위해 identifier를 가진다.

스크린샷 2014-07-11 15.49.59

Notification Category 정의 예제

정의를 위해서는 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

Action이 3개 이상일 경우 홈 화면에서 나타나는 Action.

마지막으로 위 단계를 거쳐 정의된 action과 category를 NSSet으로 묶어 UIUserNotificationSettings 인스턴스에 정의하고 UIApplication에 등록한다.

스크린샷 2014-07-11 15.53.33

정의된 action과 category의 등록 예제

이렇게하면 Notification에 대한 앱에서 준비과정은 끝난다. 위 코드는 Local Notification에 대한 정의고 Remote Notification을 정의하기 위해서는 registerForRemoteNotifications 메소드를 추가로 정의하도록 한다. (예상컨데 PUSH TOKEN 생성을 위함으로 보인다.)

스크린샷 2014-07-11 15.58.35

Local Notification 생성 예제

참고로 Local Notification 생성은 위와 같이 기존의 방법과 동일하다. Remote Notifiation은 위에서 설명했으니 패스.

2. 동작 정의

1단계에서 action은 정의했는데 각 action 별 구체적인 동작 정의는 없었다. 동작 정의는 UIButton 에서의 selector를 이용하는 것이 아니고 AppDelegate의 메소드를 이용한다.

스크린샷 2014-07-11 16.18.25

iO8 이전의 notification 관련 delegate method

기존에 사용하던 메소드들은 위와 같았겠지만, iOS8 부터는 아래의 메소드들을 이용한다.

스크린샷 2014-07-11 16.16.53

iOS8 이후의 notification 관련 method

다수의 category와 다수의 action이 정의되었을 때 처리 방법은 아래 예제처럼 구현하면 된다.

스크린샷 2014-07-11 16.17.27

iOS8 이후 notification 구동 정의 예제

마치며..

변경점이 많지도 않고 생각보다 구조가 복잡한 것도 아니다. 간과할 수 없는 건 기획자가 이를 어떻게 이해하느냐인데.. 앞에서 기획자를 위한 설명도 있었지만 어떤 요구사항을 줄지 누가 알겠는가? 그래서 기획자를 위해 설명을 해봤는데 충분치는 않은 듯 해서 괜히 미안한 마음을 억지로 감추며 끝.

Comments (2)

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.