Slide 1

Slide 1 text

Kanta Oikawa - 2026/02/22 ΋͏ා͘ͳ͍όοΫάϥ΢ϯυॲཧ Background Tasks ͷ͢΂ͯ Hakodate.swift #1 LT

Slide 2

Slide 2 text

όοΫάϥ΢ϯυॲཧ͸ා͍ɺ͚Ͳେࣄ • iOSͷόοΫάϥ΢ϯυॲཧ͸੍໿͕ଟͯ͘େมͦ͏ • σόοά͕େมͦ͏ • Ͱ΋ɺϢʔβʔମݧΛ޲্ͤ͞ΔͨΊʹ͸ආ͚ΒΕͳ͍͜ͱ΋ • ۩ମతͳ੍໿ = όοΫάϥ΢ϯυॲཧΛ࣮ߦ͢Δํ๏ • σόοάͷํ๏ • ͞Βͬͱ5෼Ͱ… 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

όοΫάϥ΢ϯυॲཧͷछྨͱํ๏ • Background ͰॲཧΛ։࢝͢Δ • App Refresh (BGAppRefreshTask) • Background Push Noti fi cation • Processing (BGProcessingTask) • Foreground Ͱ։࢝ͨ͠ॲཧΛ Background Ͱܧଓ͢Δ • UIApplication / beginBackgroundTask(expirationHandler:) • BGContinuedProcessingTask (26+) 7

Slide 8

Slide 8 text

Background ͰॲཧΛ։࢝͢Δ App Refresh (BGAppRefreshTask) • e.g. גՁΞϓϦͰ࠷৽ͷגՁΛऔಘ • සൟʹΞΫηε͢ΔσʔλΛ࠷৽ͷঢ়ଶʹอͭ • ࣮ߦλΠϛϯά͸ΞϓϦͷ࢖༻ύλʔϯʹԠͯ͡γεςϜ͕ܾఆ • "࣍ճ࣮ߦ·Ͱͷ࠷খ࣌ؒ" ͷΈίϯτϩʔϧՄೳ 8

Slide 9

Slide 9 text

Background ͰॲཧΛ։࢝͢Δ Background Push Noti fi cation • e.g. χϡʔεΞϓϦͷ଎ใهࣄ • ཁ͢Δʹ Remote Push Noti fi cation • Push ϕʔεͰσʔλΛߋ৽
 App Refresh ͸ Fetch ϕʔεͰσʔλΛߋ৽ • Push Noti fi cation Λड͚औͬͨޙͷॲཧ͕ଈ࣮࣌ߦ͞ΕΔอূ͸ͳ͍ 9

Slide 10

Slide 10 text

Background ͰॲཧΛ։࢝͢Δ Processing (BGProcessingTask) • e.g. σʔλϕʔεͷ੔ཧ • Ϣʔβʔ͕σόΠεΛ࢖༻͍ͯ͠ͳ͍ؒʹ࣮ߦ͞ΕΔ • Ϣʔβʔ͕σόΠεͷ࢖༻Λ࢝ΊΔͱఀࢭ͞ΕΔ • ਺෼͔͔Δॲཧ΋࣮ߦͰ͖Δ͕ɺγεςϜʹΑΓதஅ͞ΕΔՄೳੑ͕͋Δ • ωοτϫʔΫ઀ଓঢ়ଶɺిݯ઀ଓঢ়ଶΛ࣮ߦ৚݅ͱͯ͠ࢦఆͰ͖Δ 10

Slide 11

Slide 11 text

Foreground Ͱ։࢝ͨ͠ॲཧΛ Background Ͱܧଓ͢Δ UIApplication / beginBackgroundTask(expirationHandler:) • e.g. ঢ়ଶͷมߋ, σʔλϕʔεͷ੾அ • γεςϜ͕։࢝ͨ͠ॲཧΛɺ BackgroundʹભҠͯ͠΋ܧଓͯ͠׬ྃͤ͞Δ 11

Slide 12

Slide 12 text

