15分でわかる バックグラウンドアップロード

7d1521d950d9bc5697868830cb04ff2f?s=47 yimajo
September 17, 2017

15分でわかる バックグラウンドアップロード

iosdc2017 の発表資料です

7d1521d950d9bc5697868830cb04ff2f?s=128

yimajo

September 17, 2017
Tweet

Transcript

  1. ෼ͰΘ͔Δ όοΫάϥ΢ϯυΞοϓϩʔυ גࣜձࣾΩϡϦΦγςΟιϑτ΢ΣΞ J04%$D !ZJNBKP ࠓ৓ળۣ ձ৔ૣҴాେֶཧ޻ֶ෦੢ૣҴాΩϟϯύε߸ؗձٞࣨ

  2. ෳ਺͋Δηογϣϯͷத͔ΒબΜͰ௖͖ ͋Γ͕ͱ͏͍͟͝·͢

  3. wࢿྉ͸ޙ΄Ͳ΢Σϒ্ʹެ։ͯ͠ϋογϡλάΛ෇͚ͯπΠʔτΛ ͠·͢!ZJNBKPJPTEDD wࢿྉͷࡱӨ͸ࣗ༝Ͱ͕͢ɺ࿥ը͞Ε͍ͯΔ͸ͣͳͷͰ:PV5VCFͰݟ ฦͤΔ͸ͣͰ͢ wฏຌͳൃදͳͷͰؾܰʹฉ͍͍ͯͩ͘͞

  4. ͳͥࠓճόοΫάϥ΢ϯυͰͷ Ξοϓϩʔυʹ͍ͭͯ ࿩͢ͷ͔ ❓

  5. υΩϡϝϯτ͕গͳ͍

  6. αϯϓϧίʔυ͸͔ͳΓগͳ͍

  7. όοΫάϥ΢ϯυ࣌ͷ ಈ࡞͕σόοάͮ͠Β͍

  8. ͜ͷൃදͰ͸ʜ

  9. όοΫάϥ΢ϯυࣗ ମͷ͓͞Β͍͠·͢

  10. ࢓༷ͷ෼͔ΓͮΒ ͍఺Λղઆ͠·͢

  11. σόοάʹඞਢͳπʔ ϧΛ঺հ͠·͢

  12. ͸͡ΊͯͰ΋ ࠷୹Ͱ҆શͳํ๏͕Θ͔Δͱࢥ ͍·͢

  13. ͋ΒͨΊ͓ͯ͠ͳ͕͖ w ࣗݾ঺հ w όοΫάϥ΢ϯυΞοϓϩʔυͬͯԿʁ w ϓϩδΣΫτ΁ͷಋೖͱ։ൃ໾ཱͪπʔϧ

  14. ࣗݾ঺հ

  15. ͋ΒͨΊͯࣗݾ঺հ wגࣜձࣾΩϡϦΦγςΟιϑτ΢ΣΞ wϒʔεεϙϯαʔ w!ZJNBKPʢࠓ৓ળۣʣ wJ04͘Β͍͔ΒΞϓϦ͘Β͍

  16. ༨ஊΛ͠·͢

  17. ͜ͷ෦԰ೖޱͷઆ໌ ಡΜͩਓ͍·͢ʁ ʮ͜ͷ෦԰͸ૣҴాཧ޻ֶ෦ͷ૑ઃऀɺ ஛಺໌ଠ࿠ه೦ձٞࣨͰ͢ʯ ʢ࣮͸෦԰͝ͱʹ໊લ͕͋Γ·͢ʣ

  18. ͜ͷձ৔ೖޱͷ૾ˠ ஛಺ ໌ଠ࿠ʢ͚ͨ͏ͪ Ί͍ͨΖ͏ɺ ҆੓7೥2݄28೔ʮ1860೥3݄20೔ʯ ੜ·Ε — ত࿨3೥ʮ1928೥ʯ3݄23೔ʣ຅͸ɺ ݱࡏͷߴ஌ݝ ॓ໟࢢग़਎ͷ໌࣏ɾେਖ਼ظͷ ࣮ۀՈɾऺٞӃٞһɻ ૣҴాେֶཧ޻ֶ෦ઃཱऀɻ

  19. ࠓճͷൃදऀˠ @yimajoʢ͍·͡ΐ͏Α͠ͷΓɺ 1981೥ੜ·Εʣ͸ɺ ݱࡏͷߴ஌ݝ࢛ສेࢢग़਎ɻ தֶ࣌୅΄΅डݧษڧΛ͠ͳ͔ͬͨͨΊ ࣗ୐ۙ͘ͷਐֶߍʹਐ·ͣɺ ߴ஌ݝ॓ໟߴߍʹਐֶɺ ϒʔεεϙϯαʔ݉εϐʔΧʔ

  20. ͕͢͞ӡӦɺΘ͔ͬͯ·͢Ͷ

  21. ӡӦ ʮͨͩͷۮવͰ͢ʯ

  22. ຊ୊

  23. ͦ΋ͦ΋ όοΫάϥ΢ϯυΞοϓϩʔυ ͬͯԿʁ

  24. w J04Ҏ߱ͷόοΫάϥ΢ϯυΞοϓϩʔυॲཧ w #BDLHSPVOE5SBOTGFS4FSWJDF༻ͷ"1*ͱͯ͠/463-4FTTJPO ͰॲཧΛ࣮૷Ͱ͖·͢

  25. Ͳ͏͍͏ͱ͖࢖͏ w ଞͷΞϓϦΛ࢖͍ͬͯΔؒ΋ࣗ෼ͷΞϓϦͰൺֱతେ͖ͳϑΝΠϧ ΛΞοϓϩʔυͰ͖Δ w 4IBSF&YUFOTJPOͰJ04ඪ४ͷࣸਅBQQͳͲଞΞϓϦ͔Βίϯςϯ πΛબΜͰαʔόʔʹΞοϓϩʔυ͢Δࡍʹ΋ར༻͢Δͱศར

  26. ͔͠͠ ࠷ॳʹݴ͓ͬͯ͘ͱ

  27. บ͕ڧ͍

  28. ৭ʑ஌ͬͯͳ͍ͱ

  29. ѻ͍ͮΒ͍

  30. όοΫάϥ΢ϯυͬͯԿʁ w ΞϓϦ͕ϑΥΞάϥ΢ϯυͰͳ͍ͱ͖Ͱ΋ ಈ࡞Ͱ͖Δ w ϑΥΞάϥ΢ϯυͰͳ͍ͱݴͬͯ΋ɺ 4VTQFOEFEͱ͍͏ঢ়ଶ΍/PU3VOOJOHͱ ͍͏ঢ়ଶ΋ଘࡏͦ͠ͷঢ়ଶ͸ಈ࡞͠·ͤΜ w 4VTQFOEFE͸#BDLHSPVOEͱߦ͖དྷ͠·

    ͢
  31. όοΫάϥ΢ϯυ௨৴ॲཧ ʹؔ܎͢Δྺ࢙ͷ͓͞Β͍ ݹ͔͘Β͋ΔJ04࣌୅ͱJ04͔Βͷҧ͍

  32. J04࣌୅͔ΒͷόοΫάϥ΢ϯυ ॲཧԆ௕ w ༗ݶͳλεΫͷԆ௕ॲཧʢ&YFDVUJOH'OJUF-FOHUI5BTLTʣ ͱ͍͏ͷ͕͋Γ͜ͷॲཧ͸όοΫάϥ΢ϯυঢ়ଶͰॲཧΛߦ͏ w ௨৴͠Α͏ͱࢥ͑͹Ͱ͖Δ

  33. 88%$ ʢJ04Ќൃද౰࣌ʣ ͷਤΛݟͯΈΔ

  34. J04͔ΒJ04ͷόοΫάϥ΢ϯυ࣮ߦ 88%$8IBUTOFXNVMUJUBTLJOHΑΓ όοΫάϥ΢ϯυͰλεΫͷ ॲཧԆ௕͸࿈ଓ͍ͯͨ͠ ը໘ΛϩοΫͯ͠΋ J1IPOFΛεϦʔϓ͍ͯ͠ͳ͔ͬͨ όοςϦʔෛՙ͕ߴ͔ͬͨ

  35. J04Ҏ߱ͷόοΫάϥ΢ϯυ࣮ߦ 88%$8IBUTOFXNVMUJUBTLJOHΑΓ όοΫάϥ΢ϯυͰλεΫͷ ॲཧԆ௕͸ඈͼඈͼʹͳΔ ը໘ΛϩοΫ͢Δͱ J1IPOF͸4MFFQ͢Δ

  36. J04ͷ࣌ܥྻͰݟΔόοΫάϥ΢ϯυ௨৴ J04 J04 ʮ༗ݶλεΫͷॲཧԆ௕ʯͰ ෼͚ͩಈ࡞Մೳ ʮ༗ݶλεΫͷॲཧԆ௕ʯͰ ෼͚ͩಈ࡞Մೳ #BDLHSPVOE5SBOTGFS 4FSWJDF

  37. ͜͜·Ͱͷ·ͱΊ w J04͔ΒJ04͸෼ؒॲཧԆ௕Ͱ޷͖ʹͰ͖ͨ w σόΠε΁ͷෛՙ͕ܹ͍͠ w J04Ҏ߱͸ॲཧԆ௕Λ෼ʹ୹͘͠ݸผʹઐ༻ͷ"1*Λ࢖ ͏Α͏ʹͳͬͨ

  38. όοΫάϥ΢ϯυΞοϓ ϩʔυͷ࢓༷ʹ͍ͭͯ

  39. ؆୯ͳಛ௃ w Ξοϓϩʔυ͸J04্ͷΩϡʔʹੵ·Ε੍ޚ͞ΕΔ w ύϑΥʔϚϯε࠷దԽͷͨΊʹγεςϜͷ࠷ྑͰ εέδϡʔϦϯά͞ΕΔ w ࣦഊͨ͠ΒࣗಈϦτϥΠ͞ΕΔ

  40. "QQMF͕ఏ͍ࣔͯ͠ΔόοΫά ϥ΢ϯυ௨৴ͷ੍໿ʹ͍ͭͯ

  41. w /463-4FTTJPO͸ΫϩʔδϟͰͳ͘EFMFHBUFΛ࢖ ͏ w Ξοϓϩʔυ͢ΔϑΝΠϧ͸%BUBΫϥε͔ΒϑΝ Πϧͱͯ͠ग़ྗͯ͠ύεΛ౉͢ w όοΫάϥ΢ϯυ༻ʹͳΔ΂͘ϢχʔΫͳ*%Λ࡞੒ ͢Δ ੍໿

  42. ͳ͔ͥ

  43. ΞϓϦ J04 EFMFHBUFͱͯ͠Πϯελϯε౉͢ EFMFHBUFͷϝιουݺͼग़͠ σʔϞϯϓϩηε Ξοϓϩʔυ͢ΔϑΝΠϧ w ΞϓϦ͕όοΫάϥ΢ϯυͷঢ়ଶͰ΋ Ξοϓϩʔυ͢ΔͨΊɺJ04͸σʔϞϯ ϓϩηεʹ௨৴Λ೚ͤΔ

    ࢀߟ<ॻ੶>্Λ໨ࢦ͢ϓϩάϥϚʔͷͨΊͷJ1IPOFΞϓϦ։ൃςΫχοΫJ04ฤ w σʔϞϯ͸ϑΝΠϧύεʹΞΫηε ͦ͠ͷϑΝΠϧΛΞοϓϩʔυ͢Δ w ׬ྃ௨஌͸σʔϞϯ͕EFMFHBUFϝ ιουΛݺͼग़͢
  44. w ͓ͦΒ͘ɺJ04ͷϓϩηε͕௨৴Λࣝผ͢ΔͨΊ w ͦͷͨΊɺಉ͡*%Λෳ਺ಉ࣌ʹ࢖ͬͯ௨৴ͯ͠͸͍͚ͳ͍ w ௨৴͕ऴΘ͔ͬͯΒͦͷ*%Λ࢖͍·Θ͢ͷ͸໰୊ͳ͍ ʢͱࢥ͏ʣ όοΫάϥ΢ϯυ*%ΛҰҙʹ ܾΊΔඞཁ͕͋Δཧ༝

  45. ϓϩδΣΫτ΁ͷಋೖ

  46. ·ͣ͸͡Ίʹ όοΫάϥ΢ϯυͷίʔυྫ

  47. ओཁͳΫϥεͱEFMFHBUF w 63-3FRVFTU w 63-4FTTJPO w 63-4FTTJPO%FMFHBUF w 63-4FTTJPO$POpHVSBUJPO w

    63-4FTTJPO5BTL w 63-4FTTJPO%FMFHBUF
  48. /// - Parameter: /// - fileURL: Ξοϓϩʔυ͢ΔσʔλΛϩʔΧϧͰϑΝΠϧԽͨ͠URL /// - identifier:

    ϢχʔΫͳID func upload(fileURL: URL, identifier: String) { let config = URLSessionConfiguration.background(withIdentifier: identifier) let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) let request = makeRequest(with: fileURL) let task = session.uploadTask(with: request, fromFile: fileURL) task.resume() } // 1: URLSessionConfigurationΛ࡞੒ // 2: URLSessionΛ࡞੒ // 3: URLRequestΛ࡞੒(ϦΫΤετύϥϝʔλΛ૊ΈཱͯΔͨΊϚϧνύʔτͳURLRequestΛ࡞ͬͯฦ͢) // 4: URLSession͔ΒUploadTaskΛऔΓग़͢ʢΞοϓϩʔυ͢ΔϑΝΠϧͷ৔ॴ͕ඞཁʣ Ξοϓϩʔυͷखଓ͖
  49. /// Ξοϓϩʔυਐḿ࣌ʹݺͼग़͞ΕΔ func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent:

    Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { /// ΞοϓϩʔυࡁΈͷbyte਺ͰਐḿΛͱΔ… /// task͔ΒΩϟϯηϧͰ͖Δ… } /// Ξοϓϩʔυ׬ྃ࣌ʹݺͼग़͞ΕΔ func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { /// task͔ΒεςʔλείʔυΛऔΓग़ͨ͠Γ… /// ׬ྃॲཧ… } ݺͼग़͞ΕΔ%FMFHBUF
  50. ͜ΕͰόοΫάϥ΢ϯυͰ ΋ΞοϓϩʔυͰ͖·͢

  51. "QQMFͷαϯϓϧίʔυ w /463-4FTTJPOͰ#BDLHSPVOE5SBOTGFSʹΑ Δμ΢ϯϩʔυ w ը૾Λμ΢ϯϩʔυ͢ΔͷΈ w ͜ΕΛΞοϓϩʔυʹ࣮૷Λม͑ಈ࡞Λ֬ೝ͢ Δ w

    ௨৴ϥΠϒϥϦʹཔΒͳ͍΄͏͕ޙʑॿ͔Δʢޙ ड़ʣ 4JNQMF#BDLHSPVOE5SBOTGFS
  52. ໾ʹཱͭπʔϧ w /FUXPSL-JOL$POEJUJPOFSʢ௨৴ঢ়گΛѱ͘ग़དྷ Δʣ w $IBSMFTʢ1SPYZπʔϧʣ w 4XJGUZCFBWFSʢϩάϥΠϒϥϦʣ

  53. w .BDʹΠϯετʔϧ͢ΔϓϩΩγαʔόʔ $IBSMFT w J1IPOF୺຤ͱಉ͡8J'JͷNBDʹೖΕΔ w 8FC"1*ͷϦΫΤετΛΤϯυϙΠϯτͰ USFFදࣔͯ͘͠ΕΔ w ϦΫΤετ͕࣌ؒ࢒ΔͷͰαʔόʔଆʹ໰

    ͍߹ΘͤΔࡍʹҰؾʹָʹͳͬͨ w D63-ίϚϯυΛੜ੒Ͱ͖Δ
  54. w αʔόʹϩάΛૹͬͯͦΕΛઐ༻ͷ.BD BQQͰ֬ೝͰ͖Δˠ w ஗Ԇ͕͋ΔͷͰ͋·Γ໾ʹཱͨͳ͍ 4XJGUZ#FBWFS w όοΫάϥ΢ϯυʹೖΔλΠϛϯάΛϩά Ͱ֬ೝ w

    όοΫάϥ΢ϯυதͷಈ࡞ΛςΩετग़ྗ
  55. όοΫάϥ΢ϯυΞοϓϩʔυ ͸·ΓͲ͜Ζ

  56. όοΫάϥ΢ϯυಈ࡞࣌ͷ UJNFPVU*OUFSWBM'PS3FRVFTUͷ ͕࣌ؒมߋͰ͖ͳ͍ ఘΊͯΔ

  57. λΠϜΞ΢τؔ࿈ͷϓϩύςΟ w UJNFPVU*OUFSWBM'PS3FRVFTU w ϦΫΤετͷλΠϜΞ΢τɻ৽͍͠σʔλΛड ͚औΔͨͼʹϦηοτ͞ΕΔʢ෼͔ΓͮΒ͍ʣ w UJNFPVU*OUFSWBM'PS3FTPVSDF w Ϧιʔεʹର͢ΔλΠϜΞ΢τɻ͜ͷ࣌ؒͷؒϦ

    τϥΠΛ܁Γฦ͠ɺ͜ΕΛ௒͑ͯ௨৴ΛߦΘͳ͍
  58. UJNFPVU*OUFSWBM'PS3FRVFTUͬͯ͜͏͍͏͜ͱʁ ϦΫΤετ࣌ؒ αʔόͰͷॲཧ࣌ؒ Ϩεϙϯε ࣌ؒ όοΫάϥ΢ϯυ࣌ ඵ Ҏ಺͡Όͳ͍ͱ λΠϜΞ΢τʁ ϦΫΤετ

    UJNF
  59. UJNFPVU*OUFSWBM'PS3FTPVSDFͬͯ͜͏͍͏͜ͱ ϦτϥΠ ϦΫΤετ ϦτϥΠ λΠϜΞ΢τΛ௒͑Δͱ ϦτϥΠऴΘΓ UJNF

  60. ๬ΜͰͳ͍উखͳϦτϥΠ UJNFPVU*OUFSWBM'PS3FTPVSDFΛ୹ͯ͘͠ରԠ

  61. UJNFPVU*OUFSWBM'PS3FTPVSDF ͷσϑΥϧτ͸೔ؒ ௕͗͢

  62. J04͔Βͷ࿩

  63. w ௨৴ͷεέδϡʔϦϯά༻ͷ"1*͕૿͍͑ͯΔ w ௨৴؂ࢹࣗ͠ಈͰ։࢝Λ஗ΒͤͨΓ w όοΫάϥ΢ϯυ࣌ʹࢦఆͨ࣌ؒ͠Ҏ߱ʹ௨৴͢Δ 88%$"EWBODFTJO/FUXPSLJOH 1BSU

  64. ͍͞͝ʹ·ͱΊ w όοΫάϥ΢ϯυΞοϓϩʔυ͸J04͔Β͋ΔόοΫάϥ΢ϯυॲཧͷԆ ௕ͱࠞಉͦ͠͏ʹͳΔ͕ผ w ผϓϩηεͰಈ࡞͢ΔͷͰ9DPEFҎ֎ͷπʔϧ΋ઈର࢖ͬͨ΄͏͕͍͍ w ϦτϥΠपΓ͕ະͩʹṖͳͷͰ৘ใڞ༗͠·͠ΐ͏

  65. ͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ ౤ථͷఔΑΖ͓͘͠ئ͍͠·͢