Skip to content

MijeongJeon/iOS-Programming-Documents

Repository files navigation

iOS-Programming-Documents

Platform Language Language

iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๋ จ๋œ ์˜์–ด ๋ฌธ์„œ ๋ฐ ์‚ฌ์ดํŠธ๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋†“์•˜์Šต๋‹ˆ๋‹ค.

  • ์ฒœ์ฒœํžˆ, ์กฐ๊ธˆ์”ฉ ์ œ๊ฐ€ ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„ ๋ถ€ํ„ฐ ์˜ฌ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ƒ๋žต๋œ ๋‚ด์šฉ๊ณผ ์ฝ”๋“œ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์ž์„ธํ•˜๊ณ  ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ ๊ฐ ๊ธ€์˜ ์›๋ฌธ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.
  • ๊ทธ์ € ๊ฐœ๋ฐœ์„ ๋” ์ž˜ํ•˜๋ ค๊ณ  ์‹ถ์–ด ๊ณต๋ถ€ํ•˜๋‹ค ์˜ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ ๋งŽ์ด ๋ถ€์กฑํ•˜๊ณ  ์˜ค์—ญ์ด ์žˆ์–ด๋„ ๋Œ์€ ๋˜์ง€์ง€ ๋ง์•„์ฃผ์„ธ์š”.

iOS ์•ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€์ด๋“œ ๋ฒˆ์—ญ๋ฌธ

iOS Programming Guide ์›๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Contents

๋ฌธ์„œ์˜ ๋ชฉ์  ๋ฐ ์šฉ๋„ ์„ค๋ช…

์•ฑ ๊ธฐ๋ณธ ๊ตฌ๋™ ๋ฐ ๋ฐฐํฌ์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค, ์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ, ์•ฑ ์ง€์—ญํ™”(ํ˜„์ง€ํ™”)์— ๊ด€ํ•œ ๋‚ด์šฉ

  • Providing the Required Resources
  • Supporting User Privacy
  • Internationalizing Your App

iOS ์•ฑ ๊ธฐ๋ณธ ์ž‘๋™ ๊ตฌ์กฐ ๋ฐ ์•ฑ ์ƒ๋ช… ์ฃผ๊ธฐ, ๊ฐ ์ฃผ๊ธฐ์—์„œ ์‹œํ–‰ํ•˜๋Š” ์ž‘์—…๋‚ด์šฉ๊ณผ ์ž‘์—…์‹œ์ ์— ๊ด€ํ•œ ๋‚ด์šฉ

  • The Main Function
  • The Structure of an App
  • The Main Run Loop
  • Execution States for Apps
  • App Termination
  • Threads and Concurrency

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ๋กœ ์ „ํ™˜๋ ๋•Œ ์ž‘์—… ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์—์„œ ๋˜๋Œ์•„์˜ค๊ธฐ ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ

  • Executing Finite-Length Tasks
  • Downloading Content in the Background
  • Implementing Long-Runnig Tasks
  • Getting the User's Attention While in the Background
  • Understanding When Your App Gets Launched into the Background
  • Being a Responsible Background App
  • Opting Out of Background Execution

์‹คํ–‰, ๊ตฌ๋™, ๋ฐฑ๊ทธ๋ผ์šด๋“œ, ์ข…๋ฃŒ, ์ผ์‹œ ์ •์ง€ ๋“ฑ๊ณผ ๊ฐ™์€ ์•ฑ์˜ ์‹คํ–‰ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์—ญํ• ๊ณผ ๊ด€๋ จ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ๋ฒ•์— ๊ด€ํ•œ ๋‚ด์šฉ

  • What to Do at Launch Time
  • What to Do When Your App Is Interrupted Temporally
  • What to Do When Your App Enters the Background

๊ฐœ์ธ์ •๋ณด ํ™œ์šฉ, ๋“ฑ๊ธ‰์ œํ•œ, ์—ฌ๋Ÿฌ iOS ๋ฒ„์ „์— ๋Œ€์‘ํ•˜๊ธฐ, ์•ฑ ์ƒํƒœ ๋ณด์กด/๋ณต์›, VoIP ํ™œ์šฉ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์†Œ๊ฐœ ๋ฐ ์‚ฌ์šฉ๋ฒ•์— ๊ด€ํ•œ ๋‚ด์šฉ

  • Privacy Strategies
  • Respecting Restrictions
  • Supporting Multiple Versions of iOS
  • Preserving Your App's Visual Appearance Across Launches
  • Tips for Developing a VoIP App

iOS์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์•ฑ๊ฐ„์˜ ํ†ต์‹  ๋ฐฉ๋ฒ•(AirDrop, URLs)์— ๋Œ€ํ•œ ์†Œ๊ฐœ์™€ ๋ฐ์ดํ„ฐ ์†ก/์ˆ˜์‹  ๋ฐฉ๋ฒ•

  • Supporting AirDrop
  • Using URL Schemes to Communicate with Apps

์ „๋ ฅ ์†Œ๋ชจ์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋“ฑ ์•ฑ์„ ์‹ค์ œ๋กœ ๊ตฌ๋™ํ•  ๋•Œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผํ•  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‚ด์šฉ

  • Reduce Your App's Power Consumption
  • Use Memory Efficiently
  • Tune Your Networking Code
  • Improve Your Networking Code
  • Improve Your File Management
  • Make App Backups More Efficient
  • Move Word off the Main Thread

์ •์ƒ์ ์ธ ์•ฑ ๊ตฌ๋™์„ ์œ„ํ•œ iOS ์ฝ”์–ด ์‹œ์Šคํ…œ ๋ฐ ์•ฑ ์„ค๊ณ„์— ๊ด€ํ•œ ๋ฌธ์„œ

  • ๋ณธ ๋ฌธ์„œ๋Š” iOS ์•ฑ์„ ์ฒ˜์Œ ์ œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜์—ฌ ๋‹ค๋“ฌ๊ณ  ํ–ฅ์ƒ์‹œํ‚ค๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ iOS ๊ฐœ๋ฐœ์ด ์ฒ˜์Œ์ด๋ผ๋ฉด Start Developing iOS Apps_Swift๋ฅผ ๋จผ์ € ์ฝ์–ด๋ณด์„ธ์š”.
  • iOS ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์‹ฌ๋„์žˆ๊ฒŒ ์•Œ์•„๋ณด๋ ค๋ฉด About the iOS Technologies๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Xcode๋ฅผ ์ด์šฉํ•ด ์ œ์ž‘๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ๋Š” ์ฆ‰๊ฐ ์žฅ๋น„์—์„œ ๊ตฌ๋™ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๊ณ  App Store์— ๋“ฑ๋ก๋  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์•ฑ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์€ ์‚ฌ์šฉ ๊ฒฝํ—˜(UX)์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋А ์ •๋„์˜ ์‹œ์Šคํ…œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ์•ฑ ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๊ณ ๋ คํ•ด์•ผํ•  ์•ฑ์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ ๋ฐ ๊ตฌ๋™์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

Providing the Requred Resources

๋ชจ๋“  ์–ดํ”Œ์€ ์•„๋ž˜์˜ ๋ฆฌ์†Œ์Šค ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ์ •๋ณด ์†์„ฑ ๋ชฉ๋ก ํŒŒ์ผ(Info.plist)
  • ์•ฑ ์‹คํ–‰ ํ•˜๋“œ์›จ์–ด ์‚ฌ์–‘
  • ํ•œ๊ฐœ ์ด์ƒ์˜ ์•ฑ ์•„์ด์ฝ˜
  • ํ•œ๊ฐœ ์ด์ƒ์˜ ์•ฑ ๋Ÿฐ์นญ ์ด๋ฏธ์ง€

The App Bundle

iOS ์•ฑ์„ ์ƒ์„ฑํ•˜๊ฒŒ๋˜๋ฉด Xcode๋Š” ์•ฑ์„ bundle๋กœ ๋ฌถ๋Š”๋ฐ, bundle์€ ์•ฑ๊ณผ ๊ด€๋ จ๋œ ์ž์›์„ ๊ทธ๋ฃนํ™”ํ•ด๋†“์€ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. bundle์—๋Š” ์•ฑ ์‹คํ–‰ ํŒŒ์ผ, ์•ฑ ์•„์ด์ฝ˜, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋ฐ ํ˜„์ง€ํ™”(localize)๋œ ์ฝ˜ํ…์ธ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ณด ์†์„ฑ ๋ชฉ๋ก ํŒŒ์ผ(Info.plist) : Info.plist ํŒŒ์ผ์€ ์•ฑ ๊ตฌ์„ฑ์— ๊ด€ํ•œ ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ๊ตฌ์กฐํ™”๋œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. App Store ๋ฐ iOS์—์„œ ์•ฑ์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ชจ๋“  ์•ฑ์ด Info.plist. ํŒŒ์ผ์„ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” Info.plist ํŒŒ์ผ์—๋Š” ํ•„์ˆ˜ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ์„ค์ •๋˜์–ด์žˆ์œผ๋ฉฐ, ํŠน์ • ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํ•ญ๋ชฉ ์ถ”๊ฐ€/๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • Wi-Fi ์—ฐ๊ฒฐ, custom URL ์Šคํ‚ค๋งˆ ์ง€์›, ์‚ฌ์ง„ ์•จ๋ฒ” ์ ‘๊ทผ๋“ฑ์„ ์œ„ํ•ด์„œ๋Š” Info.plist์— ์ ์ ˆํ•œ ํ‚ค๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.
    • Info.plist์˜ ๋‹ค์–‘ํ•œ ํ‚ค์™€ ๊ฐ’์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด About Info.plist Keys and Valuse๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ์•ฑ ์•„์ด์ฝ˜ : ๋ชจ๋“  ์•ฑ์€ ๊ธฐ๊ธฐ์˜ ํ™ˆ ํ™”๋ฉด๊ณผ App Store์— ํ‘œ์‹œํ•  ์•„์ด์ฝ˜์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์•ฑ ์•„์ด์ฝ˜์€ Image Assets์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • ์•„์ด์ฝ˜์˜ ํฌ๊ธฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์•„์ด์ฝ˜์„ ๋””์ž์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ iOS Human Interface Guidelines์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ๋Ÿฐ์นญ ์ด๋ฏธ์ง€ : ๋Ÿฐ์นญ ์ด๋ฏธ์ง€๋Š” ์•ฑ์„ ์ฒ˜์Œ ๊ตฌ๋™ํ• ๋•Œ ํ™”๋ฉด์— ์ž ๊น ๋ณด์ด๋Š” ์ด๋ฏธ์ง€๋กœ, ์•ฑ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋Ÿฐ์นญ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    • ์•ฑ์ด foregrounde์—์„œ background๋กœ ๋“ค์–ด๊ฐˆ๋•Œ๋Š” ์‚ฌ์šฉ์ค‘์ธ ์•ฑ์˜ ์Šค๋ƒ… ์ƒท์ด ์ƒ์„ฑ๋˜๊ณ , ๋‹ค์‹œ foreground๋กœ ๋˜๋Œ์•„ ์˜ฌ๋Œ€๋Š” ๋Ÿฐ์นญ ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹Œ ์Šค๋ƒ… ์ƒท์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋„๋ก ์•ฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์Šค๋ƒ… ์ƒท์„ ์‚ญ์ œํ•˜๊ณ  ๊ธฐ์กด์˜ ๋Ÿฐ์นญ ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ๋Ÿฐ์นญ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ ๋ฐ ๋””์ž์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” iOS Human Interface Guidelines์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Supporting User Privacy

์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์•ฑ ์„ค๊ณ„๋Š” ๋Œ€๋‹จํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ iOS ์žฅ๋น„์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋ฒ•๋ฅ ์— ์ค€์ˆ˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋™์˜๋ฅผ ์–ป์€ ํ›„์— ์ ‘๊ทผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

* ์ค‘์š”์‚ฌํ•ญ : ์•ฑ์—์„œ ๋ณดํ˜ธ๋œ ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—‘์„ธ์Šค ๊ถŒํ•œ์„ ์š”์ฒญํ•˜๋Š” ๋ฉ”์‹œ์ง€(alert)๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. iOS 10 ๋ถ€ํ„ฐ๋Š” Info.plist์— ๊ฐ๊ฐ์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜๋ ค๋Š” ๋ชฉ์  ๋ฌธ๊ตฌ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์•ก์„ธ์Šค ๊ถŒํ•œ ์š”์ฒญ ๋ฉ”์‹œ์ง€(alert)์— ๋ณด์ด๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


