티스토리 뷰

반응형


+ ) 2020.03.19 

1. Deployment target을 10.3에서 13.0으로 변경.

2. Swift 3.0에서 Swift 5.0을 사용하도록 변경. 


안녕하세요 :) Zedd입니다.

오늘은 바로 UserNotifications을 사용해보려고합니다 XD

Notification? 그 옵저버주고 post했던거?

...는 아니고..!

바로..이것!!

여러 앱에서 push 알림이오죠? 이것이 바로 iOS의 UserNotifications기능입니다.

오늘은 이 push알림을 오게 만들어볼거에요 :)

간단한게 오늘 만들 앱 설명을 해드리자면, 

버튼을 누르면 몇초뒤에 push알림이 오는 앱을 만들어볼거에요.


참고로 iOS10부터 사용가능하답니다XD

오늘은 정말 간단하게 "어떻게 사용하는지"만 알아볼거에요.



왕초보를 위한 UserNotifications사용해보기



인터넷에 있는 여러 UserNotifications예제들을 살펴봤는데, 초보자들이 이해하기 어렵다고 생각되는 예제들이 많았어요. 그래서 일단 저는 단계별로 이 UserNotifications이 어떻게 구현되고 알림이 오는지 설명드릴게요. 


Xcode를 열어주시고..!

UserNotifications을 사용하려면 import가 필요하기때문에!

UserNotifications을 import해주세요.

import UserNotifications


1. 유저한테 알림허락을 받아야한다. (권한을 얻어야한다.)


아이폰을 사용하시면서, 



이거 한번 못보신 사람은 없으실거에요. iOS는 사용자의 프라이버시를 중요하게 생각해서,

사용자의 연락처, 사진첩등을 앱에서 접근하려면 항상 유저에게 "허락"을 받아야합니다. 


우리는 유저한테 "알림"을 줄거죠?

그러니까 "이 앱이 너한테 알림을 좀 보내도 되겠니?"라는 허락을 받는거죠.


override func viewDidLoad() {

        super.viewDidLoad()

        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in })

//completionHandler 원형 : completionHandler: (Bool, Error?) -> Void)

requestAuthorization. 메소드이름만봐도 "권한요청"에 대한 함수라는 것을 알 수 있죠? 

option에는 UNAuthorizationOptions을 넣어주면 된답니다. 

그리고 completionHandler에는 유저가 이 권한을 허락했는지, 안했는지에 대해 상황을 나눠줄 수 있답니다. 

저기 Bool형이 권한이 허용됐는지, 허용되지 않았는지를 담고 있어요. 코드에서는 didAllow가 되겠네요.


권한을 허락하면, true가 didAllow에 들어가게 된답니다.

권한을 허용하지않으면 false가 들어가겠죠?


2. 어떨 때 알림을 받고싶은지 디자인해주자.


오늘은 왕초보를 위한 글이니(본인도 왕초보임..) 위에서 말씀드렸다시피 

"버튼을 누르면 몇 초 뒤에 push알림이 온다"는 앱을 만들기로 했죠?

main.storyboard로 가서 버튼을 만들어줘봅시다. 

버튼을 만드셨으면, 당연히 ViewController와 연결시켜줘야겠죠?

버튼을 "누르면" push알림이 가야하니, IBAction을 만들어주세요.



ㅎㅎ잘하셨어요!


3. push알림 메세지를 설정해주자.



리니지M광고 아니고....아무튼 모든 push알림엔 저렇게 "메세지"가 있죠?

어떤 메세지를 유저에게 알려주고 싶어서 이 UserNotifications이 있는거니까요!

우리도 어떤메세지를 가지고 유저에게 push알림을 줄건지 정해야겠죠?

저 push알림에 들어갈 컨텐츠를 만들어주어야 한답니다 :)


친절하게도 iOS에는 이 컨텐츠를 지정할 수 있도록 도와주는 클래스가 있답니다.

바로 UNMutableNotificationContent이죠. 



사진안에는 다 안나왔지만, title이나 sound등 다양한 설정을 할 수 있어요.

UNMutableNotificationContent는 "클래스"라고 했죠?

이 클래스의 객체를 만들어봅시다.

@IBAction func buttonPressed(_ sender: UIButton){

let content = UNMutableNotificationContent()

}


음..뭘줘볼까요. title이랑 body는 필수겠죠? 전 subtitle과 badge를 추가해서 넣어볼게요. 