Foreground Ͱ։࢝ͨ͠ॲཧΛ Background Ͱܧଓ͢Δ BGContinuedProcessingTask (26+) • e.g. InstagramͷετʔϦʔΛ౤ߘ • Ϣʔβʔ͕։࢝ͨ͠ॲཧΛBackgroundʹભҠͯ͠΋ܧଓͯ͠׬ྃͤ͞Δ • ਐḿ͕Live ActivityͰදࣔ͞ΕΔ 12

Slide 13

Slide 13 text

Background Tasks ͷϑϩʔνϟʔτ 13

Slide 14

Slide 14 text

όοΫάϥ΢ϯυॲཧΛ࣮ߦ Background Modes Λ༗ޮԽ 14

Slide 15

Slide 15 text

όοΫάϥ΢ϯυॲཧΛ࣮ߦ Task ID Λ Info.plist ʹొ࿥ 15

Slide 16

Slide 16 text

όοΫάϥ΢ϯυॲཧΛ࣮ߦ (App Refresh, Processing) Task ID Λࢦఆͯ͠λεΫΛεέδϡʔϧ private func scheduleAppRefresh() { let request = BGAppRefreshTaskRequest(identifier: appRefreshTaskIdentifier) request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) do { try BGTaskScheduler.shared.submit(request) print("Scheduled app refresh successfully") } catch { print("Failed to schedule app refresh: \(error)") } } 16

Slide 17

Slide 17 text

App Refresh ͱ Processing Λσόοά 1. Xcode Ͱ Run Destination ʹ࣮ػΛબ୒ 2. Run ͯ͠λεΫΛεέδϡʔϧ 3. Foreground Ͱ Pause program execution ϘλϯΛԡ͢ 4. Home Screen ʹ໭ΔͳͲͯ͠ Background ʹભҠͤ͞Δ 5. LLDBͰҎԼΛ࣮ߦʢൃՐ͍ͤͨ͞λεΫͷTask IDΛࢦఆ͢Δʣ
 e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdenti fi er:@"com.kantacky.BackgroundTasksSample .refresh"] 17

Slide 18

Slide 18 text

࣮ࡍʹ΍ͬͯΈͨ ࣮૷ • 2/20·Ͱͷ1िؒ͘Β͍Ͱ Vibe Coding ͯ͠৹ࠪʹఏग़ͨ͠ΞϓϦ • RSS ϑΟʔυϦʔμʔ • App RefreshͰϑΟʔυΛFetchͯ͠৽ணهࣄΛϩʔΧϧ௨஌ 18

Slide 19

Slide 19 text

࣮ࡍʹ΍ͬͯΈͨ ໰୊ͱղܾࡦ • ӡΑ۪͘௚ʹ࣮ߦ͞Εͯɺ࣍ճ࣮ߦ·Ͱͷ࠷খ࣌ؒ͝ͱʹ௨஌͕དྷͯ͏͍͟ • ࣍ճ࣮ߦ·Ͱͷ࠷খ࣌ؒΛେ͖͘͢Δɺ௨஌ର৅ΛߜΔ • Background Push Noti fi cation Λ࢖͏ • αʔόʔͰϑΟʔυΛFetchͯ͠ɺ৽ணهࣄΛϦϞʔτ௨஌ • ௨஌ΛఘΊͯɺApp RefreshͰϑΟʔυΛ࠷৽ͷঢ়ଶʹอ͚ͭͩʹͱͲΊΔ 19

Slide 20

Slide 20 text

Materials https://kantacky.com/hakodate-swift-1 • εϥΠυ • https://speakerdeck.com/kantacky/hakodate-swift-1 • App RefreshΛ࣮૷ͨ͠αϯϓϧίʔυ • https://github.com/kantacky/background-tasks-ios 20

Slide 21

Slide 21 text

Kanta Oikawa • ެཱ͸ͩͯ͜ະདྷେֶ M1 • Έͳ͞ΜɺവؗʹΑ͏ͦ͜ʂ • ͥͻຬ٤͍͍ͯͬͯͩ͘͠͞ 21