Internationalizing Your App

iOS ์•ฑ์€ ๋งŽ์€ ๊ตญ๊ฐ€์— ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์—ญํ™”ํ•˜๋ฉด ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋ฅผ ํ˜„์ง€ํ™”ํ•˜๋Š” ๊ณผ์ •์€ ๊ฐ„๋‹จํ•œ ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

  • ์ง€์—ญํ™” ๊ณผ์ •์„ ์‹œ์ž‘ํ•˜๋ฉด Xcode์—์„œ ์•ฑ์„ ํ˜„์ง€ํ™” ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์–ธ์–ด ๋ณ„ ํ”„๋กœ์ ํŠธ(.lproj) ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ, iOS ์•ฑ์—์„œ๋Š” ๋‹ค์Œ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์˜ ํ˜„์ง€ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์Šคํ† ๋ฆฌ ๋ณด๋“œ ํŒŒ์ผ, ๋Ÿฐ์นญ ์ด๋ฏธ์ง€ ํŒŒ์ผ: ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ
    • ์˜ค๋””์˜ค ํŒŒ์ผ: ์Œ์„ฑ ํ•ด์„ค์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ
    • ์–ธ์–ด ๋ณ„ ๋˜๋Š” ๋ฌธํ™”๋ณ„ ์ปจํ…์ธ ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ ๋ฏธ๋””์–ด ํŒŒ์ผ์˜ ์ง€์—ญํ™”๋Š” ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ฑ์€ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์™€ ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ„์˜ ์ •๊ตํ•œ ์ƒํ˜ธ์ž‘์šฉ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ๋ชจ๋“  ์•ฑ์˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ์— ์–ด์šธ๋ฆฌ๋Š” ๋ชจ์–‘๊ณผ ๋А๋‚Œ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘˜์˜ ํšจ๊ณผ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด iOS ์ž‘๋™์›๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

The Main Function

๋ชจ๋“  C ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, iOS ์•ฑ์˜ ์ง„์ž…์  ์—ญ์‹œ main ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. iOS์—์„œ์˜ ๋‹ค๋ฅธ ์ ์€ main ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. Xcode๊ฐ€ ๊ธฐ๋ณธ main ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋ฉฐ, ์ œ๊ณต๋œ main ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

  • main ํ•จ์ˆ˜๋Š” UIKit ํ”„๋ ˆ์ž„์›Œํฌ์— ์ œ์–ด๊ถŒํ•œ์„ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. UIApplicationMain ํ•จ์ˆ˜๋Š” ์•ฑ์˜ ํ•ต์‹ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์Šคํ† ๋ฆฌ ๋ณด๋“œ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ UI๋ฅผ ๋กœ๋“œํ•˜๊ณ , ์ดˆ๊ธฐ ์„ค์ •์„ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์•ฑ์˜ ์‹คํ–‰ ๋ฃจํ”„๋ฅผ ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ ์Šคํ† ๋ฆฌ ๋ณด๋“œํŒŒ์ผ๊ณผ ์‚ฌ์šฉ์ž ์ง€์ • ์ดˆ๊ธฐํ™” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

The Structure of an App

์•ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ UIApplicationMain ํ•จ์ˆ˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๊ณ , ์•ฑ ์‹คํ–‰์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. UIApplication ๊ฐ์ฒด๋Š” ๋ชจ๋“  iOS ์•ฑ์˜ ํ•ต์‹ฌ์œผ๋กœ, ์‹œ์Šคํ…œ๊ณผ ์•ฑ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • iOS ์•ฑ์€ Model View Controller ์•„ํ‚คํ…์ฒ˜(MVC ํŒจํ„ด)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. MVC ํŒจํ„ด์€ ์•ฑ์˜ ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„(ํ˜น์€ ๋น„์ง€๋‹ˆ์ฆˆ ๋กœ์ง)๊ณผ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจํ„ด์€ ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ์žฅ์น˜์—์„œ ์•ฑ์„ ๊ตฌ๋™ํ•˜๋Š”๋ฐ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


The Main Run Loop

์•ฑ์˜ main run loop๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. UIApplication ๊ฐ์ฒด๋Š” ์‹คํ–‰์‹œ main run loop๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  UI ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, main run loop๋Š” ์•ฑ์˜ main thread์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ๋น„์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ๋ฐœ์ƒ๋œ ์ด๋ฒคํŠธ๋Š” UIKit์— ์˜ํ•ด ์„ค์ •๋œ ํŠน์ • ํฌํŠธ๋ฅผ ํ†ตํ•ด ์•ฑ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋“ค์€ ๋‚ด๋ถ€ queue์—์„œ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ main run loop์— ํ•˜๋‚˜์”ฉ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์ด๋ฒคํŠธ๋ฅผ iOS ์•ฑ์— ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ด๋ฒคํŠธ์—๋Š” ํ„ฐ์น˜, ์›๊ฒฉ ์ œ์–ด, ๋ชจ์…˜, ๊ฐ€์†๋„๊ณ„ ๋ฐ ์ž์ด๋กœ ์Šค์ฝ”ํ”„ ์ด๋ฒคํŠธ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๊ฐ€. ๊ฐ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Event Handling Guid for UIKit Apps์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Execution States for Apps

iOS ์•ฑ์€ ์–ธ์ œ๋‚˜ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ์ƒํƒœ๊ฐ’์„ ์ง€๋‹ˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

* Not running : ์•ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ˜น์€ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ข…๋ฃŒ๋œ ์ƒํƒœ
* Inactive : ์•ฑ์ด foreground์—์„œ ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ, ์ผ์‹œ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ
* Active : ์•ฑ์ด foreground์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉฐ, ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
* Background : ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ
* Suspended : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์•ฑ์ด ๋”์ด์ƒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์ •์ง€๋œ ์ƒํƒœ 

  • iOS ์‹œ์Šคํ…œ์€ ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ํ•ด๋‹น ์•ฑ์„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒํƒœ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ™ˆ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์ „ํ™”๊ฐ€ ๊ฑธ๋ ค์˜ค๋ฉด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์•ฑ์ด ๋น„ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ƒํƒœ ์ „ํ™˜์—๋Š” appDelegate ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ณ€ํ™”์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • application:willFinishLaunchingWithOptions: ์•ฑ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • application:didFinishLaunchingWithOptions: ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฑ์˜ ํ™”๋ฉด์ด ๋ณด์—ฌ์ง€๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • applicationDidBecomeActive: ์•ฑ์ด foreground๋กœ ์ „ํ™˜๋˜๋Š” ์‹œ์ ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
    • applicationWillResignActive: ์•ฑ์ด foreground ์ƒํƒœ์—์„œ inactive ๋˜๋Š” ์‹œ์ ์ž…๋‹ˆ๋‹ค.
    • applicationDidEnterBackground: ์•ฑ์ด background์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์–ธ์ œ๋“ ์ง€ ์ •์ง€๋ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
    • applicationWillEnterForeground: ์•ฑ์ด background์—์„œ foreground๋กœ ์ง„์ž…ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์•„์ง active ๋œ ์ƒํƒœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
    • applicationWillTerminate: ์•ฑ์ด ์ข…๋ฃŒ๋˜๊ณ  ์žˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฉ”์†Œ๋“œ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฑ์ด ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ •์ง€๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

App Termination

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

  • ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ •์ง€๋œ ์•ฑ์€ ์ข…๋ฃŒ ๋ ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ์•Š์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ ์—ญ์‹œ ์•ฑ ์ข…๋ฃŒ๊ฐ€ ์•ฑ์— ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Threads and Concurrency

์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์˜ main thread๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€ thread๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOS ์•ฑ์˜ ๊ฒฝ์šฐ, ์ง์ ‘ thread๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  Grand Central Dispatch(GCD), operation objects, asynchronous ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • GCD๋ฅผ ์ด์šฉํ•˜๋ฉด ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ž‘์—…๊ณผ, ์ž‘์—…์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹œ์Šคํ…œ์ด CPU์—์„œ ์ž‘์—…์„ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ • ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Thread์™€ concurrency(๋™์‹œ์„ฑ)๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
    • View, Core Animation ๊ทธ๋ฆฌ๊ณ  UIKit ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ์ž‘์—…์€ main thread์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜, ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” GCD๋ฅผ ์ด์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • GCD ๋ฐ operation object๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—… ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” Concurrency Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

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

  • foreground์—์„œ ์งง์€ ์ž‘์—…์„ ํ•˜๋Š” ์•ฑ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋ ๋•Œ ํ•ด๋‹น ์ž‘์—…์„ ์™„๋ฃŒํ•  ์‹œ๊ฐ„์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • foreground์—์„œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์•ฑ์€ ๋‹ค์šด๋กœ๋“œ ๊ด€๋ฆฌ๋ฅผ ์‹œ์Šคํ…œ์— ์ „ํ•  ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŠน์ • ์œ ํ˜•์˜ ์ž‘์—…์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์•ฑ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ๋ชจ๋“œ์— ๋Œ€ํ•œ ์ง€์›์„ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Executing Finite-Length Tasks

๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•œ ์•ฑ์ด ์ž‘์—… ์ค‘์ธ ์ผ์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, UIApplication ๊ฐ์ฒด์˜ beginBackgroundTaskWithName : expirationHandler : ๋˜๋Š” beginBackgroundTaskWithExpirationHandler : ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ๊นŒ์ง€์˜ ์ถ”๊ฐ€ ์‹œ๊ฐ„์„ ์š”์ฒญ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์•ฑ์€ ์ผ์‹œ์ ์œผ๋กœ ์ค‘์ง€๊ฐ€ ์ง€์—ฐ๋˜๊ณ , ์ž‘์—…์„ ๋งˆ์ € ์‹คํ–‰ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋๋‚œ ์•ฑ์€ endBackgroundTask:๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์Šคํ…œ์— ์ž‘์—…์„ ๋งˆ์ณค์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

  • expirationHandler : ์— ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๋‚จ์€ ์‹œ๊ฐ„์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด UIApplication์˜ backgroundTimeRemaining ๊ฐ’์„ ํ™•์ธํ•˜์„ธ์š”.

Downloading Content in the Background

ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•  ๋•Œ๋Š” NSURLSession (URLSession)๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ๋‹ค์šด๋กœ๋“œ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ์•ฑ์ด ์ค‘์ง€ ๋˜๊ฑฐ๋‚˜, ์ข…๋ฃŒ ๋  ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์—์„œ ๋‹ค์šด๋กœ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” NSURLSessionConfiguration ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ž‘์—…์ด ์‹œ์ž‘๋˜๋ฉด ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์—…๋กœ๋“œ ๋˜๋Š” ๋‹ค์šด๋กœ๋“œ ์ž‘์—…์„ ์‹œ์Šคํ…œ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์•ฑ์ด ์‹คํ–‰์ค‘์ผ๋•Œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์„ธ์…˜ ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ delegate์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์‹œ์Šคํ…œ์ด ์•ฑ์„ ์ข…๋ฃŒํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์„ ๊ณ„์† ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๋ฉด ๋ณด๋ฅ˜์ค‘์ธ ์ž‘์—…์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

Implemneting Long-Runnig Tasks

๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ์ž‘์—…์˜ ๊ฒฝ์šฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ๋  ์ˆ˜์žˆ๋„๋ก ํŠน์ • ๊ถŒํ•œ์„ ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ๊ธฐ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š”. Project Setting - Capabilities - Background Modes ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผํ•˜๋ฉฐ, ์ด๋ ‡๊ฒŒํ•˜๋ฉด Info.plist ํŒŒ์ผ์— UIBackgroundMode ํ‚ค๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. iOS์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ • ์œ ํ˜•์˜ ๊ธฐ๋Šฅ๋งŒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* ์Œ์•… ํ”Œ๋ ˆ์ด์–ด ์•ฑ๊ณผ ๊ฐ™์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ ๋ฅผ ์žฌ์ƒํ•˜๋Š” ์•ฑ
* ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜ค๋””์˜ค ์ฝ˜ํ…์ธ ๋ฅผ ๋…น์Œํ•˜๋Š” ์•ฑ
* ๋‚ด๋น„๊ฒŒ์ด์…˜ ์•ฑ๊ณผ ๊ฐ™์ด ํ•ญ์ƒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์•ฑ
* VoIP (Voice over Internet Protocol)๋ฅผ ์ง€์›ํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ
* ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์•ฑ
* ์™ธ๋ถ€ ์•ก์„ธ์„œ๋ฆฌ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์•ฑ

