๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

๋งˆํŠธ์‰ฌ๋Š”๋‚  ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

|

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

  • ๋งˆํŠธ ํœด๋ฌด์ผ์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๊ท€์ฐฎ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋งˆํŠธ์‰ฌ๋Š”๋‚  ์•Œ๋ฆฌ๋ฏธ iOS์•ฑ
  • ํŒ€ํ”„๋กœ์ ํŠธ(iOS 1๋ช… + ๋ฐฑ์—”๋“œ 1๋ช…)
  • ์ˆ˜ํ–‰๊ธฐ๊ฐ„: 2018.08 ~
  • App Store

์•ฑ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ๋ธŒ๋žœ๋“œ๋ณ„ ๋งˆํŠธ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ, ์ƒ์„ธ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ์˜ ํœด๋ฌด์ผ์„ ์•ฑ ๋ฉ”์ธ ํ™”๋ฉด๊ณผ ์œ„์ ฏ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ์˜ ํœด๋ฌด์ผ ํ•˜๋ฃจ ์ „, ์œ ์ €์—๊ฒŒ ํ‘ธ์‹œ๋กœ ํœด๋ฌด์ผ ์•Œ๋ฆผ์„ ๋ณด๋‚ธ๋‹ค.
    • ํ‘ธ์‹œ ๊ธฐ๋Šฅ์€ FCM(Firebase Cloud Messaging)๊ณผ Firebase DB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•จ

์ œ ์•ฑ์€ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค

๋งŒ๋“ค๊ฒŒ ๋œ ๋™๊ธฐ

  • ์ฒ˜์Œ์— iOS์‹œ์ž‘ํ• ๋•Œ, ๋•Œ๊ฐ€ ๋˜๋ฉด ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ์•ฑ์„ ๋งŒ๋“ค์–ด๋ณด์ž๋Š” ๋ชฉํ‘œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • ์‚ฌ์†Œํ•œ๊ฑธ ๊นœ๋นกํ•˜๋Š” ์„ฑ๊ฒฉ๋„ ํ•œ๋ชซํ–ˆ๋‹ค. ๋งˆํŠธ ํœด๋ฌด์ผ๋„ ์ž์ฃผ ๊นŒ๋จน์–ด์„œ ์‰ฌ๋Š”๋‚  ๋งˆํŠธ ๋ฌธ ์•ž๊นŒ์ง€ ๊ฐ”๋‹ค๊ฐ€ ํ—›๊ฑธ์Œํ•œ๊ฒŒ ํ•œ๋‘๋ฒˆ์ด ์•„๋‹ˆ์—ˆ๋‹ค.
  • ํœด๋ฌด์ผ ์ฃผ๋ง์ด๋ฉด ๋„ค์ด๋ฒ„ ์‹ค๊ฒ€์— OO๋งˆํŠธ ํœด๋ฌด์ผ์ด๋ผ๋Š” ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์–ด...๋‚˜๋งŒ ๋ถˆํŽธํ•œ๊ฒŒ ์•„๋‹ˆ๋„ค!? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ 
  • ๊ฒฐ๊ตญ, ๋งŒ๋“ค์–ด์•ผ๊ฒ ๋‹ค๊ณ  ๊ฒฐ์‹ฌ!

ํž˜๋“ค์—ˆ๋˜ ์  / ์‹ ๊ฒฝ์“ด ๊ตฌํ˜„

1. ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„

์ด์Šˆ

  • ์•ฑ ์ „์ฒด๋ฅผ ๊ด€ํ• ํ•˜๋Š” ํ•ต์‹ฌ์ด ๋˜๋Š” ๊ฐ์ฒด(FavoriteList)๋ฅผ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ ์ž ๋…ธ๋ ฅ

ํ•ด๊ฒฐ

  • ํ•œ ์œ ์ €๋‹น ํ•˜๋‚˜์˜ ์ฆ๊ฒจ์ฐพ๊ธฐ(FavoriteList๊ฐ์ฒด)๋งŒ ์กด์žฌํ•ด์•ผํ•˜๋ฏ€๋กœ Singleton์œผ๋กœ ๊ตฌํ˜„
  • ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ pop / push ํ•œ ํ›„ ์„ฑ๊ณต์—ฌ๋ถ€๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ์œ„ํ•ด Bool๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•ต์‹ฌ์ธ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ „์šฉ stack๊ตฌ์กฐ ๊ตฌํ˜„
  • ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ์ •๋ณด๋Š” ๋งˆํŠธ๊ฐ์ฒด์˜ ์†์„ฑ์ค‘ id: Int๋งŒ Set<Int>ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ์œ ์ €์˜ ์ฆ๊ฒจ์ฐพ๊ธฐ ์„ค์ •๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด, NSCoding์„ ๊ตฌํ˜„ํ•˜๊ณ  UserDefaults์™€ NSKeyedArchiver๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์•„์นด์ด๋น™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ

2. ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ(ํ”„๋กœํ† ์ฝœ / ์ƒ์† ๋“ฑ์œผ๋กœ ์ถ”์ƒํ™” ๋œ ๊ฐ์ฒด ๊ตฌํ˜„)

