Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[iOS14] ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํŠน์ • ์‹œ๊ฐ„ ๋กœ์ปฌ ์•Œ๋ฆผ๋ณด๋‚ด๊ธฐโฐ ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/๐Ÿ˜ท ์ฝ”๋กœ๋‚˜19์•Œ๋ฆผ์•ฑ

[iOS14] ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํŠน์ • ์‹œ๊ฐ„ ๋กœ์ปฌ ์•Œ๋ฆผ๋ณด๋‚ด๊ธฐโฐ

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 7. 29. 16:31

โœ… ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ํŠน์ • ์‹œ๊ฐ„์— ๋กœ์ปฌ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด์•ผ.

 

๋กœ์ปฌ์•Œ๋ฆผ ์˜ˆ์‹œ

๋กœ์ปฌ ์•Œ๋ฆผ์ด๋ž€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์•Œ๋ฆผ์ด ์˜จ ๊ฒƒ์„ ๋งํ•œ๋‹ค..!

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•ด์•ผ๊ฒ ์ง€?

 

(๋ชฉ์ฐจ)

1. ๋กœ์ปฌ ์•Œ๋ฆผ์€ ์–ด๋–ค ์ฒ˜๋ฆฌ๊ณผ์ •์„ ๊ฑฐ์น ๊นŒ?

2. SceneDelegate์—์„œ ๋กœ์ปฌ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ 

3. AppDelegate์—์„œ ๊ถŒํ•œ ์–ป๊ธฐ

4. ํŠน์ • ์‹œ๊ฐ„ ๋ง๊ณ  ๋‹ค๋ฅธ trigger๋Š”?

 

โœ… 1. ๋กœ์ปฌ ์•Œ๋ฆผ์€ ์–ด๋–ค ์ฒ˜๋ฆฌ๊ณผ์ •์„ ๊ฑฐ์น ๊นŒ?

    - ๋กœ์ปฌ ์•Œ๋ฆผ ๋ฐœ์†ก์˜ 4๋‹จ๊ณ„ - 

 1๏ธโƒฃ ๋ฐœ์†กํ•œ ๋‚ด์šฉ์„ ์ •์˜ UNMuatableNotificationContent
 2๏ธโƒฃ ๋ฐœ์†ก ์กฐ๊ฑด์˜ ์ •์˜ UNTimeIntervalNotificationTrigger
 3๏ธโƒฃ ์•Œ๋ฆผ ์š”์ฒญ์„ ๋งŒ๋“ฆ UNNotificationRequest
 4๏ธโƒฃ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜ ์„ผํ„ฐ์— ํ•ด๋‹น ์š”์ฒญ์„ ๋“ฑ๋ก UNUserNotificationCenter

 

์œ„์˜ ๋„ค ๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ ๋ผ.

์šฐ์„  ๋ฉ”์†Œ๋“œ๋“ค์˜ ์ด๋ฆ„๋งŒ ์‚ด์ง ๋ณด๊ณ  ๋’ค์˜ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด์ž.

 

โœ… 2. SceneDelegate์—์„œ ๋กœ์ปฌ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ 

func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
        
        if #available(iOS 10.0, *) { // iOS ๋ฒ„์ „ 10 ์ด์ƒ์—์„œ ์ž‘๋™
            
            UNUserNotificationCenter.current().getNotificationSettings { settings in
                
                if settings.authorizationStatus == UNAuthorizationStatus.authorized {
                    /*
                     ๋กœ์ปฌ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋ฉด
                     - ์œ ์ €์˜ ๋™์˜๋ฅผ ๊ตฌํ•œ๋‹ค.
                     */
                    let nContent = UNMutableNotificationContent() // ๋กœ์ปฌ์•Œ๋ฆผ์— ๋Œ€ํ•œ ์†์„ฑ ์„ค์ • ๊ฐ€๋Šฅ
                    nContent.title = "๐Ÿฆ ์˜ค๋Š˜์˜ ์ฝ”๋กœ๋‚˜ ํ˜„ํ™ฉ ์•Œ๋ฆผโฐ"
                    nContent.subtitle = "์ด ํ™•์ง„์ž : \n ์šฐ๋ฆฌ์ง€์—ญ ํ™•์ง„์ž : "
                    nContent.body = "์ด ํ™•์ง„์ž : \n ์šฐ๋ฆฌ์ง€์—ญ ํ™•์ง„์ž : "
                    nContent.sound = UNNotificationSound.default
                    nContent.userInfo = ["name":"lgvv"]
                    
                    var date = DateComponents()
                    date.hour = 15
                    date.minute = 52
                    
                    
                    // ์•Œ๋ฆผ ๋ฐœ์†ก ์กฐ๊ฑด ๊ฐ์ฒด
                    let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: false)
                    // ์•Œ๋ฆผ ์š”์ฒญ ๊ฐ์ฒด
                    let request = UNNotificationRequest(identifier: "wakeup", content: nContent, trigger: trigger)
                    // NotificationCenter์— ์ถ”๊ฐ€
                    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
                } else {
                    NSLog("User not agree")
                }
            }
            
        } else {
            NSLog("User iOS Version lower than 13.0. please update your iOS version")
            // iOS 9.0 ์ดํ•˜์—์„œ๋Š” UILocalNotification ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
        }
        
    }