Getting the User's Attention While in the Background

์•Œ๋žŒ์€ ์•ฑ์ด ์ค‘์ง€๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์„๋•Œ ์‚ฌ์šฉ์ž์˜ ์‹œ์„ ์„ ๋Œ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์•Œ๋ฆผ์˜ ์‚ฌ์šด๋“œ, ๋ฐฐ์ง€, ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์•ฑ์„ foreground๋กœ ๋˜๋Œ๋ ค ๋†“์„์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ด๋ฏธ foreground์—์„œ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ, ๋กœ์ปฌ ์•Œ๋ฆผ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋กœ์ปฌ ์•Œ๋ฆผ์„ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด UILocalNotification ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ UIApplication ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ผ์ •์„ ์˜ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์•Œ๋ฆผ์€ ์•Œ๋ฆผ์˜ ์œ ํ˜•(์†Œ๋ฆฌ, ์•Œ๋ฆผ, ๋ฐฐ์ง€) ๋ฐ ์•Œ๋ฆผ ์‹œ๊ฐ์— ๋Œ€ํ•œ ์…‹ํŒ…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • UIApplication ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์•ฝ๋œ ์•Œ๋ฆผ์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์•Œ๋ฆผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Local and Remote Notification Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Understanding When Your App Gets Launched into the Background

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ์ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์•ฑ์„ ์žฌ์‹คํ–‰ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๊ฐ•์ œ๋กœ ์•ฑ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ด์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์ž„์˜๋กœ ์•ฑ์„ ์žฌ์‹คํ–‰ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

* ์œ„์น˜ ์•ฑ : ์•ฑ์— ์ง€์ •๋œ ํŠน์ • ์ง€์—ญ์— ๋“ค์–ด์™”์Œ์„ ์ธ์ง€ํ–ˆ์„๋•Œ
* ์˜ค๋””์˜ค ์•ฑ : ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด(์˜ค๋””์˜ค ์žฌ์ƒ ํ˜น์€ ๋งˆ์ดํฌ ์‚ฌ์šฉ)
* ๋ธ”๋ฃจํˆฌ์Šค ์•ฑ : ์—ฐ๊ฒฐ๋œ ์ฃผ๋ณ€ ๊ธฐ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜, ์ค‘์•™์œผ๋กœ๋ถ€ํ„ฐ ๋ช…๋ น์„ ๋ฐ›์„ ๋•Œ
* ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ ์•ฑ : ๋‹ค์šด๋กœ๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ–ˆ๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ•์ œ๋กœ ์•ฑ์„ ์ข…๋ฃŒํ•œ ๊ฒฝ์šฐ์—๋Š” ์‹œ์Šคํ…œ์ด ์•ฑ์„ ์žฌ์‹คํ–‰ ํ•˜์ง€ ์•Š์ง€๋งŒ, iOS8 ์ด์ƒ์˜ ์žฅ๋น„์—์„œ ์œ„์น˜์•ฑ์€ ์žฌ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์ผ ๊ธฐ๊ธฐ๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ(์ง€๋ฌธ)์œผ๋กœ ๋ณดํ˜ธ์ค‘์ด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋จผ์ € ๊ธฐ๊ธฐ๋ฅผ ์ž ๊ธˆํ•ด์ œ ํ•ด์•ผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์—์„œ ์•ฑ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Being a Responsible Background App

Foreground ์ƒํƒœ์˜ ์•ฑ์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๋ฐ ํ•˜๋“œ์›จ์–ด ์‚ฌ์šฉ๊ณผ ๊ด€๋ จํ•ด ํ•ญ์ƒ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์˜ ์•ฑ๋ณด๋‹ค ์šฐ์„ ์‹œ ๋ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์•ฑ์€ ์ด๋Ÿฌํ•œ ๋ถˆ๊ท ๋“ฑ์„ ๋Œ€๋น„ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋  ๋™์ž‘์„ ์ค€๋น„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๋Š” ์•ฑ์€ ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ์—์„œ OpenGL ES๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ EAGLContext๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ OpenGL ES ๋“œ๋กœ์ž‰ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ์•ฑ์€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ OpenGL ES๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” OpenGL Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ์•ฑ์ด ์ •์ง€ ๋˜๊ธฐ ์ „์— Bonjour ๊ด€๋ จ ์„œ๋น„์Šค๋ฅผ ์ทจ์†Œํ•˜์‹ญ์‹œ์˜ค. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•ด ์ •์ง€๋˜๊ธฐ ์ „์— Bonjour๋ฅผ ์ทจ์†Œํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ์ˆ˜์‹  ๋Œ€๊ธฐ ์†Œ์ผ“์„ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Bounjour ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ์ทจ์†Œํ•˜์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์ด ์„œ๋น„์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ์†Œ์ผ“์˜ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜์‹ญ์‹œ์˜ค. ์‹œ์Šคํ…œ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด๋ฅ˜๋กœ ์•ฑ์ด ์ •์ง€๋œ ๋™์•ˆ ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ ํ˜ธ ์†์‹ค์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ „ํ™˜ ์˜ค๋ฅ˜์— ๋Œ€๋น„๋˜์–ด์žˆ์–ด์•ผ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์•ฑ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ์ •์ง€๋œ ์•ฑ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์•ฑ์— ์•Œ๋ฆผ์ด ์ œ๊ณต๋˜์ง€ ์•Š์ด ๋•Œ๋ฌธ์— ์ƒํƒœ๋ณด์กด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•ด ์•ฑ์˜ UI ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Preserving Your Appโ€™s Visual Appearance Across Launches์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜์„ธ์š”. ์•ฑ์—์„œ ์šฉ๋Ÿ‰์ด ํฐ ๊ฐ์ฒด(์ด๋ฏธ์ง€)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์บ์‹œ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ •์ง€๋˜๊ธฐ ์ „์— ๊ณต์œ  ์‹œ์Šคํ…œ ์ž์› ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜์‹ญ์‹œ์˜ค. ์ฃผ์†Œ๋ก, ์บ˜๋ฆฐ๋”, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ ๊ฐ™์ด ๊ณต์œ  ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์•ฑ์€ ์ •์ง€๋˜๊ธฐ ์ „์— ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • View ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์•ฑ์ด ๋ฐฐ๊ฒฝ์— ์žˆ์„๋•Œ๋Š” View๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ์•ก์„ธ์„œ๋ฆฌ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์•Œ๋ฆผ ๋ฐ ์—ฐ๊ฒฐ ํ•ด์ œ ์•Œ๋ฆผ์— ์‘๋‹ตํ•˜์„ธ์š”.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•  ๋•Œ ํ™œ์„ฑํ™”๋œ ๊ฒฝ๊ณ  ์ฐฝ์„ ์ •๋ฆฌํ•˜์„ธ์š”. ์•ฑ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜ํ• ๋•Œ ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ UIActionSheet ๋˜๋Š” UIAlertView๋ฅผ ๋‹ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•œ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— View์—์„œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์•ฑ ํ™”๋ฉด์„ ์Šค๋ƒ… ์ƒท์œผ๋กœ ์ฐ์€ ๋‹ค์Œ, ๋‹ค์‹œ foreground๋กœ ์ „ํ™˜ ํ• ๋•Œ ๊ฐ„๋‹จํžˆ ํ‘œ์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. applicationDidEngetBackground: ๋ฉ”์„œ๋“œ์—์„œ ๋Œ์•„์˜ค๊ธฐ ์ „์— ๋น„๋ฐ€ ๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์ •๋ณด๋Š” ์ˆจ๊ธฐ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์ตœ์†Œํ•œ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

Opting Out of Backgound Execution

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ฑ์ด ์ „ํ˜€ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒํ•˜๋ ค๋ฉด Info.plist ํŒŒ์ผ์˜ UIApplicationExitsOnSuspend ํ‚ค์˜ ๊ฐ’์„ true๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•ด์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ์„ ํƒ ํ•ด์ œ๋˜๋ฉด ์•ฑ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ not-running, inactive, active ์ƒํƒœ๋ฅผ ์ˆœํ™˜ํ•˜๋ฉฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ผ ์ •์ง€ ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ™ˆ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋ฉด appDelegate์˜ applicationWillTermintae: ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋˜๊ณ  ์•ฑ์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ์•ฝ 5์ดˆ๊ฐ„ ์ •๋ฆฌ๋˜๊ณ  not-running ์ƒํƒœ๋กœ ์ด๋™ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰์„ ์„ ํƒํ•ด์ œ ํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํŠน์ • ์กฐ๊ฑด์—์„œ๋Š” ๊ธฐ๋ณธ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณต์žก์„ฑ์„ ๋Œ€๋‹จํžˆ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒฝ์šฐ ์•ฑ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฑ์ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜๊ณ , ์‰ฝ๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด ์•ฑ์„ ๋น ๋ฅด๊ฒŒ ์ข…๋ฃŒํ•˜์—ฌ ๋‹ค๋ฅธ ์•ฑ์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ฑ์˜ ์‹คํ–‰ ์ƒํƒœ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์€ ์–ด๋А์ •๋„์˜ ๊ธฐ๋Œ€์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒํƒœ ์ „ํ™˜์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์Šคํ…œ์ด app delegate์—๊ฒŒ ์•Œ๋ฆผ์„ ์ค๋‹ˆ๋‹ค. UIApplicationDelegate ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด ์•ฑ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ๊ฐ ์ƒํ™”์— ๋งž๋Š” ์ ์ ˆํ•œ ๋Œ€์‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด foreground์—์„œ background๋กœ ์ „ํ™˜ํ• ๋•Œ ์ €์žฅ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ง„ํ–‰์ค‘์ธ ์ž‘์—…์„ ์ค‘์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” ์ƒํƒœ์ „ํ™˜์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•œ ํŒ๊ณผ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

What to Do at Launch Time

์•ฑ์ด ์‹œ์ž‘๋˜๋ฉด(launched) app delegate์˜ application:willFinishLaunchingWithOptions: ์™€application:didFinishLaunchingWithOptions: ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 * ์•ฑ์ด ์‹œ์ž‘๋œ ์ด์œ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ์ ์ ˆํ•˜๊ฒŒ ๋Œ€์‘ํ•˜์‹ญ์‹œ์˜ค.
 * ์•ฑ์˜ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜์‹ญ์‹œ์˜ค.
 * ์•ฑ์œผ๋กœ ๋ณด์—ฌ์ค„ Window ๋ฐ view๋ฅผ ์ค€๋น„ํ•˜์‹ญ์‹œ์˜ค. 
  • ์•ฑ์ด ์‹œ์ž‘ ๋ ๋•Œ ์‹œ์Šคํ…œ์€ ์ž๋™์œผ๋กœ main stroyboard์™€ initial view controller๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • state restoration(์ƒํƒœ๋ณต์›)์„ ์ง€์›ํ•˜๋Š” ์•ฑ์˜ ๊ฒฝ์šฐ willFinishLaunchingWithOptions : application : didFinishLaunchingWithOptions : ๋‘๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์ด์ „ ์ƒํƒœ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„ ๋‘๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์€ ๊ฐ€๋Šฅํ•œ ๊ฐ€๋ฒผ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์€ ์ดˆ๊ธฐํ™” ์ž‘์—…์€ 5์ดˆ ์ด๋‚ด์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์‹œ์Šคํ…œ์ด ์‘๋‹ต์—†์Œ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์•ฑ์„ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋Š” ์ž‘์—…(๋„คํŠธ์›Œํฌ ์•ก์„ธ์Šค)์€ ๋ณด์กฐ thread์—์„œ ์‹คํ–‰ ๋˜๋„๋ก ์กฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

