[swift3] UserNotifications
ios10 UserNotifications
ios10부터 UserNotification이 생겼다. 이제 조금 더 쉽게 사용자에게 메세지를 보낼 수 있다.
먼저 중앙에 버튼을 만들어보자
기본텍스트 출력
ViewController.swift
class : UIViewController {override func viewDidLoad() {super.viewDidLoad()//권한 요청 부분//사용자에게 alert, badge, sound요청을 한다.UNUserNotificationCenter.current().requestAuthorization(: [.alert, .badge, .sound], : {(granted,error) in//permission이 있으면 trueif granted{print("Notification access granted")}else{print(error?.localizedDescription as Any)}})}//아까 중앙에 만들어준 버튼을 아래 내용과 연결해주자@IBAction func notifyButtonTapped(: UIButton){//시간만 설정!//scheduleNotification에 대한 내요은 하단을 보자scheduleNotification(: 5, : {success inif success{print("성공")}else{print("error")}})}//아래 함수는 notification을 일으키는 함수에 대한 정의//@escaping은 클로저 내용이다.func scheduleNotification(: TimeInterval, : @escaping (_ : Bool) -> ()){//먼저 소리나지 않는 객체를 만든다.let notif = UNMutableNotificationContent()notif.title = "알람입니다"notif.subtitle = "일어날 시간이에요!"notif.body = "ios10의 새로운 기능 알람이라구요!"//트리거 이벤트로써 위에서 설정한 시간값을 받아 전달해준다.let notiTrigger = UNTimeIntervalNotificationTrigger(: inSeconds, : false)//세팅한 트리거 이벤트를 request에 넣어준다.let request = UNNotificationRequest(: "myNotification", : notif, : notiTrigger)//아래 내용이 실질적으로 notification을 일으키는 내용이다.UNUserNotificationCenter.current().add(request, : { error inif error != nil{print(error?.localizedDescription as Any)completion(false)}else{completion(true)}})}}
스샷을 찍는걸 깜박하여.. 대략적인 모습은 아래와 같다.
버튼 클릭 후 cmd + shift + h 를 빠르게 누르자.
커스텀 이미지를 추가하자
ViewController.swift
//상단 내용이 같아 생략//아래 함수는 notification을 일으키는 함수에 대한 정의//@escaping은 클로저 내용이다.func scheduleNotification(inSeconds: TimeInterval, completion: @escaping (_ Success: Bool) -> ()){//하단 부분이 추가가된다. gif 이미지는 알아서..guard let imageUrl = Bundle.main.url(forResource: "rick_grimes", withExtension: "gif")else{completion(false)return}//attachment 객체 생성var attachment: UNNotificationAttachment//만든 객체에 상단에 정의한 imageUrl을 넣어주자.attachment = try! UNNotificationAttachment(identifier: [], url: imageUrl, options: .none)let notif = UNMutableNotificationContent()notif.title = "알람입니다"notif.subtitle = "일어날 시간이에요!"notif.body = "ios10의 새로운 기능 알람이라구요!"//attachment 인스턴스로 정의notif.attachments = [attachment]let notiTrigger = UNTimeIntervalNotificationTrigger(timeInterval: inSeconds, repeats: false)//나머지는 내용이 같아 생략..
위와 같이 이미지가 출력되는걸 볼 수 있다.
홈버튼 안누르고 notification띄우기
appDelegate.swift
import UIKit//UserNotification을 꼭 가져오자import UserNotifications@UIApplicationMainclass : UIResponder, UIApplicationDelegate {var : UIWindow?func application(_ : UIApplication, didFinishLaunchingWithOptions : [: Any]?) -> Bool {// Override point for customization after application launch.//UserNotification을 delegate를 통해 연결해주자UNUserNotificationCenter.current().delegate = self}///중간 생략//이걸 해주면 UserNoti를 앱 안에서 볼 수 있다.//Notification이 될때 해당 이벤트를 받아 completionHandler로 alert를 보낸다.extension : UNUserNotificationCenterDelegate{func userNotificationCenter(_ : UNUserNotificationCenter, willPresent : UNNotification, withCompletionHandler : @escaping (UNNotificationPresentationOptions) -> Void) {completionHandler(.alert)}func userNotificationCenter(_ : UNUserNotificationCenter, didReceive : UNNotificationResponse, withCompletionHandler : @escaping () -> Void) {print("받은 응답 : \(response.actionIdentifier)")completionHandler()}}//파일 끝
custom 형태의 notification 띄우기
file -> new -> target을 통해 Notification Content Extension을 만들자
스토리 보드에서 view 크기를 키워준 후 이미지뷰와 텍스트를 넣었다
기존
수정후
NotificationViewController.swift
import UIKitimport UserNotificationsimport UserNotificationsUIclass : UIViewController, UNNotificationContentExtension {//아까 만들어준 이미지뷰와 연결해주자@IBOutlet weak var : UIImageView!override func viewDidLoad() {super.viewDidLoad()// Do any required interface initialization here.}func didReceive(_ : UNNotification) {//버튼을 여러번 눌러도 한번만 실행되도록 하자guard let attachment = notification.request.content.attachments.first else{return}// 사진 url에 access하기 위한 함수if attachment.url.startAccessingSecurityScopedResource(){//attachment.url이 있다면 imageData에 사진 url을 받기let imageData = try? Data.init(: attachment.url)//imageData가 있다면 img에 넣고if let img = imageData{//그 이미지를 띄워준다.imageView.image = UIImage(: img)}}}}
appDelegate.swift
//상단 생략func applicationWillTerminate(_ : UIApplication) {// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.}private func configureUserNotifications(){//커스텀 형태의 notification 만들기let catagory = UNNotificationCategory(: "myNotificationCategory", : [], : [], : [])//카테고리 추가UNUserNotificationCenter.current().setNotificationCategories([catagory])}//하단 생략
ViewController.swift
//상단생략var : UNNotificationAttachmentattachment = try! UNNotificationAttachment(: "myNotification", : imageUrl, : .none)let notif = UNMutableNotificationContent()//custom view를 위해 카테고리를 설정하자notif.categoryIdentifier = "myNotification"notif.title = "알람입니다"notif.subtitle = "일어날 시간이에요!"notif.body = "ios10의 새로운 기능 알람이라구요!"//notification 명시let request = UNNotificationRequest(: "myNotification", : notif, : notiTrigger)
익스텐션의 info.plist
UNNotificationExtensionCategory에 myNotificationCategory 추가
버튼 넣는건 2부에서 계속