์ด์Šˆ

  • ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ๋˜ ๊ธฐ๋Šฅ๋“ค: ์ •๋ณด ๊ฒ€์ƒ‰๊ณผ ์—ด๋žŒ / ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€ ์‚ญ์ œ / ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ํ™•์ธ
  • ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ฃผ๊ฐ€ ๋˜๋Š” ์•ฑ์ด๋‹ค๋ณด๋‹ˆ, ์œ„์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต์ ์ธ ๋ทฐ์™€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ค‘๋ณต๋˜์—ˆ๊ณ , ๊ฒฐ๊ตญ ์ปค๋‹ค๋ž€ ์ค‘๋ณต์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ๋‹ค.

    ํ•ด๊ฒฐ

  • ๋ทฐ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Custom Delegate๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค.
  • ๋˜ํ•œ ์ปค์Šคํ…€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋• ์ตœ๋Œ€ํ•œ ํ”„๋กœํ† ์ฝœ๊ณผ ์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅํ™•์žฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์˜€๋‹ค.
  • ์ฃผ๋กœ Delegate๊ฐ์ฒด๋Š” ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, View๋‚˜ ViewController๋Š” ์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์•ฑ์Šคํ† ์–ด Reject

  • ๋–จ๋ฆฌ๋Š” ๋งˆ์Œ์œผ๋กœ ์™„์„ฑ๋œ ์•ฑ์„ ์ œ์ถœํ–ˆ๋Š”๋ฐ, ์ดํ‹€ ํ›„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚ ์•„์™”๋‹ค. Reject์ด๋ผ๊ณ . ์ด์œ ๊ฐ€ ๋” ์ถฉ๊ฒฉ์ด๋‹ค. ์ด์œ ๋Š” App Completeness - We were unable to review your app as it crashed on launch.์˜€๋‹คโ€ฆ
  • ์—ฌ๋‹ด์ด์ง€๋งŒ ์ด ์‹œ๊ธฐ์— ๋‚˜๋Š” ๋„ˆ๋ฌด ์ •์‹ ์ ์œผ๋กœ ์ฒด๋ ฅ์ ์œผ๋กœ ์•ฝํ•ด์ ธ์žˆ์–ด์„œ, ์ € ๋ฌธ๊ตฌ๋Š” ๋งˆ์น˜ ๋‚˜์—๊ฒ ์•ฑ์ด ๋Ÿฐ์นญ๋„ ์•ˆ๋ผ์„œ ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ๋„ ๋ชปํ–ˆ๋‹ค. ์ด๋Ÿฐ ํ—ˆ์ ‘์„ ๋งŒ๋“ค์–ด๋†“๊ณ  ์šฐ๋ฆฌํ•œํ…Œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ”๋ผ๋Š”๊ฑฐ์ž„? ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค ใ… _ใ… 

Crash ์ด์œ 

  • Crash report ๋ถ„์„๊ฒฐ๊ณผ, AppDelegate๋‚ด์˜ FCMํ‘ธ์‹œํ† ํฐ์„ ๋ฐ›์•„์˜ค๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ ์˜ต์…”๋„ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • Optional Forced-unwrapping์œผ๋กœ Bool!ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์—ˆ๊ณ , ํ•ด๋‹น ๋ณ€์ˆ˜์— ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•œ ๋ฌธ์ œ์˜€๋‹ค.
  • ์•ฑ์„ ์ฒ˜์Œ ์„ค์น˜ํ•˜๋ฉด Push Notification ์Šน์ธ์— ๋Œ€ํ•œ alert๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น alert์ฐฝ์˜ ๋ฒ„ํŠผ์„ ์„ ํƒํ•ด์•ผํ–ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์œ ์ €๊ฐ€ ํ•ด๋‹น alert์˜ allow / don't allow๋ฅผ ๋ฐ”๋กœ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜์–ด, nil๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๊ฒฐ

  • ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ Bool?ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํšŒ๊ณ 

  • ์‹คํ–‰ ์‹œ์ ์„ ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“  ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ๋Š” ์–ด๋–ค ์ž‘์—…์„ ํ•˜๋“ ์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด์•ผํ•จ
  • ๋˜ํ•œ, ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด์„œ ํ…Œ์ŠคํŠธํ•ด์•ผํ•จ. ์œ ์ €๊ฐ€ ๋‹น์—ฐํžˆ ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ์•ก์…˜์„ ๊ทธ๋Œ€๋กœ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์œ„ํ—˜ํ•œ ๋ฐœ์ƒ!!
  • ์˜ต์…”๋„์ฒ˜๋ฆฌ๊ฐ™์€ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ์—์„œ ์ •๋ง criticalํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นŠ์ด ์ƒˆ๊ธฐ๊ฒŒ๋˜์—ˆ๋‹ค..(๋ฐฐ์šด๋Œ€๋กœ๋งŒ ์ฝ”๋”ฉํ•ด์•ผ๊ฒ ๋‹ค)
  • ๊ฒŒ๋‹ค๊ฐ€ ์ด๊ฒƒ๋งŒ ๊ณ ์ณ์„œ ์•ฑ์„ ์ œ์ถœํ–ˆ๋”๋‹ˆ ๋ฐ”๋กœ ์Šน์ธ๋๋‹ค. ์‹ค์ˆ˜๋งŒ ์—†์—ˆ๋‹ค๋ฉด ํ•œ๋ฒˆ์— ์Šน์ธ๋์„์ง€๋„โ€ฆ

๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„ ์ด์™ธ์˜ ํž˜๋“ค์—ˆ๋˜ ์ 