The Launch Cycle

  • ์•ฑ์ด foreground ์ƒํƒœ๋กœ ๋“ค์–ด์˜ฌ๋•Œ ์‹œ์Šคํ…œ์ด main thread๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์•ฑ์˜ main ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ main ํ•จ์ˆ˜๋Š” UIKit ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์–ดํ•˜๊ณ , ์•ฑ์ด ๊ตฌ๋™๋˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•ด์ค๋‹ˆ๋‹ค.
  • ์•ฑ์ด background ์ƒํƒœ๋กœ ์‹œ์ž‘ํ• ๋•Œ๋Š” foreground ์ƒํƒœ๋กœ ์‹œ์ž‘๋ ๋•Œ์™€ ์‹คํ–‰์ฃผ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ ๋’ค, ์ •์ง€(suspend) ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด ์ƒํƒœ๋กœ ์‹คํ–‰๋ ๋•Œ์—๋„ ์‹œ์Šคํ…œ์€ UI ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ํ™”๋ฉด์— ํ‘œ์‹œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•ฑ์ด ์–ด๋А ์ƒํƒœ๋กœ ์‹œ์ž‘๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด UIApplication ๊ฐ์ฒด์˜ applicationState ์†์„ฑ๊ฐ’์„ ํ™•์ธํ•ด ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Launch in Landscape Mode

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ์€, ์„ธ๋กœ ๋ชจ๋“œ๋กœ ์‹คํ–‰๋˜๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๊ธฐ ๋ฐฉํ–ฅ์— ๋งž๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ€๋กœ ๋ฐฉํ–ฅ๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‹œ์Šคํ…œ์— ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์•ฑ์ด ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • Info.plist์— UIInterfaceOrientation ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ’์„ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•˜์„ธ์š”.
    • layout์ด๋‚˜ autosizing ์˜ต์…˜์ด ์„ค์ •๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
    • shouldAutorotateToInterfaceOrientation: ๋ฉ”์†Œ๋“œ๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์„ธ์š”.(์„ธ๋กœ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ false)

Installing App-Specific Data Files at First Launch

  • ์•ฑ์˜ ๊ตฌ๋™์— ์š”๊ตฌ๋˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์„ค์ • ๊ฐ’ ์…‹ํŒ…์„ ์œ„ํ•ด ์ฒซ ์‹คํ–‰ ์ฃผ๊ธฐ(first launch cycle)๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฑ์˜ ํŠน์ • ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ Library/Application Support//directory์— ์œ„์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ ๋ฒˆ๋“ค ๋‚ด์— ์žˆ๋Š” ํŒŒ์ผ์€ code signed ๋˜์–ด์žˆ์–ด ์ˆ˜์ •์„ ํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ƒŒ๋“œ๋ฐ•์Šค์˜ ๋‹ค๋ฅธ ํด๋”๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

What to Do When Your App Is Interrupted Temporaily

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

* ๋ฐ์ดํ„ฐ ๋ฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
* ํƒ€์ด๋จธ ๋ฐ ๊ธฐํƒ€ ์ฃผ๊ธฐ์  ์ž‘์—…์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
* ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
* ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
* ๋™์˜์ƒ ์žฌ์ƒ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.(AirPlay๋ฅผ ํ†ตํ•œ ์žฌ์ƒ์€ ์ œ์™ธ)
* OpenGL ES ํ”„๋ ˆ์ž„ ์†๋„๋ฅผ ์žฌ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์ด ์ผ์‹œ ์ •์ง€ ์ƒํƒœ์—์„œ ๋ฒ—์–ด๋‚˜ ๋‹ค์‹œ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋˜๋Œ์•„ ์˜ค๋ฉด applicationWillResignActive: ๋ฉ”์†Œ๋“œ์—์„œ ํ–ˆ๋˜ ์ž‘์—…๋“ค์„ applicationDidBecomeActive: ๋ฉ”์†Œ๋“œ์—์„œ ๋˜๋Œ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ์•ฑ์— NSFileProtectionComplete ์˜ต์…˜์œผ๋กœ ๋ณดํ˜ธ๋œ ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด, ํ™”๋ฉด์ด ์ž ๊ฒจ์žˆ๋Š”๋™์•ˆ ํ•ด๋‹น ํŒŒ์ผ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก applicationWillResignActive: ๋ฉ”์†Œ๋“œ์—์„œ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋‹ซ์•„์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

What to Do When Your App Enters the Foreground

Foreground๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์ค‘์ง€๋œ ์ž‘์—…์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. applicationDidEnterBackground : ๋ฉ”์†Œ๋“œ์—์„œ ์ˆ˜ํ–‰ ๋œ ์ž‘์—…์„ applicationWillEnterForeground ๋ฉ”์†Œ๋“œ์—์„œ ์‹คํ–‰์ทจ์†Œํ•ด์•ผํ•˜๋ฉฐ applicationDidBecomeActive: ๋ฉ”์†Œ๋“œ๋Š” ์‹คํ–‰๋•Œ์™€ ๋™์ผํ•œ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • UIApplicationWillEnterForegroundNotification ์•Œ๋ฆผ์„ ์ด์šฉํ•ด ์•ฑ์ด foreground๋กœ ๋‹ค์‹œ ๋“ค์–ด์˜ค๋Š” ๋•Œ๋ฅผ ์ถ”์ธก ํ•  ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.

Be Prepared to Process Queued Notifications

  • ์ •์ง€ ์ƒํƒœ์˜ ์•ฑ์ด foreground ๋˜๋Š” background ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ๋ ๋•Œ, ๋Œ€๊ธฐ ์ค‘์ธ(queued) ์•Œ๋žŒ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ •์ง€๋˜์–ด ์žˆ๋Š” ๋™์•ˆ์—๋Š” ์•ฑ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์‹œ์Šคํ…œ์ด ๊ด€๋ จ ์•Œ๋žŒ์„ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•ด๋‘๊ณ  ์ฝ”๋“œ ์‹คํ–‰์ด ์‹œ์ž‘๋˜๋Š” ์ˆœ๊ฐ„ ์•ฑ์— ์•Œ๋žŒ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์•ฑ์— ์ „๋‹ฌ๋˜๋Š” ์•Œ๋žŒ์˜ ๋‚ด์šฉ๊ณผ ํ‚ค์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์•…์„ธ์„œ๋ฆฌ ์—ฐ๊ฒฐ ๋“ฑ๋ก / ์—ฐ๊ฒฐ ํ•ด์ œ(EAAccessoryDidConnectNotification, EAAccessoryDidDisconnectNotification)
    • ๊ธฐ๊ธฐ ํ™”๋ฉด ๋ฐฉํ–ฅ ์ „ํ™˜(UIDeviceOrientationDidChangeNotification)
    • ๋‹ค๋Ÿ‰์˜ ์‹œ๊ฐ„ ๋ณ€ํ™”(UIApplicationSignificantTimeChangeNotification)
    • ๋ฐฐํ„ฐ๋ฆฌ ์ƒํƒœ ๋ฐ ์ž”๋Ÿ‰ ๋ณ€ํ™”(UIDeviceBatteryLevelDidChangeNotification, UIDeviceVatteryStateDidChangeNotification)
    • ๊ทผ์ ‘ ์ƒํƒœ ๋ณ€ํ™”(UIDeviceProximityStateDidChangeNofitication)
    • ๋ณดํ˜ธ๋œ ํŒŒ์ผ์˜ ์ƒํƒœ ๋ณ€ํ™”(UIApplicationProtectedDataWillBecomeUnavailable, UIApplicationProtectedDataDidBecomeAvailable)
    • ์™ธ๋ถ€ ํ™”๋ฉด ์—ฐ๊ฒฐ / ์—ฐ๊ฒฐ ํ•ด์ œ(UIScreenDidConnectNotification, UIScreenDidDisconnectNotification)
    • ํ™”๋ฉด์˜ ์Šคํฌ๋ฆฐ ๋ชจ๋“œ ๋ณ€ํ™”(UIScreenModeDidChangeNotification)
    • Settings์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์•ฑ ์„ค์ •๊ฐ’์˜ ๋ณ€ํ™”(NSUserDefaultsDidChangeNotification)
    • ์‚ฌ์šฉ ์–ธ์–ด ๋ฐ ์ง€์—ญ ๋ณ€๊ฒฝ(NSCurrentLocaleDidChangeNotification)
    • ์‚ฌ์šฉ์ž iCloud ๊ณ„์ • ๋ณ€๊ฒฝ(NSUbiquityIdentityDidChangeNotification)
  • ๋Œ€๊ธฐ ์ค‘์ธ ์•Œ๋žŒ(queued notification)์€ ์‚ฌ์šฉ์ž ํ„ฐ์น˜๋‚˜ ์ž…๋ ฅ ์ „์— ์•ฑ์˜ main run loop๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

  • ์•ฑ์ด ์žฌ๊ฐœ ๋ ๋•Œ ๋ˆˆ์— ๋„๋Š” ์ง€์ฒด๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Handle iCloud Changes

  • iCloud ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์•ฑ์€ iCloud ๊ด€๋ จ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ๊ด€๋ จ๋ฌธ์„œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์—์„œ iCloud ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ด๋ฏธ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ, iCloud ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์šฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ด€๋ จ๋œ ์„ค์ •์€ ์•ฑ ํ™˜๊ฒฐ ์„ค์ •์ด๋‚˜, ์‹œ์Šคํ…œ Settings์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ • ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

Handle Locale Changes

  • ์•ฑ์ด ์ผ์‹œ ์ •์ง€๋œ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ Locale(์ง€์—ญ)์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‚ ์งœ, ์‹œ๊ฐ„ ๋ฐ ์ˆซ์ž์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Locale ๋ณ€๊ฒฝ์— ๋Œ€๋“ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๊ตญ์ œํ™”์™€ ๊ด€๋ จ๋œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Internationalization and Localization Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Handle Changes to Your App's Settings

  • Settings๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์„ค์ •๊ฐ’์ด ์žˆ๋‹ค๋ฉด NSUserDefaultsDidChangeNotification ์•Œ๋žŒ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ผ์‹œ ์ •์ง€๋˜๊ฑฐ๋‚˜, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์ผ๋•Œ ์„ค์ •์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์•Œ๋žŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์ • ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์ ์ •ํ•œ ๋ฐ˜์‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ•ด๋‹น ์•Œ๋ฆผ์— ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์€ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ํ—ˆ์ ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ ๋˜๋Š” ๊ธฐํƒ€ ๋ณด์•ˆ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์ ˆํžˆ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

What To Do When Your App Enters the Bakcground

Foreground์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ• ๋•Œ๋Š” applicationDidEnterBackground: ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

* ์•ฑ ์Šค๋ƒ…์ƒท ์ค€๋น„
* ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด 
  • applicationDidEnterBackground: ๋ฉ”์†Œ๋“œ๋Š” ์•ฝ 5์ดˆ ๋™์•ˆ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ž‘์—… ์ˆ˜ํ–‰ ์ด๋‚ด์— ๋ฉ”์†Œ๋“œ๊ฐ€ return ๋˜์ง€ ์•Š์œผ๋ฉด ์•ฑ์— ์ข…๋ฃŒ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—… ์ˆ˜ํ–‰์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ beginBackorundTaskWithExpirationHandler: ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์š”์ฒญํ•œ ๋‹ค์Œ, ๋ณด์กฐ ์Šค๋ ˆ๋“œ์—์„œ ์žฅ์‹œ๊ฐ„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด applicationDidEnterBackground: ๋ฉ”์†Œ๋“œ๋Š” 5์ดˆ ์ด๋‚ด์— ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

The Background Transition Cycle

  • ์‚ฌ์šฉ์ž๊ฐ€ ํ™ˆ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜, Sleep/Wake ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์‹œ์Šคํ…œ์— ๋‹ค๋ฅธ ์•ฑ์„ ์‹คํ–‰ ์‹œํ‚ฌ๋•Œ foreground์— ์žˆ๋˜ ์•ฑ์„ ๋น„ํ™œ์„ฑ ์ƒํƒœ(inactive state)๊ฐ€ ๋˜์—ˆ๋‹ค๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ๋กœ ์ง„์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”๋Š” applicationWillResignActive: ์™€ applicationDidEnterBackground: ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์•ฑ์€ applicationDidEnterBackground: ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋˜๊ณ , ์ž ์‹œํ›„ ์ผ์‹œ ์ค‘์ง€ ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