์šฐ์„  ์šฐ๋ฆฌ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋“ค์–ด๊ฐ”์„ ๋•Œ, ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค ์˜ˆ์ •์ด๋ฏ€๋กœ, SceneDelegate ๋ถ€๋ถ„์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋„˜์–ด๊ฐ”์„ ๋•Œ์˜ ๋ฉ”์†Œ๋“œ ๋ถ€๋ถ„์— ์ž‘์„ฑํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ์–ด.

 

๋งจ ์œ„์— if ์กฐ๊ฑด์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•Œ๋ฆผ ๋ณด๋‚ด๋Š” ๊ถŒํ•œ์„ ํ—ˆ๋ฝํ–ˆ๋Š”์ง€ ํ•˜์ง€ ์•Š์•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ฒ€์‚ฌํ•˜๋Š” ๋ถ€๋ถ„์ด์•ผ. 

๊ถŒํ•œ์„ ์ฃผ์—ˆ์„ ๋•Œ๋งŒ ๋Œ์•„๊ฐ€๊ฒŒ๋”!! -> ๊ถŒํ•œ ์„ค์ •์€ AppDelegate ๋ถ€๋ถ„์— ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์•ฑ์„ ์ฒ˜์Œ ์„ค์น˜ํ•  ๋•Œ, ์ž‘๋™ํ•˜๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค.

 

nContent ๋ถ€๋ถ„์€ ์šฐ๋ฆฌ์˜ ์•Œ๋ฆผ์— ํ‘œ์‹œ๋  ๋ถ€๋ถ„๋“ค

date ๋ณ€์ˆ˜๋Š” ํŠน์ • ์‹œ๊ฐ„์„ ์ง€์ •ํ•ด์ฃผ๊ณ 

trigger ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์กฐ๊ฑด์—์„œ ๋ฐœ์ƒ์‹œํ‚ฌ๊ฑด์ง€ ์ •์˜ํ•ด์ค€ ๋‹ค์Œ.

request ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  notification์— id์™€ content ๋‚ด์šฉ ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์ƒ์กฐ๊ฑด์„ ์ฃผ์–ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ NotificationCenter์— ๋“ฑ๋กํ•˜๋ฉด ๋!

 

โ—๏ธUNUserNotificationCenter ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๊ทธ๋Ÿผ if๋ฌธ์„ ํ†ต๊ณผํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ถŒํ•œ์€ ์–ด๋–ป๊ฒŒ ์–ป๋Š”์ง€ ํ•œ๋ฒˆ ๋ณผ๊นŒ?

 

