ํ”„๋กœ์ ํŠธ/Today I Define

[Today I define] ๋กœ์ปฌ ์•Œ๋ฆผ ์ˆ˜์ • ( + ์–ดํ”Œ ์†Œ๊ฐœ)

๊ฒฝํ‘ธ 2022. 3. 14. 20:34
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•œ ๋‚ด์—ญ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค : )

 

[ ์ผ๋‹จ ๋งํฌ๋ถ€ํ„ฐ โฌ‡ ]

 

‎ํ‹ฐ๋“œ - ๋‚˜๋Š” ์ด๊ฑธ ์ด๋ ‡๊ฒŒ ๋ถ€๋ฅด๊ธฐ๋กœ ํ–ˆ๋‹ค

‎[ Today I Define ์†Œ๊ฐœ ] โ— ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋””์ž์ธ โ— ํŽธ๋ฆฌํ•œ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ โ— ๊ฐ„๋‹จํ•œ ์ž‘์„ฑ ๋ฐฉ๋ฒ• โ— ๊ฐ„ํŽธํ•˜๊ฒŒ ์ œ๊ฑฐ ( ๋ฐ€์–ด์„œ ์ œ๊ฑฐ ) โ— ์ƒ๊ฐ๋‚˜๋Š” ๋‹จ์–ด๊ฐ€ ์—†๋‹ค๋ฉด ๋Š์ž„์—†๋Š” ๋‹จ์–ด ์ถ”์ฒœ โ— ์บ˜๋ฆฐ๋”๋ฅผ ํ†ตํ•ด

apps.apple.com

 

์†Œ๊ฐœ

์‚ฌ๋žŒ๋งˆ๋‹ค "ํŠน์ •ํ•œ ๋‹จ์–ด์—์„œ ๋Š๋ผ๋Š” ๊ฐ์ •, ์ƒ๊ฐ ๋ชจ๋‘ ๋‹ค๋ฅด์ง€ ์•Š์„๊นŒ?" ํ•˜๋Š” ์ƒ๊ฐ์—์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ์ƒ ์†์—์„œ ๋– ์˜ค๋ฅด๋Š” ๋‹จ์–ด๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ฐ์ •์„ ๊ธฐ๋กํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

 

์—…๋ฐ์ดํŠธ

์ฒ˜์Œ ๋กœ์ปฌ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ๊นŒ์ง€ ์ž˜ ๋งˆ๋ฌด๋ฆฌ๋œ ์ƒํ™ฉ์ด์—ˆ๋Š”๋ฐ ์ด์ƒํ•˜๊ฒŒ๋„ ๊ฐ™์€ ์•Œ๋ฆผ์ด ๊ณ„์† ์˜ค๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  

์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ ์šฉ ๋ฐฉ๋ฒ•

func setNoti() {

    //๊ธฐ์กด์— ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ–ˆ๋˜ Notification์„ ์ œ๊ฑฐ
    userNotiCenter.removeAllPendingNotificationRequests()
    
	// ์•Œ๋ฆผ์„ค์ •์‹œ ์ธ๋””์ผ€์ดํ„ฐ ํ‘œ์‹œ๋ฅผ ์œ„ํ•จ!    
    indicator.isHidden = false
    
    DispatchQueue.main.async {
    	// ์•Œ๋ฆผ ์„ค์ •์‹œ, ๋‹น์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ๋‚  ๋ถ€ํ„ฐ ์ ์šฉ ( ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹น์ผ Date๋ฅผ ๋ฐ›์Œ )
        // + ๊ธฐ์กด์˜ ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ(shuffled๋œ ๋ฐฐ์—ด) ๋ชจ๋‘ ์ œ๊ฑฐ
        randomWords.wordList.shuffleWords(date: Date())
        // ์•„๊นŒ ๋ง์”€๋“œ๋ฆฐ 800์—ฌ๊ฐœ์˜ ์•Œ๋ฆผ ๋“ฑ๋ก...
        self.registerContent {
        	// ์ธ๋””์ผ€์ดํ„ฐ ํžˆ๋“ 
            self.indicator.isHidden = true
        }
    }
}

 