Prepare for the App Snapshot

  • app delegate์˜ applicationDidEnterBackground: ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ ๋˜๊ณ  ์ž ์‹œ ํ›„ ์‹œ์Šคํ…œ์€ ์•ฑ์˜ ํ™”๋ฉด์„ ์Šค๋ƒ…์ƒท์„ ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ˆ˜ํ–‰์ด ์ง„ํ–‰๋˜์–ด ํ™”๋ฉด์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด, ์‹œ์Šคํ…œ์€ ์Šค๋ƒ…์ƒท์— ๋ณ€ํ™” ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ดฌ์˜๋œ ์Šค๋ƒ…์ƒท์€ ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น UI์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์ง„์ž…ํ• ๋•Œ view์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ, snapshotViewAfterScreenUpdates: ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • snapshotViewAfterScreenUpdates: ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ true ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ•์ œ๋กœ ์Šค๋ƒ…์ƒท์„ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

Reduce Your Memory Footprint

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

๊ฐ๊ฐ์˜ ์•ฑ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ํ•„์š”์„ฑ์„ ์ง€๋‹ˆ์ง€๋งŒ, ์ผ๋ถ€ ํŠน์ง•์€ ๋‹ค์–‘ํ•œ ์•ฑ์—๋Š” ๊ณตํ†ต์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ํŠน์ • ์œ ํ˜•์˜ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์•ฑ์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Privacy Strategies

์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์€ ์•ฑ์„ ๋””์ž์ธํ• ๋•Œ ๊ณ ๋ คํ•ด์•ผํ•  ์ฃผ์š”์‚ฌํ•ญ ์ž…๋‹ˆ๋‹ค. ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•  ๊ฐœ์ธ์ •๋ณด์—๋Š” ์‚ฌ์šฉ์ž์˜ ์‹ ์› ๋ฐ ๊ฐœ์ธ ์ •๋ณด์™€ ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—ฐ๋ฝ์ฒ˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์ธ ์ •๋ณด ์ œ์–ด๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ, ์•ฑ์€ ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ์œ„ํ•ด ๊ฐœ๋ณ„ ์ ์ธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Protecting Data Using On-Disk Encryption

๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋Š” ๋‚ด์žฅ๋œ ํ•˜๋“œ์›จ์–ด์— ์•”ํ˜ธํ™” ๋œ ํ˜•์‹์œผ๋กœ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ , ํ•„์š”ํ• ๋•Œ ์•”ํ˜ธ๋ฅผ ํ•ด๋…ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ธ” ๊ธฐ๊ธฐ๊ฐ€ ์ž ๊ฒจ์žˆ๋Š” ๋™์•ˆ์—๋Š” ํ•ด๋‹น ํŒŒ์ผ์„ ๋งŒ๋“  ์•ฑ๋„ ํŒŒ์ผ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋Š” ๋Œ€๋ถ€๋ถ„์˜ iOS ๊ธฐ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ์„ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์›ํ•˜๋Š” ๋ณดํ˜ธ ์ˆ˜์ค€์„ ๋‚˜ํƒ€๋‚ด๋Š” ์†์„ฑ์„ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  • NSData ํด๋ž˜์Šค ๋˜๋Š” NSFileManagerํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณดํ˜ธ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • NSData์˜ writeToFile: options: error: ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ํŒŒ์ผ์— ๋ณดํ˜ธ ์„ค์ •์„ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • NSFileManager ์˜ setAttributes: ofItemAtPath: error: ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด ํŒŒ์ผ์˜ ๋ณดํ˜ธ ๊ฐ’์„ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฐœ์ฒด๋Š” UIApplication์˜ protectedDataAvailable ์†์„ฑ ๊ฐ’์„ ๊ฒ€์‚ฌํ•˜์—ฌ ํ˜„์žฌ ํŒŒ์ผ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ๋กญ๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Identifying Unique Users of Your App

์•ฑ์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ• ๋•Œ๋Š” ํ•ญ์ƒ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘์—…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•ด ์„œ๋ฒ„์˜ ํŠน์ • ๊ณ„์ •์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • UIDevice์˜ identifierForVendor ์†์„ฑ์„ ์ด์šฉํ•ด ์„œ๋กœ๋‹ค๋ฅธ ์žฅ์น˜ ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด‘๊ณ  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ASIdentifierManager ํด๋ž˜์„œ์˜ advertisingIdentifier ๊ฐ’์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ID๋ฅผ ํ™•๋ณด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Respecting Restrictions

์‚ฌ์šฉ์ž๋Š” ์•ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฏธ๋””์–ด์˜ ๋“ฑ๊ธ‰์„ ์ง€์ •ํ•˜์—ฌ ์ œํ•œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์•ฑ์ด ๋ฏธ๋””์–ด๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ์ œํ•œ ์„ค์ •์„ ํ™•์ธํ•˜๊ณ  ๊ทธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋งž๋Š” ์‘๋‹ต์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ์ œํ•œ ์„ค์ • ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด standardUserDefaults ๊ฐ์ฒด์˜ objectForKey๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ๊ฐ’์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • com.apple.content-rating.ExplicitBooksAllowed
    • com.apple.content-rating.ExplicitMusicPodcastsAllowed
    • com.apple.content-rating.AppRating
    • com.apple.content-rating.MovieRating
    • com.apple.content-rating.TVShowRating
  • objectForKey๊ฐ€ ์œ„ ํŠน์ • ํ‚ค์— ๋Œ€ํ•ด nil์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ด๋‹น ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์•ฑ ์ž์ฒด ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ๋“ฑ๊ธ‰์„ ๊ฒฐ์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Supporting Multiple Versions of iOS

์ตœ์‹ ๋ฒ„์ „์˜ iOS์™€ ์ด์ „ ๋ฒ„์ „์„ ํ•จ๊ป˜ ์ง€์›ํ•˜๋Š” ์•ฑ์˜ ๊ฒฝ์šฐ, ์ด์ „ ๋ฒ„์ „์˜ iOS์—์„œ ์ตœ์‹  API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์‹ค์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋Š” ํ˜„์žฌ OS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ• ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์•ฑ ์ถฉ๋Œ(crash)๋ฅผ ๋ฐฉ์ง€ํ•ด์ค๋‹ˆ๋‹ค.

  • ํ•ด๋‹น class๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด Class ๊ฐ์ฒด๊ฐ€ nil์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด instancesRespondToSelector: ๋˜๋Š” respondsToSelector:๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋Œ€์ƒ์„ ์ง€์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” SDK Compatibility Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Preserving Your App's Visual Appearance Across Launches

๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ „ํ™˜๋œ ์•ฑ์€ ํ˜„์žฌ foreground์—์„œ ๊ตฌ๋™๋˜๋Š” ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ์–ธ์ œ๋“ ์ง€ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ข…๋ฃŒ ๋ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ์•ฑ์„ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ• ๋•Œ ์•ฑ์ด ์ผ์‹œ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ์‹œ์ ์œผ๋กœ ๋˜๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋‚˜์€ UX๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” iOS์˜ infrastrucure๋ฅผ ํ™œ์šฉํ•ด ์ƒํƒœ ๋ณด์กด/๋ณต์›(state preservation, restroration)์„ ๊ตฌํ˜„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

  • UIKit์˜ ์ƒํƒœ ๋ณด์กด ์‹œ์Šคํƒฌ์€ View Controller์™€ View์˜ ์ƒํƒœ๋ฅผ ๋ณด์กด, ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์—ฐํ•œ infrastructure์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Infrastructure๋Š” ์ ์ ˆํ•œ ์‹œ์ ์— ๋ณด์กด ๋ฐ ๋ณต๊ตฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์˜ ์ƒํƒœ ๋ณด์กด์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผํ•˜๋Š” ์œ„์น˜๋Š” ๋‹ค์Œ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    • App delegate ๊ฐ์ฒด (์•ฑ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์ƒํƒœ ๊ด€๋ฆฌ)
    • View Controller ๊ฐ์ฒด (์•ฑ์˜ ์ „๋ฐ˜์ ์ธ UI ๊ด€๋ฆฌ)
    • Custom Views (๋ณด์กดํ•ด์•ผํ•  custom data๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ)

Enablikng State Preservation and Restoration in Your App

  • ์•ฑ์˜ ์ƒํƒœ ๋ณด์กด/๋ณต์›์€ ์ž๋™๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • App delegate์—์„œ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ true๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • application: shouldSaveApplicationState:
    • application: shouldRestoreApplicationState:

The Preservation and Restoration Process

์•ฑ ์ƒํƒœ ๋ณด์กด / ๋ณต์› ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฑ์—์„œ ๋ณด์กด๋˜์–ด์•ผํ•  ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•ด์ค˜์•ผ UIKit์—์„œ ์ ์ ˆํ•œ ์‹œ์ ์— ๊ฐ์ฒด๋ฅผ ๋ณด์กด / ๋ณต์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UIKit ์€ ๋ณด์กด / ๋ณต์› ํ”„๋กœ์„ธ์Šค์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋‘๋ฉด ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ํ๋ฆ„์ดํ•ด์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒํƒœ ๋ณด์กด / ๋ณต์›์„ ๊ณ ๋ คํ• ๋•Œ, ๋‘๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    • ๋ณด์กด: ์•ฑ์ด foreground์™€ background๋ฅผ ์˜ค๊ณ ๊ฐˆ๋•Œ UIKit์€ ์•ฑ์˜ ์ƒํƒœ๋ฅผ ์ ์ ˆํžˆ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณด์กด์— ํ•„์š”ํ•œ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋””์Šคํฌ ์ƒ์˜ ํŒŒ์ผ์— ์“ฐ๊ณ , ๋‹ค์Œ๋ฒˆ์— ์•ฑ์ด launch๋ ๋•Œ UIKit์ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐพ์•„ ์•ฑ ์ƒํƒœ ๋ณต์› ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์ด๋•Œ ํŒŒ์ผ์€ ์•”ํ˜ธํ™” ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๊ธฐ๊ฐ€ ์ž ๊ธˆํ•ด์ œ ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณต์›: ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋™์•ˆ UIKit์€ ๋ณด์กด ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ์žฌ๊ตฌ์„ฑ ํ•˜์ง€๋งŒ, ์‹ค์ œ ๊ฐ์ฒด ์ƒ์„ฑ์€ ์ฝ”๋“œ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. Storyboard์— ์ ‘๊ทผํ•ด ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์–ด๋А ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ์ง€, ์–ด๋А ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด UIKit์ด ๋ณด์กดํ•ด ๋†“์€ ์ž๋ฃŒ๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ๊ฐ์˜ ์ƒํƒœ์—์„œ ์•ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
    • ๋ณด์กด
      • UIKit์— ์ƒํƒœ ๋ณด์กด์„ ํ•ด์•ผํ•œ๋‹ค๊ณ  ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
      • UIKit์— ์–ด๋–ค ViewController์™€ View๊ฐ€ ๋ณด์กด ๋ ์ง€ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
      • ๋ณด์กด๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณต์›
      • UIKit์— ์ƒํƒœ ๋ณต์›์„ ํ•ด์•ผํ•œ๋‹ค๊ณ  ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
      • UIKit์—์„œ ์š”์ฒญํ•œ ๊ฐ์ฒด๋ฅผ ์ œ๊ณต(์ƒ์„ฑ) ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • ๋ณต์›ํ•  ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ณ , ์ด๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ UIKit์—๊ฒŒ ๋ณด์กด / ๋ณต์›ํ•  ๊ฐ์ฒด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์œผ๋กœ, ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ๋””์ž์ธ ํ• ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช‡๋ช‡ ViewContrller๋Š” ์•ฑ์˜ main storyboard์—์„œ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜์ง€๋งŒ push๋˜๊ฑฐ๋‚˜ present๋˜๋Š” ViewController๋“ค์€ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— restoreation idientifier๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์กดํ•˜๋ ค๋Š” view controller์— ๋Œ€ํ•ด ์ถ”ํ›„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณต์›๋ ์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. UIKit๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. App delegate๋ฅผ ์ด์šฉํ•ด ์žฌ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ view controller์— restoration class ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์‚ฌ์šฉํŒ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ main storyboard๋ฅผ ํ†ตํ•ด view controller๊ฐ€ ํ•ญ์ƒ ๋กœ๋“œ๋œ๋‹ค๋ฉด, restore class ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Œ€์‹  app delegate๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ๋ณต์›ํ•˜์‹ญ์‹œ์˜ค.
    • ๋งŒ์•ฝ main storyboard๋ฅผ ํ†ตํ•ด view controller๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, restore class๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