๋””์ž์ธ

  • ํ•€ํ„ฐ๋ ˆ์ŠคํŠธ์—์„œ ๋ชจ๋ฐ”์ผUI / color palette ๊ฒ€์ƒ‰ํ•ด์„œ ์•„๋ฌด๋ฆฌ ๋ณด๋ฉด ๋ญํ•˜๋‚˜. ๋””์ž์ด๋„ˆ ๋ง๊ณ  ๊ฐœ๋ฐœ์ž๋กœ ์ „ํ–ฅํ•˜๊ธธ ์ž˜ํ–ˆ๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ณ„๊ธฐ์˜€๋‹ค.
  • ๊ทธ๋‚˜๋งˆ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์—๊ฒŒ์„œ ํ”ผ๋“œ๋ฐฑ์„ ๋“ค์–ด์„œ ์•ฑ ๋ฉ”์ธ ์ƒ‰๊น” ์ •ํ•˜๊ณ  ํ…Œ์ด๋ธ”๋ทฐ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์—ญ์‹œ ํ˜‘์—…๊ณผ ์ˆ˜์š”์กฐ์‚ฌ์˜ ํž˜์ด๋ž€!
  • Flaticon, ํ‚ค๋…ธํŠธ, ๋‚˜๋ˆ”๊ธ€๊ผด ๋งŒ๋“œ์‹  ๋ถ„๋“ค ๋ณต๋ฐ›์œผ์„ธ์š”!

์ผ์ •

  • ๊ณ ๋ฐฑํ•˜์ž๋ฉด, ์ฒ˜์Œ์—” ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‘ ๋‹ฌ์ด๋‚˜ ๊ฑธ๋ฆด์ง€ ์˜ˆ์ƒ์„ ๋ชปํ–ˆ๋‹ค. ํ•œ ๋‹ฌ ์ •๋„์— ๋๋‚ด๋ ค๋Š” ํ”„๋กœ์ ํŠธ์˜€๋Š”๋ฐ ํ˜ผ์ž์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋Š” ์ฒซ ํ”„๋กœ์ ํŠธ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ณณ์—์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ๋‹ค.
  • ๊ฐ‘์ž๊ธฐ ์ž˜๋˜๋˜ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๊ฐ€ ๋ง์„ ์•ˆ๋“ค์–ด์„œ ์• ํ”Œ ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ ํ”„๋กœ๋น„์ €๋‹ ํŒŒ์ผ์„ ๋ช‡๋ฒˆ์ด๋‚˜ ๋งŒ๋“ค๊ณ , ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ”„๋กœ๋น„์ €๋‹์ด ๊ผฌ์—ฌ์„œ ๋นŒ๋“œ ์ž์ฒด๊ฐ€ ์•ˆ๋˜๊ณ , ์ค‘๊ฐ„์— ๊ฐœ๋ฐœ์ž ๊ณ„์ •์„ ๋ฐ”๊พธ๋Š๋ผ ๋˜ ์• ํ”Œ ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ ํ•œ๋‚˜์ ˆ์„ ๋„˜๊ฒŒ ๋ณด๋‚ธ ์ ๋„ ์žˆ์—ˆ๊ณ โ€ฆApp Extension๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ ๋””ํŽœ๋˜์‹œ ๋ฌธ์ œ๋กœ ๋ช‡ ์ผ๋™์•ˆ ๋นŒ๋“œ๊ฐ€ ์•ˆ๋œ ์ ๋„ ์žˆ๊ณ ..๋ธ”๋ผ๋ธ”๋ผโ€ฆ
  • ์‚ฌ์‹ค ์ฝ”๋”ฉ ์ด์™ธ์˜ ์‹ ๊ฒฝ ์“ธ ๊ฒƒ๋“ค์ด ๋งŽ์•„์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ๋‹คใ… _ใ… 
  • ๊ฒŒ๋‹ค๊ฐ€ ์ทจ์ค€์ƒ์˜ ์‹ ๋ถ„์ด๋ผ ์–ด๋–ค๋‚ ์€ ์ž…์‚ฌ์„œ๋ฅ˜๋ฅผ ์ค€๋น„ํ•˜๋‹ค๊ฐ€ ์‹ฑ์ˆญ์ƒ์ˆญํ•ด์„œ ๋งˆ์Œ์„ ์ž˜ ๋‹ค์žก์ง€ ๋ชปํ•œ ๋‚ ๋„ ์‚ฌ์‹ค ๋งŽ์•˜๋‹ค.

ํšŒ๊ณ 

  • ํ•˜์ง€๋งŒ ์ด ๊ฒฝํ—˜์„ ํ† ๋Œ€๋กœ ์•ž์œผ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ• ๋•Œ ๊ฒช์„ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋ฏธ๋ฆฌ ๊ฒช์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด์   ํ”„๋ ˆ์ž„์›Œํฌ ๋””ํŽœ๋˜์‹œ๋‚˜, ์•ฑ ๋ฐฐํฌ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ํ”„๋กœ๋น„์ €๋‹ ํŒŒ์ผ์ƒ์„ฑ, ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์„ธํŒ…, Test Flight๋ฐฐํฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฉ˜ํƒˆ๊ด€๋ฆฌโ€ฆ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ ์–ด๋–ค ๊ฒƒ์ด ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ƒ๊ธด ๊ฒƒ ๊ฐ™๊ณ  ๋ฐฐ์šด ๊ฒƒ์„ ํ† ๋Œ€๋กœ ์•ž์œผ๋กœ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์„๊ฒƒ ๊ฐ™๋‹ค : )
  • ์•ž์œผ๋กœ ๋ฒ„์ „์—…์„ ๊ณ„์†ํ•ด๊ฐ€๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ข€ ๋” ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ธ๋ฐ, ๊ฐœ์„ ์ ์„ ํ† ๋Œ€๋กœ ๊ณ„์† ์ฝ”๋“œ๋„ ๊ฐœ์„ ํ•ด๋‚˜๊ฐˆ ์˜ˆ์ •์ด๋‹ค.