- ๊ธฐ์กด์— ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•œ ์•Œ๋ฆผ ๋“ค์„ ์ œ๊ฑฐํ•˜๊ณ  ๋žœ๋คํ•œ ๋‹จ์–ด ๋ฐฐ์—ด์„ Notification์˜ Content์— ๋„ฃ์–ด์คฌ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ์•Œ๋ฆผ์„ ์„ค์ •ํ•œ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ 64๊ฐœ์˜ ๋‹จ์–ด๋ฅผ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ( ๋กœ์ปฌ ์•Œ๋ฆผ์˜ ๊ฒฝ์šฐ, ์ตœ๋Œ€ 64๊ฐœ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค )

 

// Realm์„ ์ด์šฉํ•ด ์ €์žฅํ•ด ๋’€๋˜ ๋‹จ์–ด์—์„œ ํ•ด๋‹น ๋‚ ์งœ์˜ ๋‹จ์–ด๋ฅผ ๋ฐ˜ํ™˜
func randomWordGenerate(date: Date) -> String {

    let format = DateFormatter()
    format.dateFormat = "yyyy๋…„ MM์›” dd์ผ"
    let value = format.string(from: date)

    let tasks = localRealm.objects(NotiWordModel.self).filter("date == %@",value)
    return tasks[0].word
}

 

- ์•ž์„œ ์„ค๋ช…ํ•œ 64๊ฐœ์˜ ๋‹จ์–ด๋ฅผ Realm์— ์ €์žฅํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ๋‚ ์งœ์˜ ๋‹จ์–ด๋ฅผ ๊ฐ€์ง€๊ณ ์™€ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. 

 

func registerContent(onCompletion: @escaping () -> Void) {

 var pickedDate = notiTimePicker.date

  // ๋ฐ˜๋ณต๋ฌธ
  for item in 0..< 64 {
     // ํ•˜๋ฃจ์”ฉ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ
     let newDate = Calendar.current.date(byAdding: .day, value: item, to: date)
     // ํ•ด๋‹น ๋‚ ์งœ์˜ ๋‹จ์–ด ๊ฐ€์ง€๊ณ ์˜ค๊ธฐ
     let word = randomWords.wordList.randomWordGenerate(date: newDate!)

     // ์‹ค์ œ ์•Œ๋ฆผ์‹œ ๋ณด๊ฒŒ ๋  ๋‚ด์šฉ๋“ค์ž…๋‹ˆ๋‹ค!
     let content = UNMutableNotificationContent()
     content.title = "์˜ค๋Š˜๋„ ํ‹ฐ๋“œ์™€ ํ•จ๊ป˜ ํ•ด์š”๐Ÿƒ๐Ÿป‍โ™‚๏ธ"
     content.body = "์˜ค๋Š˜์˜ ์ถ”์ฒœ ๋‹จ์–ด๋Š” [ \(word) ]์ž…๋‹ˆ๋‹คโ—๏ธ\n\(word)์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ์ž‘์„ฑํ•˜๋Ÿฌ ๊ฐ€์š”๐Ÿ˜Š"
     content.sound = .default

     // ๋ฐ˜๋ณต์€ ๋‹น์—ฐํžˆ false๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ๊ฒ ์ฃ !
     let trigger = UNCalendarNotificationTrigger(
            dateMatching: Calendar.current.dateComponents([.month,.day,.hour, .minute], from: pickDate), repeats: false)
     // ํ•˜๋ฃจ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฑฐ์—์š”! ์ง€๊ธˆ๋ณด๋‹ˆ๊นŒ ์ฝ”๋“œ ์™•๋ณ„๋กœ๋„ค..
     pickDate.addTimeInterval(86400)

     let request = UNNotificationRequest(identifier: content.body, content: content, trigger: trigger)

     // ๋“ฑ๋กํ•ด๋ณด์ฃ !
     self.userNotiCenter.add(request) { error in
         guard error != nil else {
             return
         }
         DispatchQueue.main.async {
             self.showToast(message: "๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”!")
         }
    }
  }
}

- ์œ„์™€ ๊ฐ™์ด 64๊ฐœ์˜ ์•Œ๋ฆผ์„ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ฃผ๋จน๊ตฌ๊ตฌ ์‹์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋˜์–ด ์•„์‰ฝ๊ธด ํ•˜์ง€๋งŒ ๊ธฐ์กด MVC์—์„œ MVVM์œผ๋กœ  ๋ณ€๊ฒฝํ•  ๋•Œ ํ•จ๊ป˜ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

 

๋ฐ˜์‘ํ˜•