@IBAction func buttonPressed(_ sender: UIButton){

let content = UNMutableNotificationContent()

content.title = "This is title : Zedd"

content.subtitle = "This is Subtitle : UserNotifications tutorial"

content.body = "This is Body : 블로그 쓰기"

content.badge = 1

}


badge는 참고로


저렇게 앱 아이콘 오른쪽 상단에 알림 표시가 되게 만드는 것이 badge의 역할이에요.

만약 이 badge넣기가 싫다!! 하시는 분은, 위에서 권한 요청했었던 코드 있죠?  저기서 


override func viewDidLoad() {

        super.viewDidLoad()

        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound], completionHandler: {didAllow,Error in })

option부분에서 .badge를 빼주시면 위 그림처럼 알림표시가 되지않습니다. 


4. 알림 트리거 지정

우리는 버튼을 누르면 notification이 오게 하겠다!!라고 했었죠? 

우리눈에는 버튼을 누른다 -->  UserNotifications이 온다. 이겠지만,

사실 언제 UserNotifications을 작동할건지 "트리거"를 만들어야 한답니다.

특정시간, 시간간격, 위치변경을 기반으로 트리거를 설정할 수 있어요.

애플문서를 보시면,

저렇게 4개의 트리거설정을 할 수 있답니다. 

오늘은 가장 위에 있는 TimeInterval을 사용해볼거에요.

버튼을 누르면 몇초뒤에 알림이 오는거죠!!(사실 이 구현은 두번째에 있는 Calendar로도 구현할 수 있어요.)


let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats:false)

timeInterval파라미터에는 초단위의 숫자가 들어간답니다. 즉, 5초뒤에 알림을 트리거 시켜줘! 인거죠.


5. 알림 요청을 하자!

이 알림요청은 UNNotificationRequest이라는 클래스를 이용해요.

UNNotificationRequest에는 아까 우리가 만들었던 content와 트리거를 넘겨주게 된답니다.

이 내용이랑 트리거 가지고 알림요청(예약) 좀 하자?ㅎㅋ;; 이런거죠.

또한, 알림 요청의 고유 식별자도 함께 넘겨줘야합니다. 


let request = UNNotificationRequest(identifier: "timerdone", content: content, trigger: trigger)


content랑 트리거 넘겨주는건 알겠는데..갑자기 웬 식별자;;?



저도 확실하게는 잘 모르겠는데, 이 알림요청이 여러가지가 될 때,(지금은 하나지만) 이 알림들을 구분할 수 있게 해주는 식별자같아요.

"이 알림 요청의 고유 식별자입니다. 보류중인 알림 요청 또는 전달 된 알림을 바꾸거나 제거하는 데 사용할 수 있습니다."

라고 하네요 XD


휴₩~~이제 요청까지 했으니 끝났구나~~~

는 아니구요...

딱 한단계가 더 남아있답니다 :)


6. 5번에서 했던 요청을  알림센터에 추가해주자. 

부들부들....끝난줄 알았는데...

핳ㅎㅎ

위에서 UNNotificationRequest라는 클래스를 이용했었죠?

UNNotificationRequest는 UNUserNotificationCenter를 사용해서 "예약"할 수 있어요.

또한, 만약 유저가 알림을 받겠다고 허용한경우

UNNotificationRequest는 UNNotification을 만드는데 "사용"되며, 사용자에게 알려지게 됩니다.

UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

add라는 메소드를 사용해서 위에서 만들었던 request를 파마미터로 넣어주었네요.

이 UNUserNotificationCenter 들어온 알림요청들을 처리해주는 정말 "센터"같은 역할을 한다고 보시면 됩니다. 


자..여러분 끝났어요 XD

한번 실행해볼까요? 


(빨리 보여드리고 싶어서 5초에서 2초로 바꿨답니다.ㅎㅎ)

급하게 홈화면으로 가는 이유는, 앱이 화면에 있을 때? foreground에 있을 때는 알림이 오지 않는답니다. 그래서 급하게 홈화면으로..

하지만 Delegate를 쓰면 이것도 가능하게 만들 수 있어요!!


어때요!! UserNotifications이 그렇게 어려운건 아니죠? ㅎㅎ

여기에 전체 소스코드를 올려놨어요! 참고하시길 바랍니다. 

도움이 되었으면 좋겠네요 XD

반응형