본문 바로가기

[IOS][SWIFT]

[IOS][SWIFT] 로컬 푸쉬 알림(Local Notification), UserNotifications사용하며 버튼을 이용한 알림음 변경

반응형

안녕하세요! MIN.IOS입니다! 🧑🏽‍💻
물들어온김에 노젓자! 블로그 시작한지 2일차인데 꾸준을 위해 또 하나의 기능을 가져왔습니다!
이번 기능은 제가 블로그를 시작하게 된 계기라고 해도 과언이 아닐정도로 업무중에 PUSH알림의 알림음을
커스텀 해보려다가 찾아본 자료들은 대부분이 기본음이 예시로 되어 있어,
문제를 해결한 뒤 저처럼 고생하지 않으시길 바라며 이번글을 작성하게 되었습니다!

우선,
IOS에선 크게 두가지의 PUSH알림을 보내는 방법이 있습니다.
1. 앱과 연동되어 있는 서버에서 알림 내용을 유저들에게 한번에 보내주는 방법이 있고,
2. 내 핸드폰에서 버튼 등을 통해서 내 핸드폰에 알림을 보내주는 방법이 있습니다!

오늘은 2번째 방법인 Local Notification을 이용해 PUSH알림을 보내고 사운드를 저장해놓은
버튼을 통해 알림이 올때 알림음을 설정해 보도록 하겠습니다!!

자 역시 아이폰은 핸드폰 자체 권한을 쓰기 위해선 권한을 허용받아야겠죠?


여기서 AVFoundation는 알림음 파일을 사용하기 위해 import,
UserNotifications는 PUSH알림 기능을 위해서 import시켜줍니다.

다음으로 내가 사용할 뷰를 한개 만들어 줍니다!

 

저는 총 3개의 버튼을 만들어 줬는데 간단하게 설명드리자면
맨위 버튼은 푸쉬알림을 보내는 버튼이고,
나머지 두 버튼은 알림음을 설정하는 버튼으로 구성했습니다!
(다양한 방법으로 시도해보면 좋겠습니다!😊 )

이제 코드를 작성해보겠습니다!!


첫 줄부터 분석해보겠습니다!! 먼저 selectedIndex변수는 나중에 같이 볼텐데
위에 보이는 삐삐알림음과 아기 웃음소리 알림음을 구별하기 위해 선언해놓은 변수입니다!!

그 밑에 있는 content는 PUSH알림 내용(content)을 구성하기 위한 변수를 선언해놓았습니다!
(이것도 다음 코드를 보면서 함께 보시죠~)

이제 뷰가 나오기전의 코드! viewDidLoad에서의 코드들을 같이 보시죠!
먼저 보이는 UNUserNotificationCenter부분에서 requestAuthorization은 앱이 처음 실행될때 권한을 물어보는 기능입니다!
그안에 options는 내가 PUSH알림을 어떻게 구성해서 보낼지 정해줍니다!
(.alert은 알림창, .sound는 알림음, .badge는 아이콘위에 숫자입니다! 꼭 이렇게 다 안사용하셔도 됩니다😁 )

다음 completionHandler는 권한요청을 받을때 에러가 발생했을때 didAllow에 Error를 담아 프린트해줍니다!

그 밑은 위에서 선언한 알림음 버튼에 tag로 index를 부여해주고 각 버튼을 터치했을때 어떤 기능을 선언할지 지정해주는 코드입니다!

위 코드를 이해하셨다면 다음 코드로 넘어가겠습니다~!


자 이제 PUSH알림을 설정해주는 testaction 함수를 만들어봤습니다.
content.title부터 .body까지는 내가 보낼 알림 내용을 지정해봤는데 아래와 같이 알림이 오게 됩니다!


사진과 같이 알림이 오게됩니다! badge = 1은 위에서 말한거같이 아이콘위에 알림갯수를 알려주는 기능입니다!
그 아랫부분에 위치한 trigger란?
trigger는 3가지 타입이 있는데 time, calendar, location 입니다.
time은 일정 시간이 지난 후에 작동되는 트리거, calendar는 특정한 날짜에 작동하는 트리거, location은 특정 위치에 진입할 경우 혹은 나갈 경우에 작동하는 트리거입니다!
위에서 timeInterval같은 경우를 보시면 제가 버튼을 누르고 5초뒤에 PUSH 알림이 가는걸 확인할 수 있겠습니다.
(여러가지 방법을 찾아보시고 적용해보시면 좋을거 같습니다 ㅎㅎ)

자! 그럼 이제 버튼에 따라 알림음을 설정해보죠!! 코드를 먼저 보시죠!!

 

위에서 지정해줬던 tag번호와 맨 처음 지정해줬던 변수 selectedIndex를 통해 버튼이 눌렸을 때
다른 버튼이 눌린 상태가 안되도록 구현해보고,
if sender.tag ==1 (tag번호가 1번인 버튼을 눌렀을때 기능을 지정하기위한 if문입니다!!)
위에서 PUSH기능을 구현할 때 사용했던 content변수에 .sound를 선언해주면 되는대요

제가 이 부분에서 많은 고난을 겪었던 이유가 다른 content들은 간단하게 정의가 되었지만,
sound는 저런 형식에 맞춰줘야해서 많이 해맸습니다...하하...

자 그럼 위에 보시는것과 같이 사운드 파일은 ""이런 스트링형식으로 작성만 하면 되냐,
당연히 그렇지 않았습니다. 간단하게 생각해봐도 지금 저희 프로젝트에는 저 파일이 없습니다...
이 부분도 많이 해맸었는데요 해결방법은 다음과 같았습니다.

 

Xcode 왼쪽에 위치한 파일들 사이에 .caf 사운드 파일을 넣어줍니다!
이때! 애플이 지정한 조건이 있는데 알림음은 mp3파일이 안되며, 30초 이상의 사운드는 보낼수 없다고 합니다!

한가지 더! 버전마다 다르겠지만 저 파일들의 타겟을 지금 내 프로젝트에 적용시켜야 합니다!
한가지 방법으로는 처음으로 파일을 첨부할 때 아래와 같이 Add to targets을 이용해 지정해줄수 있겠습니다!


자 이제 모든 설정이 끝났습니다!!👏 👏 👏

빌드를 시켜본다면 아래와 같이 실행되며, 음악 선택부분은 저와 같이 코드를 구성해 보시고 테스트 해보시면
어떻게 적용되는지 아실수 있을겁니다!! 😊


위에 gif 파일을 보시면 버튼을 누르고 아이폰 홈 상태로 이동하는 이유는
PUSH알림이 앱화면에 있을땐 오지 않았기 때문입니다!!
(공부하다보니 이 부분도 Delegate를 이용하면 가능하게 만들수 있다고 하네요!!)

자! 지금까지 Local Notification과 그에 따른 알림음 설정을 커스텀해보는 기능을 구현해 봤는데요!
제가 처음 공부하면서 느낀점이 정말 앱의 자유도는 엄청나다는걸 다시한번 느낀 계기가 되었는데요.
앞으로도 꾸준히 공부하여 많은 기능들을 커스텀 해보고 싶네요!!😁

이상으로 두번째 포스팅을 맞치겠습니다!!!
(언제나 그렇듯이 수정해야할 부분이나 보완이 필요할 부분이 보이신다면 어떤 방법이든 알려주시면 적극반영하겠습니다!!)

반응형