What Happnes When You Exclude Groups of View Controllers?

์–ด๋–ค view controller์˜ restore identifier๊ฐ€ nil์ด๋ฉด ํ•ด๋‹น view controller์™€ ์ด์˜ child view controllers์€ ๋ณด์กด ๋ฐ์ดํ„ฐ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ child view controller๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋ณด์กดํ•˜๋ ค๋ฉด childe view controller์— ๊ฐœ๋ณ„์ ์œผ๋กœ rester identifier๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค.

Checklist for Implementing State Presevtion and Restoration

์•ฑ์˜ ์ƒํƒœ ๋ณด์กด / ๋ณต์›์„ ์ง€์›ํ•˜๋ ค๋ฉด app delegate์™€ view controller๊ฐ€ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ธ์ฝ”๋”ฉ/ ๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณด์กด / ๋ณต์› ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์‹œ, ์•„๋ž˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

  • (ํ•„์ˆ˜) application:shouldSaveApplicationState:, application:shouldRestoreApplicationState:๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
  • (ํ•„์ˆ˜) ๋ณด์กดํ•˜๋ ค๋Š” ๊ฐ๊ฐ์˜ view controller์˜ restorationIdentifier์— ๋นˆ๊ฐ’์ด ์•„๋‹Œ String๊ฐ’ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.
  • (ํ•„์ˆ˜) application:willFinishLaunchingWithOptions: ์—์„œ ๋ณต์›ํ•  ์Šคํฌ๋กค ์œ„์น˜์™€ ๊ด€๋ จ UI ์„ค์ •์„ ์œ„ํ•ด window๋ฅผ ์‚ดํ”ผ์‹ญ์‹œ์˜ค.
  • ํ•„์š”ํ•˜๋‹ค๋ฉด view controller์— restoration class๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ณด์กด / ๋ณต์› ํ•˜๋ ค๋Š” view controller ํ˜น์€ view์— encodeRestorableStateWithCoder:์™€ decodeRestorableStateWithCoder:๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  • ํ…Œ์ด๋ธ” ๋ทฐ๋‚˜ ์ฝœ๋ ‰์…˜ ๋ทฐ์—์„œ data soucre์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด๋Š” UIDataSourceModelAssociation protocol์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด ํ”„๋กœํ† ์ฝœ์€ ํ•ด๋‹น ๋ทฐ์—์„œ ์„ ํƒ๋˜๊ฑฐ๋‚˜ ๋ณด์ด๋Š” ์˜์—ญ์˜ ๋ณต์›์„ ๋„์™€์ค๋‹ˆ๋‹ค.

Enabling State Preservation and Restoration in Your App

์•ฑ ์ƒํƒœ ๋ณด์กด / ๋ณต์›์„ ์ž๋™ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฏ€๋กœ app delegate์—์„œ ์•„๋ž˜ ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๊ธฐ๋Šฅ ์ง€์›์„ ๋ช…์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • application:shouldSaveApplicationState:
  • application:shouldRestoreApplicationState:

Preserving the State of Your View Controllers

View controller์˜ ์ƒํƒœ ๋ณด์กด์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์ž‘์—…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • (ํ•„์ˆ˜) restore identifier ํ• ๋‹น
  • (ํ•„์ˆ˜) ์•ฑ ์‹คํ–‰ ์‹œ์ (launch)์—์„œ ์ƒˆ๋กœ์šด view controller ๋ฅผ ์ƒ์„ฑํ•  ์ฝ”๋“œ ์ž‘์„ฑ
  • (์˜ต์…˜) ์•ฑ์„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์„๋•Œ ์žฌ์ƒ์„ฑ ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ„ํ•ด encodeRestorableStateWithCoder:์™€ decodeRestorableStateWithCoder: ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

Preserving the State of Your Views

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

  • view์˜ restoretionIdentifier๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • view๊ฐ€ ์†ํ•ด์žˆ๋Š” view controller๋„ ์œ ํšจํ•œ restorationIdentifier๊ฐ’์„ ์ง€๋…€์•ผํ•ฉ๋‹ˆ๋‹ค.
  • tableView์™€ collectionView์˜ ๊ฒฝ์šฐ UIDataSourceModelAssociation protocol์„ ์ค€์ˆ˜ํ•˜์‹ญ์‹œ์˜ค.

Preserving Your App's High-Level State

view controller์™€ view์— ๋ณด์กด ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋„, ๋‹ค์Œ ๋‘ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ์•ฑ์— ํ•„์š”ํ•œ ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • application:willEncodeRestorableStateWithCoder:
  • application:didDecodeRestorableStateWithCoder:

์œ„ ๋ฉ”์†Œ๋“œ๋Š” ๋ณด์กด ํ”„๋กœ์„ธ์Šค์˜ ๋งจ ์ฒ˜์Œ์— ํ˜ธ์ถœ ๋˜๋ฏ€๋กœ UI์˜ ํ˜„์žฌ ๋ฒ„์ „ ๋“ฑ๊ณผ ๊ฐ™์€ high-level์˜ ์•ฑ ์ƒํƒœ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tips for Saving and Restore State Information

์•ฑ ์ƒํƒœ ๋ณด์กด / ๋ณต์›์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ง€์นจ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

  • ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์•ฑ ์ƒํƒœ์™€ ํ•จ๊ป˜ ์ธ์ฝ”๋”ฉ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์กด์„ ํ• ๋•Œ์—๋Š” ์•ฑ์˜ ํ˜„์žฌ UI ๋ฒ„์ „์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „ ๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž๋ฅผ ์ธ์ฝ”๋”ฉ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ ์ •๋ณด๋Š” app delegate์˜ application:willEncodeRestorableStateWithCoder: ๋ฉ”์†Œ๋“œ์—์„œ ์ธ์ฝ”๋”ฉ ํ• ์ˆ˜ ์žˆ์œผ๋ฉฐ, application:shouldRestoreApplicationState: ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ ๋ ๋•Œ ์ธ์ฝ”๋”ฉ ๋˜์—ˆ๋˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฑ ์ƒํƒœ ์ •๋ณด์— ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์•ฑ์€ iCloud ๋˜๋Š” ๋””์Šคํฌ์˜ ๋กœ์ปฌ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณต์› ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์‹œ, ๋ณต์› ์ž‘์—…์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ณด์กด ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ฑ ์ƒํƒœ ๋ณด์กด์€ ๊ธฐ์กด์— ๋””์ž์ธ๋œ ๋ฐฉ์‹์œผ๋กœ view controller๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ view controller ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๊ธฐ์กด์— ์„ค๊ณ„๋œ ๋ฐฉ์‹์„ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. view controller๊ฐ„์˜ ๊ณ„์ธต/ํฌํ•จ ๊ด€๊ณ„์™€ ์ƒ๊ณผ์—†์ด view๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ ๋ณด์กด ์‹œ์Šคํ…œ์ด ๋ณด์กดํ•  view controller๋ฅผ ์ œ๋Œ€๋กœ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  view controller๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ฒƒ์€ ์˜๋„์— ๋งž์ง€ ์•Š์„ ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์˜ view controller๋Š” ๋ณด์กดํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ํ™”๋ฉด์€ ๋ณด์กด / ๋ณต์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ณต์› ํ”„๋กœ์„ธ์Šค ์ค‘์— view controller ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ณต์› ํ•˜๋Š” ๋™์•ˆ ์•ฑ์˜ ํด๋ž˜์Šค๊ฐ€ ๋ณด์กดํ–ˆ๋˜ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค์™€ ์ผ์น˜ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ณต์› ์ž‘์—…์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ•์ œ๋กœ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋ฉด ์‹œ์Šคํ…œ์—์„œ ์•ฑ์˜ ๋ณด์กด ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ข…๋ฃŒ๋ ๋•Œ ๋ณต์› ์ƒํƒœ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ์•ˆ์ • ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ๋ณด์กด / ๋ณต์› ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ•˜๋ ค๋ฉด ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  Xcode๋ฅผ ์ด์šฉํ•ด ์ž„์‹œ ๋ช…๋ น์ด๋‚˜ ์ œ์Šค์ฒ˜๋กœ exit๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.

Tips for Developing a VoIP App

VoIP(Voice over Internet Protocol) ์•ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๊ธฐ์˜ ์…€๋ฃฐ๋Ÿฌ ์„œ๋น„์Šค ๋Œ€์‹  ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ์ด์šฉํ•ด ์ „ํ™”๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iOS 8 ์ด์ƒ์—์„œ๋Š” APN(Apple Push Notification Serviece) ๋ฐ PushKit ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VoIP ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘ธ์‰ฌ๊ธฐ๋Šฅ์„ ๊ธฐ์šฉํ•˜๋ฉด VoIP ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ง€์†์ ์ธ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด๋‚˜ ์†Œ์ผ“ ๊ตฌ์„ฑ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. VoIP ํ‘ธ์‹œ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์•ฑ์ด ํ‘ธ์‹œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค(์•ฑ์ด ์ข…๋ฃŒ๋œ ์ƒํƒœ์—๋„).

  • VoIP ๊ตฌํ˜„์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์•ฑ์— VoIP ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Xcode project Capabilities ํƒญ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™” ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต VoIP ์•ฑ์€ ์˜ค๋””์˜ค ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— Audio ๋ฐ AirPlay ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ๋„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    • PushKit API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ VoIP ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๊ณ , ์ˆ˜์‹  ์•Œ๋žŒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.
    • ์˜ค๋””์˜ค ์„ธ์…˜์„ ๊ตฌ์„ฑํ•˜๊ณ  ํ™œ์„ฑํ™” ์‹œํ‚ค์‹ญ์‹œ์˜ค.
    • iPhone์—์„œ ๋” ๋‚˜์€ UX๋ฅผ ๋ณด์žฅํ•˜๋ ค๋ฉด Core Telephony ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์ด์šฉํ•˜์‹ญ์‹œ์˜ค.
  • VoIP ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜ค๋””์˜ค๋ฅผ ์žฌ์ƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์งํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์žฌ์‹œ์ž‘ ๋˜์–ด VoIP ์„œ๋น„์Šค๋ฅผ ํ•ญ์ƒ ์‚ฌ์šฉ ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Using the Reachability Interfaces to Improve the User Experience

VoIP ์•ฑ์€ ๋„คํฌ์›Œํฌ ํ™˜๊ฒฝ์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์—, System Configuration framework์˜ reachability interface๋ฅผ ํ™œ์šฉํ•ด ๋„คํฌ์›Œํฌ ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๊ฒฐ๊ณผ์— ๋งž๊ฒŒ ๋™์ž‘์„ ์กฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. reachability interface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ ๋ ๋•Œ๋งˆ๋‹ค ์•ฑ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ VoIP ์—ฐ๊ฒฐ ์ƒํƒœ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ๊ฐ€์šฉ์„ฑ์„ ํŒŒ์•…ํ•ด ์•ฑ์˜ ๋™์ž‘์„ ์กฐ์ •ํ•˜๋ฉด, ๊ธฐ๊ธฐ์˜ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•ฑ์ด ๋” ์ž์ฃผ ์ž ์ž๊ธฐ ์ƒํƒœ๋กœ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • reachability interface์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ System Configuration Framework Reference๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ธฐ๊ธฐ๋‚ด ์•ฑ๊ฐ„ ํ†ต์‹ ์€ ๊ฐ„์ ‘์ ์ธ ๋ฐฉ์‹์„ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. AirDrop์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์•ฑ๊ณผ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ฑ URL์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์— ์ •๋ณด๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก custom URL Schemes์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฐธ๊ณ : UIDocumentInteractionController ๊ฐ์ฒด ๋˜๋Š” document picker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ๊ฐ„ ํŒŒ์ผ ๊ตํ™˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. UIDocumentInteractionController์— ๋Œ€ํ•œ ์ •๋ณด๋Š” Document Ineraction Programming Topics for iOS๋ฅผ, document picker์— ๊ด€ํ•œ ์ •๋ณด๋Š” Document Picker Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Supporting AirDrop