AppDelegate์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ ๋™์ผํ•œ ๋™์ž‘ ๊ตฌํ˜„ํ•˜๊ธฐ

|

AppDelegate์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์—์„œ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ๋•Œ์˜ ์˜๋ฌธ์ . ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ˆœ์„œ์—๋”ฐ๋ผ์„œ ์—ฐ์†์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ ๊ทธ ์•ˆ์—์„œ ๋˜‘๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋„ ๊ดœ์ฐฎ์„๊นŒ? ๋น„ํšจ์œจ์ ์ด์ง€ ์•Š์„๊นŒ?

  • ์ฆ๊ฒจ์ฐพ์ด ๊ฐ€์ ธ์˜ค๊ธฐ์œ„ํ•ด ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
          // loadedData๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ favoriteList๋ฅผ ์ €์žฅํ•ด์ฃผ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋ฉด ํ•˜์œ„ ๋ชจ๋“ˆ๋“ค์—์„œ ์ ‘๊ทผํ•˜๋Š” FavoriteList.shared()๋กœ ๋ฐ›๋Š” ์ธ์Šคํ„ด์Šค๋Š” ๋ชจ๋‘ ๊ทธ๋ƒฅ Set<Int>()๋กœ init์ด ๋˜๋‹ˆ๊นŒ ์ƒ๊ด€์—†์Œ
          guard let loadedData = DataStorage<FavoriteList>.load() else { return true }
          FavoriteList.loadSavedData(loadedData) // Favorite๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ–ˆ๋˜ ์ธ์Šคํ„ด์Šค๋กœ ๋Œ€์ฒดํ•ด์คŒ
    
          return true
      }
    
  • ์ฒซ ์‹œ์ž‘
    application(_:didFinishLaunchingWithOptions:)
    applicationDidBecomeActive
    
  • ํ™ˆ๋ฒ„ํŠผ๋ˆŒ๋Ÿฌ์„œ ํ™ˆ ํ™”๋ฉด์œผ๋กœ ๊ฐˆ๋•Œ
    applicationWillResignActive
    applicationDidEnterBackground
    
  • ์‹คํ–‰(๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜€๋‹ค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‹ค์‹œ๋œฐ๋•Œ)
    applicationWillEnterForeground
    applicationDidBecomeActive
    
  • ํ™ˆ๋ฒ„ํŠผ ๋‘๋ฒˆ ์—ฐ์† ๋ˆŒ๋ €์„ ์‹œ (์•ฑ ํ™”๋ฉด์€ ๋ณด์ด์ง€๋งŒ inactive์ƒํƒœ)
    applicationWillResignActive
    
  • ํ™ˆ๋ฒ„ํŠผ ๋‘๋ฒˆ ๋ˆŒ๋Ÿฌ์„œ ์œ„๋กœ ์Šค์™€์ดํ”„ํ•˜์—ฌ ๋Œ๋•Œ ํ˜ธ์ถœ์ˆœ์„œ ํ…Œ์ŠคํŠธ
    applicationWillResignActive
    applicationDidEnterBackground
    applicationWillTerminate
    
  • ํ…Œ์ŠคํŠธ์‹œ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒ๋Œ€๋กœ ๊ฐˆ๋•Œ ํ•ญ์ƒ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋‘๊ฐœ
    applicationWillResignActive
    applicationDidEnterBackground // ์˜ค๋žซ๋™์•ˆ active์ƒํƒœ๊ฐ€์•„๋‹๋•Œ
    
  • ์˜ˆ๋น„์ƒํƒœ์™€ / ์ง„์งœ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ๊ผญ ๋‘๊ฐœ์”ฉ ํ˜ธ์ถœ๋˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ• ๊นŒ?
  • ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ œ์ผ ์ข‹์ง€๋งŒ, ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ๋ฐ˜๋ณตํ•˜๊ฒŒ ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•ด๋‹น ์ฝœ๋ฐฑ๋“ค์ด ๋ถˆ๋ฆฌ๋Š” ์‹œ๊ฐ„์ฐจ๋™์•ˆ ๋‚ด๊ฐ€ ์ €์žฅํ•  ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋๋Š”์ง€ flag๋ฅผ ๋‘๊ณ  flag์— ๋”ฐ๋ผ์„œ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š”๊ฒŒ ์ข€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•
  • ์•ฑ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ค‘ resignActive๋‚˜ applicationWillTerminate๊ฐ™์€ ํ•จ์ˆ˜์—์„œ ๋น„๋™๊ธฐ์ž‘์—…์„ ํ•˜๋ฉด ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚ ๋–„๊นŒ์ง€๋Š” ์œ ์ง€๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ณดํ†ต์€ 1๋ถ„๋‚ด์™ธ๋กœ ์•Œ๋ ค์ ธ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ๋” ํ•„์š”ํ•˜๋‹ค๋ฉด await์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•  ๊ฒƒ

๋งˆํŠธ์‰ฌ๋Š”๋‚  ๊ฐœ์ธ์•ฑ ํ”„๋กœ์ ํŠธ

|

๋งˆํŠธ์‰ฌ๋Š”๋‚  - ํœด๋ฌด์ผ ์•Œ๋ฆฌ๋ฏธ

๋Œ€ํ˜•๋งˆํŠธ ํœด๋ฌด์ผ์„ ๋งค๋ฒˆ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๊ท€์ฐฎ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ์•ฑ

์ฃผ์š”๊ธฐ๋Šฅ

  • ๋Œ€ํ˜•๋งˆํŠธ ํœด๋ฌด์ผ ๊ฒ€์ƒ‰, ํœด๋ฌด์ผ ์ •๋ณด ์ œ๊ณต
  • ๋งˆํŠธ ์ „ํ™”๋ฒˆํ˜ธ, ์˜์—…์‹œ๊ฐ„, ํ™ˆํŽ˜์ด์ง€, ์œ„์น˜(์ง€๋„)์ •๋ณด ์ œ๊ณต
  • ๋งˆํŠธ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
  • ์œ„์ ฏ ์„œ๋น„์Šค: ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ์˜ ํœด๋ฌด์ผ ์œ„์ ฏ ํ‘œ์‹œ
  • ํ‘ธ์‹œ ์„œ๋น„์Šค: ์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ์˜ ํœด๋ฌด์ผ ํ•˜๋ฃจ ์ „ ๋‚  ํ‘ธ์‹œ ์•Œ๋ฆผ

์Šคํฌ๋ฆฐ์ƒท

๋ฌธ์˜

E-mail: jinios.dev@gmail.com

NotificationQueue ํด๋ž˜์Šค

|

๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์ด ์‹œ๋ฆฌ์–ผํ์—์„œ ์ฒ˜๋ฆฌ๊ฐ€๋˜๋Š”๊ฑด๊ฐ€!?๋ผ๋Š” ๊ถ๊ธˆ์ฆ์— ์ฐพ์•„๋ณธ ํ›„ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

class NotificationQueue : NSObject

  • Notification๋“ค์€ NotificationQueue์— ์œ„์น˜ํ•จ (FIFO)
  • NotificationCenter์— ์˜ํ•ด ํฌ์ŠคํŒ…๋˜๋Š” notification๋“ค์€ ๋™๊ธฐ์ ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ์ฆ‰, ์•ž์„ (ํ˜„์žฌ์˜)๋…ธํ‹ฐ๊ฐ€ run loop์„ ๋น ์ ธ๋‚˜๊ฐ€๊ฑฐ๋‚˜ run loop์ด ํ•œ๊ฐ€ํ•ด์ง€๊ธฐ์ „๊นŒ์ง€ ๋”œ๋ ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ค‘๋ณต๋˜๋Š” ๋…ธํ‹ฐ๋“ค์€ ์—ฌ๋Ÿฌ ๋…ธํ‹ฐ๊ฐ€ ํฌ์ŠคํŒ…๋˜๋”๋ผ๋„ ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ๋‹ค. (ํ•˜๋‚˜์˜ ๋…ธํ‹ฐ๋งŒ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด)
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ๊ธฐ๋ณธ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜ ํ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์€ default notification center(NotificationCenter.default)์™€ ์—ฐ๊ด€๋˜์–ด์žˆ๋‹ค.
  • ์ปค์Šคํ…€ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜ ํ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ผํ„ฐ์™€ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์—ฌ๋Ÿฌ ํ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์ด ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š”๊ฒƒ์€ ์•ฑ์ด ๋ฐ”์œ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๋…ธํ‹ฐ๋‹ค ๋ฐ˜๋ณต๋ ๋•Œ ์•ฑ์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ฉˆ์ถ”๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋‹ค.
  • ์ด๋•Œ NotificationQueue๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์‹œ
    let notification = Notification(name: Notification.Name("MyValueChanged"))
    NotificationQueue.default.enqueue(notification, postingStyle: .whenIdle, coalesceMask: .none, forModes: nil)
    

์ถœ์ฒ˜

TIL_20181008 ~ 20181015

|

2018.10.08

  • ํ…Œ์ŠคํŠธ๋นŒ๋“œํ• ๋•Œ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ชป์ฐพ์•„์„œ ๋นŒ๋“œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ• ๋•Œ ์ฐพ๋Š” ๊ฒฝ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•!
  • ํŒŒ์ด์–ด๋ฒ ์ด์Šค ๊ตฌ๋… ๋ณด๋‚ด๊ธฐ / ๋‹จ์ผ๊ธฐ๊ธฐ๋ณด๋‚ด๊ธฐ ์„ฑ๊ณต
    • https://stackoverflow.com/a/45268025
  • ํŒŒ์ด์–ด๋ฒ ์ด์Šค Messaging๊ฐ์ฒด์˜ fcmtoken์€ ์œ ์ €๊ฐ€ notification์„ ํ—ˆ์šฉํ•˜๋“  ์•ˆํ•˜๋“  ์ƒ๊ด€์—†์ด ๋ฐœํ–‰.
  • DataStorage๋ฅผ ์ด์šฉํ•˜๊ณ , ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์ €์žฅ๊ณผ ๊ตฌ๋…์€ ์•ฑ์„ ๋„๊ฑฐ๋‚˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๊ฐ”์„๋•Œ๋งŒ ํ•จ!
  • favorites์„ ํ‘œ์‹œํ•˜๋Š” ์‹œ์  ์‹ฑํฌ๋ฅผ ๋งž์ถ”๊ณ  ์•ฑ์ต์Šคํ…์…˜์—์„œ๋„ ๋งž์ถ”๊ธฐ์œ„ํ•ด(fetch๊ฐ€ ๋น„๋™๊ธฐ์ž„) ๋‚ด๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์•ฑ์˜ ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” AppDelegate์—์„œ๋งŒ FavoriteAPI๋ฅผ ํ†ตํ•ด ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์ฆ๊ฒจ์ฐพ๊ธฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. (fetch๋Š” ์•„์ง ์‚ฌ์šฉํ•˜๊ณ ์žˆ์ง€์•Š์Œ)
  • ๋Ÿฐ์น˜ ์Šคํฌ๋ฆฐ ์ €์žฅ

2018.10.09

์˜ค๋ฒ„๋ผ์ด๋“œ ๋ฐฉ์ง€(Preventing Overrides) final๋กœ ํ‘œ์‹œํ•˜์—ฌ ์˜ค๋ฒ„๋ผ์ด๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์†Œ๋“œ, ์†์„ฑ ๋˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ. ๋ฉ”์†Œ๋“œ, ์†์„ฑ ๋˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ์˜ final var, final func, final class func๊ทธ๋ฆฌ๊ณ  final subscript๊ฐ™์€ ์†Œ๊ฐœ ํ‚ค์›Œ๋“œ ์•ž์— final ์ˆ˜์‹์–ด๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ˆ˜ํ–‰ํ•จ.

์„œ๋ธŒํด๋ž˜์Šค ์•ˆ์—์„œ final ๋ฉ”์†Œ๋“œ, ์†์„ฑ ๋˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋Ÿฌ๋กœ ๋ณด๊ณ ๋จ. ๋ฉ”์†Œ๋“œ, ์†์„ฑ ๋˜๋Š” ์„œ๋ธŒ์Šคํฌ๋ฆฝํŠธ๋Š” ํ™•์žฅ ์ •์˜์•ˆ์— final๋กœ์„œ ํ‘œ์‹œํ•˜์—ฌ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.

ํด๋ž˜์Šค ์ •์˜์—์„œ class ํ‚ค์›Œ๋“œ ์•ž์— final ์ˆ˜์‹์–ด๋ฅผ ์“ฐ๋„๋ก ํ•˜์—ฌ final๋กœ์„œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Œ(final class). final ํด๋ž˜์Šค๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋Ÿฌ๋กœ ๋ณด๊ณ ๋  ๊ฒƒ์ž„.

  • MartSelectViewController์—์„œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ๊ณผ ๋งˆํŠธ๊ฒ€์ƒ‰ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜์‹œ ๋กœ๋”ฉ ํ”ผ๋“œ๋ฐฑ ํ‘œ์‹œ

  • loadingIndicator ์‚ฝ์ž…
    • NVActivityIndicator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    • ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ํ™”๋ฉด์ด ์ž˜ ๋ณด์ด์ง€ ์•Š์•„์„œ ์Šคํƒ€๋ฒ…์Šค ์•ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ, ๋‚ด๋น„๊ฒŒ์ด์…˜ ํ™”๋ฉด์ด ์ „ํ™˜๋ ๋•Œ ํฐ์ƒ‰ ํ™”๋ฉด์ด ๋œจ๋„๋ก ๋ณ€๊ฒฝ
  • ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ์ค„๋•Œ ์…€์ด ๋ˆŒ๋ฆฌ์ž๋งˆ์ž ๋งˆํŠธ๋กœ๊ณ ๊ฐ€ ์ปฌ๋Ÿฌํ™”๋œ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋ˆ„๋ฅธ ํ›„์— ๋นˆํ™”๋ฉด+๋กœ๋”ฉ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ผ๊ณ  ๋นˆ ํ™”๋ฉด์„ pushํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋งˆํŠธ ๊ฒ€์ƒ‰ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉด์ข‹๊ฒ ๋Š”๋ฐ, ๋ฌธ์ œ๋Š”
    • ๋ˆŒ๋ฆฌ์ž๋งˆ์ž ์…€์ด ์ปฌ๋Ÿฌํ™”๊ฐ€ ์•ˆ๋˜๊ณ 
    • ๋นˆ ํ™”๋ฉด + ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ๋งˆํŠธ์„ ํƒํ™”๋ฉด์ด ๋…ธ์ถœ๋œ ์ฑ„๋กœ ๊ทธ ๋‹ค์Œ ํ™”๋ฉด์ด push๋๋‹ค.
  • ๋ˆŒ๋ฆฌ์ž๋งˆ์ž ์…€์ด ์ปฌ๋Ÿฌํ™”๊ฐ€ ์•ˆ๋˜๋Š” ๋ฌธ์ œ : ํ…Œ์ด๋ธ”๋ทฐ ์…€์— ์žˆ๋Š” ui๋ณ€๊ฒฝ์ด ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ๋Š”๊ฒƒ ํ•ด๊ฒฐ
    • ์Šคํฌ๋กค๋ทฐ์˜ ์–ด๋–ค ์†์„ฑ๋•Œ๋ฌธ์ธ๋ฐ ๊ทธ๊ฑด๋ฐ”๋กœ delaysContentTouches
    • tableView.delaysContentTouches = false๋กœ ์ฃผ๋ฉด
    • https://codeburst.io/delayed-performance-in-ios-6c983872fa46
  • ๋งˆํŠธ์„ ํƒํ™”๋ฉด์ด ๋…ธ์ถœ๋œ์ฑ„๋กœ ๊ทธ ๋‹ค์Œ ํ™”๋ฉด์ด push๋˜๋Š” ๋ฌธ์ œ: viewDidDisappear๋กœ ํ•ด๊ฒฐ
    • indicatorํ™”๋ฉด์„ ๋ฉˆ์ถ”๋Š” finishIndicator()ํ•จ์ˆ˜๋ฅผ viewWillDisappear์ด ์•„๋‹Œ viewDidDisappear์— ๊ตฌํ˜„ํ•˜๋‹ˆ ํ•ด๊ฒฐ๋จ

2018.10.10

  • ๋ฉ”์ผ result์—๋”ฐ๋ผ์„œ alert ํ”ผ๋“œ๋ฐฑ ๊ณ ์นจ
    • ์ด์ „์—๋Š” ๋ฉ”์ผ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ผœ์ง€๊ธฐ๋งŒ ํŒŒ๋ฉด ๋„๋ฉด์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์•Œ๋ฆผ์„ ์คฌ๋Š”๋ฐ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์ž„์‹œ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ผ์„ ์•ˆ๋ณด๋‚ด๋„ ๊ฐ์‚ฌํ•˜๋‹ค๊ณ ํ•ด์„œโ€ฆ.
  • url๋…ธ์ถœ๋˜์–ด์žˆ๋Š” ๊ฒƒ ๋ชจ๋‘ keyInfo.plistํŒŒ์ผ๋กœ ์ˆจ๊น€
  • stringํ˜•ํƒœ๋กœ ์จ์žˆ๋Š” ๋ฌธ์ž์—ด๋“ค programdescription enum์œผ๋กœ ์ˆจ๊น€

2018.10.11

  • ๋ผ์ด์„ ์Šค ๊ฐ„๋‹จํ‘œ์‹œ
  • Bundle display name ์ˆ˜์ •ํ•ด์„œ ๋””๋ฐ”์ด์Šค์Šคํฌ๋ฆฐ์— ํ‘œ์‹œ๋  (์•ฑ์„ค์น˜ํ›„ ์•ฑ ์•„์ด์ฝ˜ ๋ฐ‘์—)์ด๋ฆ„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ.
  • appstore connect ์‚ฌ์ดํŠธ์—์„œ ์•ฑ ๋“ฑ๋ก์„ ํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๋งˆํŠธ ์‰ฌ๋Š”๋‚ ์ด ์‚ฌ์šฉ์ค‘์ด์—ˆ๋‹คโ€ฆ์ถฉ๊ฒฉ๊ณผ ๊ณตํฌ(์•„๋งˆ๋„ ์•ฑ ์ถœ์‹œ๋Š” ์•ˆํ•˜๊ณ  ์•ฑ์Šคํ† ์–ด์ปค๋„ฅํŠธ์— ๋“ฑ๋ก๋งŒํ•ด๋†“์€๋“ฏ)

2018.10.12

  • ํ…Œ์ŠคํŠธํ”Œ๋ผ์ดํŠธ ๋ฐฐํฌ
  • ์•ฑ ์ด๋ฆ„ (ํ™ˆํ™”๋ฉด์— ๋ณด์ด๋Š” bundle display name) ์ง€์—ญํ™”ํ•˜๊ธฐ
    • ์˜์–ด์™€ ํ•œ๊ธ€ ์ถ”๊ฐ€
  • ํˆฌ๋ฐ์ด์ต์Šคํ…์…˜์ด ์•ˆ๋–ด๋Š”๋ฐ ์•„๋งˆ๋„ ์•ฑ ๊ทธ๋ฃน ํ™œ์„ฑํ™” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ ค์„œ ๊ทธ๋Ÿฐ๋“ฏโ€ฆ?
  • ์ฒ˜์Œ ์•ฑ ๋‹ค์šด ๋ฐ›์•˜์„๋•Œ๋Š” ์•ˆ๋œจ๊ณ  ์œ„์ ฏ ์ž์ฒด๋Š” ์‹คํ–‰์ด ๋์ง€๋งŒ 8์‹œ๊ฐ„? ์ •๋„ ์ง€๋‚˜๋‹ˆ๊นŒ ๋œธ

2018.10.13

  • gitflow ์‚ฌ์šฉ๋ฒ•
  • Privacy policy generator๋กœ ๊ฐœ์ธ์ •๋ณด ์ทจ๊ธ‰๋ฐฉ์นจ ๋งŒ๋“ฆ
  • ๋ฆด๋ฆฌ์ฆˆ1.0 ๋ธŒ๋žœ์น˜ ๋”ฐ์„œ ๋ฆด๋ฆฌ์ฆˆ ์ „ ๋ฒ„๊ทธ ํ”ฝ์Šค ์ž‘์—…
  • ์œ„์ ฏ๋„ ๋กœ์ปฌ๋ผ์ด์ฆˆ ์ด๋ฆ„ ๋œจ๊ฒŒ ์ˆ˜์ •ํ•˜๊ธฐ
  • ํ…Œ์ด๋ธ”๋ทฐ ์…€๋ ‰์…˜์Šคํƒ€์ผ ์—†์• ๊ธฐ
  • URLSession ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ ์„ค์ •
  • release 1.0์—์„œ ์ˆ˜์ •ํ•œ ์‚ฌํ•ญ
    • ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ์ฒ˜๋ฆฌ: ํƒ€์ž„์•„์›ƒ 3~5์ดˆ
    • ๋ฆฌํŒฉํ† ๋ง: ๋ฆฌ์ณ๋นŒ๋ฆฌํ‹ฐ๋ž‘ ๋กœ๋”ฉ์ธ๋””์ผ€์ดํ„ฐ
    • ๊ฐœ์ธ์ •๋ณด์ทจ๊ธ‰๋ฐฉ์นจ
    • ๋ผ์ด์„ ์Šค ํ…์ŠคํŠธํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ณ  ์—…๋กœ๋“œ