โœ… 3. AppDelegate์—์„œ ๊ถŒํ•œ ์–ป๊ธฐ

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        if #available(iOS 11.0, *) {
                    // ๊ฒฝ๊ณ ์ฐฝ ๋ฐฐ์ง€ ์‚ฌ์šด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๋ฆผ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‚ฌ์šฉ์ž ๋™์˜์—ฌ๋ถ€ ์ฐฝ์„ ์‹คํ–‰
                    let notiCenter =  UNUserNotificationCenter.current()
                    notiCenter.requestAuthorization(options: [.alert, .badge, .sound]) { (didAllow, e) in }
                    notiCenter.delegate = self // ์ด ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๋ฆผ์„ ํด๋ฆญํ•˜์—ฌ ๋“ค์–ด์˜จ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด๊ตฌ์กฐ
                    // ์ฆ‰, ์•Œ๋ฆผ ์„ผํ„ฐ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ญ”๊ฐ€ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‚˜(์•ฑ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ) ํ•œํ…Œ ์•Œ๋ ค์ค˜ ์ด๋Ÿฐ ์˜๋ฏธ์ž„
                    /* ํด๋กœ์ € ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…
                     ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€ ์ฐฝ์˜ ์•Œ๋ฆผ ๋™์˜ ์—ฌ๋ถ€๋ฅผ true / false
                     ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ e
                     */
                } else {
                    // ๊ฒฝ๊ณ ์ฐฝ, ๋ฐฐ์ง€, ์‚ฌ์šด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๋ฆผ ํ™˜๊ฒฝ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ €์žฅ.
                    let setting = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
                    application.registerUserNotificationSettings(setting) // ์ƒ์„ฑ๋œ ์ •๋ณด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋“ฑ๋ก
                }
        return true
    }
    
    /*
       ์œ ์ €๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์„ผํ„ฐ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์— ๋…ธํ‹ฐ์„ผํ„ฐ.๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ์…€ํ”„ ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผ ์ž‘์„ฑ๊ฐ€๋Šฅํ•˜๋‹ค.
       ์ด ๋ฉ”์†Œ๋“œ๋Š” ์•Œ๋ฆผ ๋ฐฐ๋„ˆ์˜ ํ‘œ์‹œ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์•Œ๋ฆผ์ด ๋„์ฐฉํ•˜๋ฉด, ํ˜ธ์ถœ๋œ๋‹ค.
       */
      @available(iOS 10.0, *)
      func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
          if notification.request.identifier == "wakeup" { // ๋กœ์ปฌ ์•Œ๋ฆผ ๋“ฑ๋ก์‹œ ์ž…๋ ฅํ•œ ์‹๋ณ„ ์•„์ด๋””๋ฅผ ์ฝ์–ด์˜ค๋Š” ์†์„ฑ
              let userInfo = notification.request.content.userInfo // ์œ ์ €๊ฐ€ ์ปค์Šคํ…€์œผ๋กœ ์ •์˜ํ•œ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ์—ญํ• 
              print(userInfo["name"]!) // ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ’์„ ์ถœ๋ ฅ
          }
          // ์•Œ๋ฆผ ๋ฐฐ๋„ˆ ๋„์›Œ์ฃผ๊ธฐ
          completionHandler([.alert, .badge, .sound])
      }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        /*
         ์•ž์—์„œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์ด ๋ฉ”์†Œ๋“œ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋ฅผ ํด๋ฆญ ํ–ˆ์„ ๊ฒฝ์šฐ์— ์‹คํ–‰๋œ๋‹ค๋Š” ์ฐจ์ด๋ฅผ ๊ฐ€์ง.
         ์ด๋–„ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋ชจ๋‘ ์œ„ ๋ฉ”์†Œ๋“œ์˜ ๋‘๋ฒˆ์จฐ ์ธ์ž๊ฐ’์ธ response ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋‹ด๊ฒจ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
         */
        
        if response.notification.request.identifier == "wakeup" {
            let userInfo = response.notification.request.content.userInfo
            print(userInfo["name"]!)
        }
        completionHandler()
    }

์ฝ”๋“œ๋ฅผ ์ญ‰ ์ฝ์–ด๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

์šฐ์„  appDelegate์ชฝ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , iOS11 ์ด์ƒ๊ณผ ๋‹ค๋ฅธ ๋ฒ„์ „์—์„œ์˜ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ ๋ถ„๊ธฐํ•ด์„œ ๊ถŒํ•œ์„ ์–ป์–ด์˜จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์— willPresent์™€ didReceive ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์ „์ž๋Š” ์•Œ๋ฆผ ๋ฐฐ๋„ˆ๋ฅผ ๋„์šฐ๋Š” ์—ญํ• , ํ›„์ž๋Š” ์•Œ๋ฆผ ๋ฐฐ๋„ˆ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ์ด๋ฒคํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด ๋ฐฐ๋„ˆ ํด๋ฆญ ์‹œ, ์•ฑ์˜ ์‹œ์ž‘์ด ์•„๋‹Œ ๊ทธ ๊ณณ์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•˜๊ฒŒ ์„ค์ •ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.)

 

โœ… 4. ํŠน์ • ์‹œ๊ฐ„ ๋ง๊ณ  ๋‹ค๋ฅธ trigger๋Š”?

๋ฌผ๋ก  ํŠน์ • ์‹œ๊ฐ„์—๋งŒ ๋ณด๋‚ด๋Š” ๊ฒƒ ๋ง๊ณ ๋„ ๋‹ค์–‘ํ•œ ํŠธ๋ฆฌ๊ฑฐ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

https://developer.apple.com/documentation/usernotifications

 

Apple Developer Documentation

 

developer.apple.com

์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด

ํŠธ๋ฆฌ๊ฑฐ๋“ค

ํŠน์ • ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์ง€์—ญ, ํ‘ธ์‰ฌ, ์ผ์ •์‹œ๊ฐ„ ๋ฐ˜๋ณต ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์ด ์กด์žฌํ•˜๋‹ˆ๊นŒ ์ž˜ ํ™œ์šฉํ•ด ๋ณด๋„๋ก ํ•˜์ž.

๊ณต์‹ ๋ฌธ์„œ์— ๊ฐ€๋ฉด ๋” ๋‹ค์–‘ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์–ด์„œ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค...!

 

 

Comments