AirDrop์„ ํ†ตํ•ด ๊ทผ์ฒ˜์— ์žˆ๋Š” ๊ธฐ๊ธฐ์™€ ์‚ฌ์ง„, ๋ฌธ์„œ, URL ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ข… ๋ฐ์ดํ„ฐ๋“ค์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. AirDrop์€ peer-to-peer ๋„คํŠธ์›Œํ‚น์„ ํ†ตํ•ด ์ฃผ๋ณ€ ๊ธฐ๊ธฐ๋ฅผ ์ฐพ๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Sending Files and Data to Another App

AirDrop์„ ์ด์šฉํ•ด ํŒŒ์ผ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด UIActivityViewController ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. UIActivityViewController๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ๋ณด์—ฌ์ง€๋Š” UI ํ™”๋ฉด์— activity sheet๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ๋•Œ ์ „์†กํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. UIActivityViewController๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์› ๊ฐ€๋Šฅํ•œ activities๋งŒ ํ‘œ์‹œํ•ด์ค๋‹ˆ๋‹ค. AirDrop์˜ ๊ฒฝ์šฐ ์ด๋ฏธ์ง€, ๋ฌธ๊ตฌ, URL ๊ทธ๋ฆฌ๊ณ  ๋ช‡๋ช‡ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. UIActivityItemSource ํ”„๋กœํ† ์ฝ”๋ฅผ ์ฑ„ํƒํ•œ custom ๊ฐ์ฒด ์ „์†ก๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Receiving Files and Data Send to Your App

AriDrop์„ ํ†ตํ•ด ์ˆ˜์‹ ํ•œ ํŒŒ์ผ์„ ๋ฐ›์œผ๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์„ ํ•˜์‹ญ์‹œ์˜ค.

  • Xcode์—์„œ ์•ฑ์—์„œ ์—ด ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ ํƒ€์ž…์„ ๋ช…์‹œํ•˜์‹ญ์‹œ์˜ค.

  • app delegate์— application:openURL:sourceApplication:annotation: ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋‹ค๋ฅธ ์•ฑ์„ ํ†ตํ•ด ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ์‹ญ์‹œ์˜ค.

  • Xcode project Info ํƒญ์— ์•ฑ์—์„œ ์ง€์›๊ฐ€๋Šฅํ•œ ๋ฌธ์„œ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ ์œ ํ˜• ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์œ ํ˜•์˜ ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ UTI๋ฅผ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด png ํŒŒ์ผ์— ๋Œ€ํ•œ ์ง€์›์„ ์„ ์–ธํ•˜๋ ค๋ฉด public.png๋ฅผ UTI ๋ฌธ์ž์—ด๋กœ ํฌํ•จํ•ฉ๋‹. iOS๋Š” ์ง€์ •๋œ UTI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์ด ์ฃผ์–ด์ง„ ๋ฌธ์„œ๋ฅผ ์—ด ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ์„œ๋ฅผ ์•ฑ ์ปจํ…Œ์ด๋„ˆ์— ์ „์†ก ๋ฐ›๊ฒŒ ๋˜๋ฉด (ํ•„์š”ํ•œ ๊ฒฝ์šฐ)์‹œ์Šคํ…œ์ด ์•ฑ์„ launch ํ•˜๊ณ  app delegate์˜ application:openURL:sourceApplication:annotation: ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์•ฑ์ด foreground ์ƒํƒœ๋ผ๋ฉด ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์œ ์ €์—๊ฒŒ ํŒŒ์ผ์„ ๋ณด์—ฌ์ฃผ๊ณ , background ์ƒํƒœ๋ผ๋ฉด ๋‚˜์ค‘์— ์—ด ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์ด ์žˆ์Œ์„ ๋…ธํŠธํ•ด๋‘ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

  • AirDrop์„ ํ†ตํ•ด ์ „์†ก ๋œ ํŒŒ์ผ์€ ์•”ํ˜ธํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅ์น˜๊ฐ€ ์ž ๊ธˆ ํ•ด์ œ ๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • AirDrop์„ ์ด์šฉํ•ด ์ „์†ก๋ฐ›์€ ํŒŒ์ผ์€ ์•ฑ์—์„œ ์ฝ๊ณ , ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํŽธ์ง‘์€ ๋ถˆ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.


Using URL Schemes to Communicate with Apps

URL scheme์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์˜ํ•ด๋‘” ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์•ฑ๊ณผ ํ†ต์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Scheme์„ ๊ตฌ์ถ•ํ•ด๋‘” ์•ฑ๊ณผ ํ†ต์‹  ํ•˜๋ ค๋ฉด ์ ์ ˆํ•œ ํ˜•์‹์˜ URL๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‹œ์Šคํ…œ์— ์—ด์–ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • sheme์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น scheme์— ๋Œ€ํ•œ ์ง€์›์—ฌ๋ถ€๋ฅผ ์„ ์–ธํ•˜๊ณ , ํ•ด๋‹น sheme์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” URLs์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • Apple์€ http, mailto, tel ๊ทธ๋ฆฌ๊ณ  sms URL scheme์— ๋Œ€ํ•œ ๋‚ด์žฅ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Maps, YouTube ๊ทธ๋ฆฌ๊ณ  iPod ์•ฑ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” http๊ธฐ๋ฐ˜ URL๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ scheme์— ๋Œ€ํ•œ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ณ ์ •๋˜์–ด์žˆ์œผ๋ฉฐ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (Apple์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ scheme์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ธฐ๋ณธ ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.)
  • Apple์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ scheme์„ ํ™•์ธํ•˜๋ ค๋ฉด Apple URL Scheme Reference๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Sending a URL to Another App

์•ฑ์— ๊ตฌํ˜„ํ•ด ๋†“์€ custom URL scheme์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด ์ ์ ˆํ•œ URL์„ ๋จผ์ € ์ƒ์„ฑํ•˜๊ณ  openURL: ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Implementing Custom URL Schemes

์•ฑ์—์„œ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ URL์„ ์ˆ˜์‹  ํ•˜๋ ค๋ฉด, ํ•ด๋‹น URL scheme๋ฅผ ์‹œ์Šคํ…œ์— ๋“ฑ๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์€ ์ข…์ข… custom URL scheme๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ์•ฑ์—์„œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉ ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง€๋„ ์•ฑ์€ ํŠน์ • ์œ„์น˜๋ฅผ ์ง€๋„์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ URL์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • Registering Custom URL Schems: ์•ฑ์— custom URL์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด Info.plist ํŒŒ์ผ์— CFBundleURLTypes ํ‚ค๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค. CFBundleURLTypes ํ‚ค์—๋Š” dictionary๊ฐ€ array๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. dictionary๋Š” CFBundleURLName, CFBunldeURLSchemes ํ‚ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Handling URL Requests: custom URL scheme๋ฅผ ๊ฐ–๋Š” ์•ฑ์€ ์ „๋‹ฌ๋˜๋Š” URLs์„ ์ž˜ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  URLs์€ app delegate๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ URLs์„ ํ•ธ๋“คํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • application:willFinishLaunchingWithOptions:, application:didFinishLaunchingWithOptions: : ์ „๋‹ฌ ๋ฐ›์€ URL์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜๊ณ , URL์„ ์˜คํ”ˆํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์•ฑ์ด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ธ๋“ค๋ง ์ฝ”๋“œ๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • application:openURL:sourceApplication:annotation: : ์ „๋‹ฌ๋ฐ›์€ ํŒŒ์ผ์„ ์—ด๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.

Displaying a Custom Launch Image When a URL is Opened

Custom URL schemes์„ ์ง€์›ํ•˜๋Š” ์•ฑ์€ ๊ฐ scheme์— custom launch image๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ จ ์Šค๋ƒ… ์ƒท์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ œ๊ณตํ•œ launch image๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. launch image๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์˜ png ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

  \<basename>-\<url_scheme>\<other_modifiers>.png
  • basename: Info.plist ํŒŒ์ผ์— ์žˆ๋Š” UILaunchImageFileํ‚ค๋กœ ์ง€์ •๋œ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • url_scheme: URL sheme์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • other_modifiers: ์ด๋ฏธ์ง€์— ๋ง๋ถ™์ผ์ˆ˜ ์žˆ๋Š” ์ˆ˜์‹์–ด๋Š” Information Property Key Reference๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์•ฑ ์„ค๊ณ„(design)๊ฐ€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ ๊ฐ ๋‹จ๊ณ„ ๋งˆ๋‹ค ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ „๋ ฅ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ iOS ์•ฑ์— ๋งค์šฐ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์ด๋ฉฐ, ์ด ์™ธ์—๋„ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ „๋ฐ˜์—์„œ ์•ฑ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผํ•  ์š”์†Œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Reduce Your App's Power Cunsumption

๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ์ „๋ ฅ ์†Œ๋ชจ๋Š” ํ•ญ์ƒ ์ด์Šˆ์ž…๋‹ˆ๋‹ค. iOS์˜ ์ „์› ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์€ ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์„ ์ข…๋ฃŒํ•˜์—ฌ ์ „๋ ฅ์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์„ ์ตœ์ ํ™” ํ•˜์—ฌ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 CPU, Wi-Fi, ๋ธ”๋ฃจํˆฌ์Šค, ์…€๋ฃฐ๋Ÿฌ ๋ฐ์ดํ„ฐ(4G, 3G), ๋ผ๋””์˜ค, ์œ„์น˜ ์‹œ์Šคํ…œ, ๊ฐ€์†๋„๊ณ„, ๋””์Šคํฌ
  • ์•ฑ ์ตœ์ ํ™”์˜ ๋ชฉํ‘œ๋Š” ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Instruments๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•ญ์ƒ ์ตœ์ ํ™” ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ์ตœ์ ํ™” ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์กฐ์ฐจ๋„ ๊ธฐ๊ธฐ ๋ฐฐํ„ฐ๋ฆฌ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ๋‹ค์Œ ์ง€์นจ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
    • Polling์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Polling ์ž‘์—…์€ CPU๊ฐ€ ์ž ์ž๊ธฐ ๋ชจ๋“œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•ฉ๋‹ˆ๋‹ค. Polling ๋Œ€์‹  NSRunLoop ๋˜๋Š” NSTimer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜์‹ญ์‹œ์˜ค.
    • ๊ฐ€๋Šฅํ•˜๋ฉด UIApplication์˜ shared ๊ฐ์ฒด์˜ idleTimerDisabled ์†์„ฑ์„ false๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. IdleTimer๋Š” ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ธฐ๊ธฐ์˜ ํ™”๋ฉด์„ ๋„๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š”๋ฐ, ์•ฑ ํ™”๋ฉด์„ ๊ณ„์† ์ผœ๋‘˜ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.
    • ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์€ chunk๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ํ•œ๋ฒˆ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ์€ ์ „๋ ฅ์„ ์†Œ๋น„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • ๋””์Šคํฌ์— ๋„ˆ๋ฌด์ž์ฃผ accessํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ฑ์ด ์ƒํƒœ ์ •๋ณด๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒํƒœ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ๋•Œ๋งŒ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ†ตํ•ฉํ•˜์—ฌ ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”์ด์ƒ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ธฐ(draw) ์ž‘์—…์€ ์ „๋ ฅ์ด ๋งŽ์ด ์†Œ๋ชจ๋˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.
    • UIAccelerometer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์†๋„๊ณ„ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•„์š”ํ•˜์ง€ ์•Š์„๋•Œ๋Š” ์ด๋ฒคํŠธ ์ „๋‹ฌ์„ ๋น„ํ™œ์„ฑํ™” ํ•˜์‹ญ์‹œ์˜ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Event Handling Guide for UIKit Apps๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
    • ๋„คํŠธ์›Œํฌ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๋งŽ์€ ์ „๋ ฅ์„ ์†Œ๋ชจํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋„คํŠธ์›ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์€ ์ „๋ ฅ ์†Œ๋ชจ์— ๊ฐ€์žฅ ์˜ํ–ฅ์„ ๋งŽ์ด ๊ธฐ์น˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ง€์นจ์„ ๋”ฐ๋ฅด๋ฉด ๋„คํŠธ์›Œํฌ์— ์†Œ๋ชจ๋˜๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ํ•ด๋‹น ์„œ๋ฒ„๋ฅผ pollingํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
      • ๋„คํŠธ์›ŒํŠธ์— ์—ฐ๊ฒฐํ•ด ์ž‘์—…์„ ํ• ๋•Œ๋Š” ์••์ถ•๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์‹ญ์‹œ์˜ค.
      • NSURLSession ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œ ํ• ๋•Œ, ๋‹ค์Œ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ๋ง๊ณ  queue์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์‹œ์Šคํ…œ์ด ์ž๋™์ ์œผ๋กœ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด Wi-Fi๋ฅผ ์‚ฌ์šฉํ•ด ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐํ•˜์‹ญ์‹œ์˜ค. Wi-Fi๋Š” ์…€๋ฃฐ๋Ÿฌ๋ณด๋‹ค ์ „๋ ฅ ์†Œ๋ชจ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.
      • Core Location ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ, ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์œ„์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๊ณ  distance filter์™€ accuracy level์„ ์ ์ ˆํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ๊ด€๋ จ๋œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Location and Maps Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
  • Instruments๋Š” ์ „๋ ฅ ๊ด€๋ จ ์ •๋ณด ์ˆ˜์ง‘์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ณ„์ธก๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณ„์ธก๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋ ฅ ์†Œ๋น„์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด์™€ ์—ฌ๋Ÿฌ ํ•˜๋“œ์›จ์–ด(Wi-Fi, Blutooth, GPS, ๋””์Šคํ”Œ๋ ˆ์ด, CPU ๋“ฑ)์— ๋Œ€ํ•œ ์ธก์ • ๊ฐ’์„ ์ˆ˜์ง‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Use Memory Efficiently