2018.10.14

  • ๋ฆด๋ฆฌ์ฆˆ 1.0 ๋นŒ๋“œ2
  • ํ‘ธ์‹œ ํ…Œ์ŠคํŠธํ›„ ๊ตฌ๋… / ๊ตฌ๋…์ทจ์†Œ ์ž‘์—…์ด ์ œ๋Œ€๋กœ ์•ˆ๋˜๊ณ  ์›๋ž˜ ํ•˜๊ณ ์žˆ๋˜ ๋ฐฉ๋ฒ•์ด ์“ฐ๋ ˆ๊ธฐ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ ์ˆ˜์ •
  • ์‚ฌ์šฉ์ž๊ฐ€ favorite์„ toggleํ• ๋•Œ๋งˆ๋‹ค ๊ตฌ๋…์— ๋„ฃ์—ˆ๋‹ค ๋นผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜์ •ํ•จ
  • ๋น„๋™๊ธฐ ์‹œ๋ฆฌ์–ผํ ๋“ฑ๋“ฑ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด๋ คํ–ˆ์œผ๋‚˜ ๋””ํŽœ๋˜์‹œ ๋ฌธ์ œ๋กœ FavoriteAPI๊ฐ์ฒด๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์“ธ ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์—โ€ฆ.ใ… _ใ…  ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜ ์„ผํ„ฐ๋กœ ์ˆ˜์ •ํ•จ. ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋ง‰ ๊ป๋‹ค์ผฐ๋‹คํ•ด๋„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‹ค. ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์ด ์‹œ๋ฆฌ์–ผํ์—์„œ ์ฒ˜๋ฆฌ๊ฐ€๋˜๋Š”๊ฑด๊ฐ€!?(์ •๋ฆฌ)

2018.10.15

  • ๋ฆด๋ฆฌ์ฆˆ 1.0 ๋นŒ๋“œ 3 / ๋นŒ๋“œ 4 ๋‘๋ฒˆ ์˜ฌ๋ฆผ
  • ๋‘๋ฒˆ ์˜ฌ๋ฆฌ๊ณ  ์•ฑ ์‹ฌ์‚ฌ๋ฅผ ์œ„ํ•ด ์ œ์ถœํ•จ!!
    • ๋ฉ”์ธํ™”๋ฉด์— ์ฆ๊ฒจ์ฐพ๊ธฐ ์ •๋ณด๊ฐ€ ์—†์–ด์„œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œฐ๋•Œ โ€˜์ฆ๊ฒจ์ฐพ๋Š” ๋งˆํŠธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”โ€™ ๋ฌธ๊ตฌ๋ฅผ ๋ผ๋ฒจ์—์„œ ๋ฒ„ํŠผ์œผ๋กœ ์ˆ˜์ •
    • (๊ทธ ๋ฌธ๊ตฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ญ”๊ฐ€ ์•ก์…˜์ด๋‚˜์˜ฌ๊ฑฐ๊ฐ™๋‹ค๋Š” ์˜๊ฒฌ์ด ๋งŽ์•˜์Œ)
    • ๋ฌธ์˜๋ฉ”์ผ์— ์œ ์ €์˜ ๋””๋ฐ”์ด์Šคํ† ํฐ ๋„ฃ์Œ(๋ฌธ์˜๊ฐ€ ์˜ค๋ฉด ๋””๋น„์—์„œ ์ฐพ์•„์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก)
    • ํ‘ธ์‹œ ๋ฐฉ์‹์„ ๋ฐ”๊ฟˆ
    • ๊ตฌ๋…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ™•์ธํ•˜๊ธฐ๋„ ๋ถˆํŽธํ•˜๊ณ , DB์™€์˜ ์‹ฑํฌ๋„ ๋งž์ง€ ์•Š๋Š”๋‹ค. (์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€ํ•ด๋†“์€ ๋งˆํŠธ์™€ ํ‘ธ์‹œ ๊ตฌ๋…์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ๋งˆํŠธ๊ฐ€ ๋‹ฌ๋ผ์„œ ํ™”๋ฉด์— ์—†๋Š” ๋งˆํŠธ์— ๋Œ€ํ•œ ํ‘ธ์‹œ๊ฐ€ ์˜ฌ ์ˆ˜๋„์žˆ๊ณ , ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์—ˆ๋Š”๋ฐ ํ‘ธ์‹œ๊ฐ€ ์•ˆ์˜ฌ์ˆ˜๋„์žˆ์Œโ€ฆ)
    • ๊ตฌ๋…๋ฐฉ์‹์ด ์•„๋‹Œ ํŒŒ๋ฒ  DB์—์ €์žฅํ•ด๋†“์€ [ํ† ํฐ:[์ฆ๊ฒจ์ฐพ๊ธฐ]]๋Œ€๋กœ ํ‘ธ์‹œ๋ฅผ ๋ณด๋‚ด๊ธฐ๋กœ ํ•จ