์•ฑ์€ ๊ฐ€๋Šฅํ•œ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์˜ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ์•ฑ์˜ ์„ฑ๋Šฅ์—๋Š” ์ง์ ‘์ ์ธ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ์œผ๋ฉด ์ดํ›„ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ๋•Œ ๋ฌธ์ œ์„ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

Obseve Low-Memory Warnings

์‹œ์Šคํ…œ์—์„œ ์•ฑ์— ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋‚ด๋ฉด ์ฆ‰์‹œ ์‘๋‹ตํ•˜์‹ญ์‹œ์˜ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๊ฒฝ๊ณ ๋Š” ํ•„์š”์—†๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ ์— ๋Œ€ํ•ด ์‘๋‹ตํ•˜๋‹ค ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์•ฑ์ด ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์•„๋ž˜ API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๊ณ ๋ฅผ ์•ฑ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • applicationDidReceiveMemoryWarning: : app delegate ๋ฉ”์†Œ๋“œ

  • didReceiveMemoryWarning: UIViewController ๋ฉ”์†Œ๋“œ

  • UIApplicationDidReceiveMemoryWarningNotification: ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜

  • ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ‰์‹œ ํ•ด์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑฐ๋Œ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ๋ณธ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ฐธ๊ณ : iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ Simulate Memory Warning ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ƒํƒœ์˜ ์•ฑ ๋™์ž‘์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Reduce Your App's Memory Footprint

์ดˆ๊ธฐ์— ๋‚ฎ์€ ์„ค์น˜ ๊ณต๊ฐ„์œผ๋กœ ์‹œ์ž‘ํ•ด ์ถ”ํ›„์— ์•ฑ์„ ํ™•์žฅ ํ•  ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์„ค์น˜ ๊ณต๊ฐ„์„ ์ค„์ด๋Š” ๋ฐฉ์‹์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(leak) ์ œ๊ฑฐ Instruments๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋””๋ฐ”์ด์Šค์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์„ ์ถ”์ ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ฆฌ์†Œ์Šค ํŒŒ์ผ ์ค„์ด๊ธฐ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๊ฐ€๋Šฅํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์••์ถ•ํ•˜์‹ญ์‹œ์˜ค. (iOS ์•ฑ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ํฌ๋งท์ธ PNG ์ด๋ฏธ์ง€๋ฅผ ์••์ถ•ํ•˜๋ ค๋ฉด pngcrush ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.)
  • ์†์„ฑ ๋ชฉ๋ก ํŒŒ์ผ ์ค„์ด๊ธฐ NSPropertyListSerialization` ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†์„ฑ ๋ชฉ๋ก์„ ์ด์ง„๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ Core Data ํ˜น์€ SQLite๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์ „์ฒด ์„ธํŠธ๋ฅผ ํ•œ๋ฒˆ์— ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌ ํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์†Œ์Šค ๋กœ๋“œ ์‹œ์  ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๋กœ๋“œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒฐ๊ตญ์€ ์•ฑ์˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Allocate Memory Wisely

๋‹ค์Œ์€ ํ˜„๋ช…ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํŒ์ž…๋‹ˆ๋‹ค.

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

Tune Your Networking Code

iOS์˜ ๋„คํŠธ์›Œํ‚น ์Šคํƒ์—๋Š” iOS ๊ธฐ๊ธฐ์˜ ๋ฌด์„  ํ†ต์‹ ์„ ์œ„ํ•œ ๋ช‡๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” CFNetwork ํ”„๋ ˆ์ž„ ์›Œํฌ์ด๋ฉฐ, Core Entityํ”„๋ ˆ์ž„ ์›Œํฌ์™€ BSD ์†Œ์ผ“์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•ด CFNetwork ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋Š” CFNetwork Programming Guide์™€ CFNetwork Framework Reference๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

Tips for Efficient Networking Using Wi-Fi

๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์ž‘์—…์€ ๊ธฐ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ „๋ ฅ์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๋Š” ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ํŒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

Using Wi-Fi

์•ฑ์ด Wi-Fi๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ์— ์•ก์„ธ์Šค ํ•˜๋Š” ๊ฒฝ์šฐ ์•ฑ์˜ Info.plist ํŒŒ์ผ์— UIRequiresPersistentWiFi ํ‚ค๋ฅผ ํฌํ•จ์‹œ์ผœ ์‹œ์Šคํ…œ์— ์•Œ๋ ค์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ Wi-Fi ํ•˜๋“œ์›จ์–ด๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

The Airplane Mode Alert

๊ธฐ๊ธฐ๊ฐ€ ๋น„ํ–‰๊ธฐ ๋ชจ๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์•ฑ์ด ์‹œ์ž‘๋˜๋ฉด, ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น„ํ–‰๋ชจ๋“œ์ž„์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด alert๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ ์ถฉ์กฑ๋˜๋ฉด alert๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

* Info.plist ํŒŒ์ผ์— `UIRequiresPersistentWiFi` ํ‚ค๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๊ณ , ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์ด `true`์ผ๋•Œ
* ๊ธฐ๊ธฐ๊ฐ€ ๋น„ํ–‰๊ธฐ ๋ชจ๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์•ฑ์ด ์‹คํ–‰๋จ
* ๋น„ํ–‰๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜ ํ•œ ํ›„, ์žฅ์น˜์˜ Wi-Fi๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™” ๋จ

Imporve Your File Management

ํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋””์Šคํฌ์— ์“ฐ๋Š” ๋ฐ์ดํ„ฐ ์–‘์„ ์ตœ์†Œํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ด€๋ จ ์ž‘์—…์„ ์ตœ์†Œํ•˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ํŒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํŒŒ์ผ ์ „์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์˜ ์ผ๋ถ€๋ถ„๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ randomly ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ณ , ์–‘์ด ์ด ๋ช‡ MB์ด์ƒ์ธ ๊ฒฝ์šฐ Core Data ํ˜น์€ SQLite์™€ ๊ฐ™์€ ์˜๊ตฌ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜์‹ญ์‹œ์˜ค.
  • ์บ์‹œํŒŒ์ผ์„ ๋””์Šคํฌ์— ์“ฐ์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ์œ ์ผํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ์€ ์•ฑ์„ ์ข…๋ฃŒํ–ˆ์„๋•Œ์™€ ๋™์ผํ•œ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ• ๋•Œ ์ž…๋‹ˆ๋‹ค.

Make App Backups More Efficient

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

App Backup Best Practices

๋ฐฑ์—…/๋ณต์› ์ž‘์—…์„ ์œ„ํ•ด ์•ฑ์—์„œ ์ค€๋น„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. iClound๋‚˜ iTunes์— ์—ฐ๊ฒฐ๋˜๋ฉด ์•ฑ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋‚ด์šฉ์€ ๋ฐฑ์—…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 \<Application_Home>/AppName.app
 \<Application_Data>/Library/Caches
 \<Application_Data>/tmp

๋™๊ธฐํ™” ํ”„๋กœ์„ธ์Šค์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ์•ฑ์ด ์ฐจ์ง€ํ•˜๋Š” ์šฉ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ฐ€์ด๋“œ ๋ผ์ธ์— ๋”ฐ๋ผ ์•ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” <Application_Data>/Documents ์— ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”๋ฐ์ดํ„ฐ๋ž€ ์‚ฌ์šฉ์ž ๋ฌธ์„œ ๋ฐ ๊ธฐํƒ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•œ ์ฝ˜ํ…์ธ ์™€ ๊ฐ™์ด ์•ฑ์—์„œ ๋‹ค์‹œ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • Support file์—๋Š” ์•ฑ์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์žฌ์ƒ์„ฑ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋Š” <Application_Data>/Library/Caches ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ด์•ผํ•˜๋Š” ํŒŒ์ผ์˜ ์˜ˆ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์บ์‹œ ํŒŒ์ผ, ์žก์ง€, ์‹ ๋ฌธ, ์ง€๋„ ์•ฑ ๋“ฑ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์ž„์‹œ ๋ฐ์ดํ„ฐ๋Š” <Application_Data>/tmp ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ž„์‹œ ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๊ธฐ์—์„œ ์‚ฌ์šฉ๋œ ํ›„์—๋Š” ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋„๋ก ํŒŒ์ผ์„ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ File Systeom Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Files Saved During App Updates

์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด iTunes๋Š” ์ƒˆ๋กœ์šด ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ์— ์—…๋ฐ์ดํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ „ ์•ฑ์„ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ƒˆ ์•ฑ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์€ ์—…๋ฐ์ดํŠธ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

\<Application_Data>/Documents
\<Application_Data>/Library

์—…๋ฐ์ดํŠธ ํ›„์—, ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ๋„ ์˜ฎ๊ฒจ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๋ฏฟ์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.


Move Work off the Main Thread

์•ฑ์˜ main thread์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์˜ ์œ ํ˜•์„ ์ œํ•œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. main thread๋Š” ์•ฑ์˜ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ๋ฐ ๊ธฐํƒ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ์•ฑ์ด ํ•ญ์ƒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ์— ์•ก์„ธ์Šคํ•˜๋Š” ์ž‘์—…์ด๋‚˜ ์žฅ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ main thread์—์„œ ์‹คํ–‰ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์˜ฎ๊ฒจ์„œ ์ž‘์—…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ GCD(Grand Center Dispatch) ๋˜๋Š” NSOperation ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋น„๋™๊ธฐ(async)๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰์‹œํ‚ค๋ฉด main thread๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋ฉฐ, ์ด๋Š” ์•ฑ์ด ์‹œ์ž‘/์ข…๋ฃŒ๋ ๋•Œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ์•ฑ์ด ์‹คํ–‰(launch)๋ ๋•Œ main thread๊ฐ€ ์ฐจ๋‹จ ๋œ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์€ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์•ฑ์„ ์ข…๋ฃŒ(kill)์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์•ฑ์ด ์ข…๋ฃŒ๋ ๋•Œ main thread๊ฐ€ ์ฐจ๋‹จ๋˜์–ด์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž์˜ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์ „์— ์‹œ์Šคํ…œ์ด ์•ฑ์„ ์ข…๋ฃŒ(kill)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • GCD, operation object, thread์— ๊ด€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” Concurrency Programming Guide๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  • ์›๋ฌธ์—์„œ ์ค‘๋ณต๋˜๋Š” ๋‚ด์šฉ์ด๋‚˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ ์›๋ฌธ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
  • ๋ฒˆ์—ญ: ์ „๋ฏธ์ •

์œ„๋กœ๊ฐ€๊ธฐ

About

iOS Programming Documents in Korean

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors