Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アプリのアップデート浸透率を上げろ! 〜in-app updatesを実戦投入して見えてきたもの〜 / in-app updates DroidKaigi 2020

masaibar
February 20, 2020

アプリのアップデート浸透率を上げろ! 〜in-app updatesを実戦投入して見えてきたもの〜 / in-app updates DroidKaigi 2020

DroidKaigi2020 Day1 16:00~
「アプリのアップデート浸透率を上げろ! 〜in-app updatesを実戦投入して見えてきたもの〜」での発表資料です。
サンプルコード:https://github.com/masaibar/in-app-updates-sample
Flexibleアップデートデモ動画:https://www.youtube.com/watch?v=d8BiKvVvziM
Immediateアップデートデモ動画:https://www.youtube.com/watch?v=cvlzcYV__4s

のぞきみ:https://play.google.com/store/apps/details?id=com.masaibar.nozokimi
PayHolder:https://play.google.com/store/apps/details?id=com.masaibar.payholder

masaibar

February 20, 2020
Tweet

More Decks by masaibar

Other Decks in Technology

Transcript

  1. ΞϓϦͷΞοϓσʔτਁಁ཰Λ্͛Ζʂ ʙJOBQQVQEBUFTΛ࣮ઓ౤ೖͯ͠ݟ͖͑ͯͨ΋ͷʙ %SPJE,BJHJEBZ$BSETd !NBTBJCBS

  2. ࣗݾ঺հ 5XJUUFS!NBTBJCBS ॴଐɿגࣜձࣾάϩʔϏε (-0#*4ֶͼ์୊ͷ"OESPJEΤϯδχΞ ݸਓ։ൃɿͷ͖ͧΈ 1BZ)PMEFS΄͔

  3. (-0#*4ֶͼ์୊ɹ13 ɾάϩʔϏε͕ఏڙ͢ΔಈըֶशΞϓϦ ɾߨٛͱάϩʔϏε.#"γϦʔζ͕ϕʔε ɾίʔεͷಈը͕ఆֹͰݟ์୊

  4. ͜ͷηογϣϯͷΰʔϧ ɾJOBQQVQEBUFTͷશମ૾Λ೺Ѳ ɾಋೖ࣌ͷϋϚΓϙΠϯτ·Ͱཧղ ͜͜·Ͱ͕໨ඪ

  5. ͜ͷηογϣϯͷΰʔϧ ɾJOBQQVQEBUFTͷશମ૾Λ೺Ѳ ɾಋೖ࣌ͷϋϚΓϙΠϯτ·Ͱཧղ ͜͜·Ͱ͕໨ඪ ɾʮಋೖͯ͠ΈΑ͏͔ͳʯͱࢥͬͯ΋Β͑Δ

  6. ΞδΣϯμ ɾJOBQQVQEBUFTʹ͍ͭͯ ɾಋೖํ๏ ɾݕূํ๏ ɾ՝୊ͱϕετϓϥΫςΟε ɾಋೖͨ݁͠Ռ ɾ·ͱΊ

  7. JOBQQVQEBUFTʹ͍ͭͯ

  8. JOBQQVQEBUFTͱ͸ ɾετΞʹΞϓϦͷ৽όʔδϣϯ͕ଘࡏ͢Δࡍʹ ΞοϓσʔτΛଅ͠ɺͦͷ৔ͰΞοϓσʔτͰ͖Δ ɾ೥݄ͷ"OESPJE%FW4VNNJUͰൃද ɾݱࡏ͸'MFYJCMFͱ*NNFEJBUFͷछྨͷ69Λఏڙ

  9. 'MFYJCMF%FNP ˠ

  10. https://www.youtube.com/watch?v=d8BiKvVvziM

  11. *NNFEJBUF%FNP ˠ

  12. https://www.youtube.com/watch?v=cvlzcYV__4s

  13. Ξοϓσʔτૌٻࠓੲ

  14. Ξοϓσʔτૌٻࠓੲ ΞοϓσʔτૌٻΛ ɾݟͨ͜ͱ͕͋Δํ✋ ɾ࡞ͬͨ͜ͱ͕͋Δํ✋

  15. Ξοϓσʔτૌٻࠓੲ ਺͸গͳ͍͕໨ʹ͢Δ͜ͱ͸͋ͬͨɻ ྫʣ ڞ༗ΧϨϯμʔΞϓϦʮ5JNF5SFFʯ

  16. Ξοϓσʔτૌٻࠓੲ ਺͸গͳ͍͕໨ʹ͢Δ͜ͱ͸͋ͬͨɻ ྫʣ ڞ༗ΧϨϯμʔΞϓϦʮ5JNF5SFFʯ ɾΞοϓσʔτΛଅ͢μΠΞϩάΛදࣔ ɾΞοϓσʔτ͢ΔˠετΞʹભҠ

  17. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ Ϣʔβʔ΁ͷ௨஌ Ξοϓσʔτ

  18. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ Ξοϓσʔτ

  19. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ

  20. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

  21. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

    JOBQQVQEBUFT͋Δͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ Ϣʔβʔ΁ͷ௨஌ Ξοϓσʔτ
  22. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

    JOBQQVQEBUFT͋Δͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ 1MBZ4UPSFΞϓϦͱ࿈ಈ Ϣʔβʔ΁ͷ௨஌ Ξοϓσʔτ
  23. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

    JOBQQVQEBUFT͋Δͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ 1MBZ4UPSFΞϓϦͱ࿈ಈ Ϣʔβʔ΁ͷ௨஌ छྨͷ69 Ξοϓσʔτ
  24. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

    JOBQQVQEBUFT͋Δͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ 1MBZ4UPSFΞϓϦͱ࿈ಈ Ϣʔβʔ΁ͷ௨஌ छྨͷ69 Ξοϓσʔτ ͦͷ৔ͰͰ͖Δ
  25. Ξοϓσʔτૌٻࠓੲ JOBQQVQEBUFTͳ͍ͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ "1* 3FNPUF$POGJH Ϣʔβʔ΁ͷ௨஌ μΠΞϩά ϩʔΧϧ௨஌ Ξοϓσʔτ ετΞ΁ඈ͹͢

    JOBQQVQEBUFT͋Δͱ͖ Ξοϓσʔτ༗ແͷ֬ೝ 1MBZ4UPSFΞϓϦͱ࿈ಈ Ϣʔβʔ΁ͷ௨஌ छྨͷ69 Ξοϓσʔτ ͦͷ৔ͰͰ͖Δ
  26. छྨͷ69 'MFYJCMF *NNFEJBUF

  27. 'MFYJCMF

  28. 'MFYJCMF ग़య8FCMJPӳ࿨ࣙయ

  29. 'MFYJCMF ग़య8FCMJPӳ࿨ࣙయ

  30. 'MFYJCMF ɾμΠΞϩάܗࣜ ɾಉҙڋ൱ ɾ%-தʹ࢖༻Մೳ ɾ%-ޙͷ೚ҙͷ λΠϛϯάͰΞοϓσʔτ

  31. 'MFYJCMF ɾμΠΞϩάܗࣜ ɾಉҙڋ൱ ɾ%-தʹ࢖༻Մೳ ɾ%-ޙͷ೚ҙͷ λΠϛϯάͰΞοϓσʔτ

  32. 'MFYJCMF ɾμΠΞϩάܗࣜ ɾಉҙڋ൱ ɾ%-தʹ࢖༻Մೳ ɾ%-ޙͷ೚ҙͷ λΠϛϯάͰΞοϓσʔτ

  33. 'MFYJCMF ɾμΠΞϩάܗࣜ ɾಉҙڋ൱ ɾ%-தʹ࢖༻Մೳ ɾ%-ޙͷ೚ҙͷ λΠϛϯάͰΞοϓσʔτ ௨ৗ࣌ʹ͓͢͢Ίʂ

  34. *NNFEJBUF

  35. *NNFEJBUF ग़య8FCMJPӳ࿨ࣙయ

  36. *NNFEJBUF ग़య8FCMJPӳ࿨ࣙయ

  37. *NNFEJBUF ɾશը໘ܗࣜ ɾΞοϓσʔτҰ୒ ɾʢڋ൱΋Ͱ͖Δʣ ɾ%-தʹ࢖༻ෆՄ ɾ%-ऴΘͬͨΒࣗಈͰΞοϓσʔτ

  38. *NNFEJBUF ɾશը໘ܗࣜ ɾΞοϓσʔτҰ୒ ɾʢڋ൱΋Ͱ͖Δʣ ɾ%-தʹ࢖༻ෆՄ ɾ%-ऴΘͬͨΒࣗಈͰΞοϓσʔτ

  39. *NNFEJBUF ɾશը໘ܗࣜ ɾΞοϓσʔτҰ୒ ɾʢڋ൱΋Ͱ͖Δʣ ɾ%-தʹ࢖༻ෆՄ ɾ%-ऴΘͬͨΒࣗಈͰΞοϓσʔτ ڧ੍࣌ʹ͓͢͢Ίʂ

  40. छྨͷ69 'MFYJCMF ɾμΠΞϩάܗࣜ ɾಉҙڋ൱ ɾ%-தʹ࢖༻Մೳ ɾ೚ҙͷλΠϛϯάͰΞοϓσʔτ *NNFEJBUF ɾશը໘ܗࣜ ɾΞοϓσʔτҰ୒ 

    ɾʢڋ൱΋Մೳʣ ɾ%-தʹ࢖༻ෆՄ ɾ%-ऴΘͬͨΒΞοϓσʔτ
  41. JOBQQVQEBUFT ׬શʹཧղͨ͠

  42. Ͱ΋ɺ֎ग़ઌͩͱ ߋ৽ͯ͘͠Εͳ͍ͷͰ͸ʁ

  43. ҆৺͍ͯͩ͘͠͞

  44. None
  45. None
  46. None
  47. ඇ8J'J؀ڥͰͷڍಈ ද͕ࣔҟͳΔ ɾ઀ଓͨ͠ΒࣗಈͰ%-։࢝ ɾ։ൃ࣌͸๨Ε͕ͪ

  48. ಋೖํ๏

  49. શମ૾ ओཁػೳ͸ͭ ɾΞοϓσʔτ༗ແͷ֬ೝ  ɾ'MFYJCMF *NNFEJBUFڞʹ΄ͱΜͲڞ௨ ɾμ΢ϯϩʔυΞοϓσʔτ ɾ'MFYJCMF͸ϋϯυϦϯά͕ඞཁ ɾ*NNFEJBUF͸Ξοϓσʔτ·ͰҰ؏

  50. Ξοϓσʔτ༗ແͷ֬ೝ ετΞʹΞοϓσʔτ͕༗Δ͔Ͳ͏͔Λ֬ೝ ɾWFSTJPO$PEFͷେখͰൺֱ͍ͯ͠Δ ɾ಺෦ςετ൛τϥοΫͰେৎ෉ ɾ͜Ε୯ମͰ΋ར༻Մೳ

  51. μ΢ϯϩʔυΞοϓσʔτ ετΞʹભҠͤͣΞϓϦΛߋ৽͢ΔͨΊͷ69Λఏڙ 'MFYJCMF μ΢ϯϩʔυऴྃ࣌ʹϢʔβʔʹΞοϓσʔτ Λଅ͢ඞཁ͋Γ *NNFEJBUF μ΢ϯϩʔυऴྃޙଈΞοϓσʔτ·Ͱ࣮ߦ͞ΕΔ

  52. ػೳཁ݅ ɾ1MBZ$PSFMJCSBSZҎ্ ɾBBCͷ৔߹͸.#·Ͱ ɾ"OESPJE "1*Ϩϕϧ Ҏ্

  53. ࣮૷

  54. αϯϓϧίʔυ ϦϙδτϦ https://github.com/masaibar/in-app-updates-sample 'MFYJCMFΞοϓσʔτ࣮૷ࠩ෼ https://github.com/masaibar/in-app-updates-sample/pull/1 *NNFEJBUFΞοϓσʔτ࣮૷ࠩ෼ https://github.com/masaibar/in-app-updates-sample/pull/2

  55. CVJMEHSBEMF repositories { google() }

  56. BQQCVJMEHSBEMF dependencies { implementation 'com.google.android.material:material:1.2.0' implementation ‘com.google.android.play:core:1.8.0’ }

  57. BQQCVJMEHSBEMF dependencies { implementation 'com.google.android.material:material:1.2.0' implementation ‘com.google.android.play:core:1.8.0’ }

  58. ॳظԽ Ϧεφʔͷొ࿥ͱղআ

  59. ॳظԽϦεφʔͷొ࿥ͱղআ class MainActivity : AppCompatActivity(), InstallStateUpdatedListener { private lateinit var

    appUpdateManager: AppUpdateManager override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(this) } override fun onDestroy() { appUpdateManager.unregisterListener(this) super.onDestroy() } override fun onStateUpdate(state: InstallState) { } }
  60. ॳظԽϦεφʔͷొ࿥ͱղআ class MainActivity : AppCompatActivity(), InstallStateUpdatedListener { private lateinit var

    appUpdateManager: AppUpdateManager override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(this) } override fun onDestroy() { appUpdateManager.unregisterListener(this) super.onDestroy() } override fun onStateUpdate(state: InstallState) { } }
  61. ॳظԽϦεφʔͷొ࿥ͱղআ class MainActivity : AppCompatActivity(), InstallStateUpdatedListener { private lateinit var

    appUpdateManager: AppUpdateManager override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(this) } override fun onDestroy() { appUpdateManager.unregisterListener(this) super.onDestroy() } override fun onStateUpdate(state: InstallState) { } }
  62. ॳظԽϦεφʔͷొ࿥ͱղআ class MainActivity : AppCompatActivity(), InstallStateUpdatedListener { private lateinit var

    appUpdateManager: AppUpdateManager override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(this) } override fun onDestroy() { appUpdateManager.unregisterListener(this) super.onDestroy() } override fun onStateUpdate(state: InstallState) { } }
  63. ॳظԽϦεφʔͷొ࿥ͱղআ class MainActivity : AppCompatActivity(), InstallStateUpdatedListener { private lateinit var

    appUpdateManager: AppUpdateManager override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this) appUpdateManager.registerListener(this) } override fun onDestroy() { appUpdateManager.unregisterListener(this) super.onDestroy() } override fun onStateUpdate(state: InstallState) { } }
  64. Ξοϓσʔτ༗ແͷ֬ೝ

  65. Ξοϓσʔτ༗ແͷ֬ೝ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager.registerListener(this) appUpdateManager.appUpdateInfo.addOnSuccessListener {

    appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } } }
  66. Ξοϓσʔτ༗ແͷ֬ೝ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager.registerListener(this) appUpdateManager.appUpdateInfo.addOnSuccessListener {

    appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } } }
  67. Ξοϓσʔτ༗ແͷ֬ೝ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager.registerListener(this) appUpdateManager.appUpdateInfo.addOnSuccessListener {

    appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } } }
  68. Ξοϓσʔτ༗ແͷ֬ೝ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager.registerListener(this) appUpdateManager.appUpdateInfo.addOnSuccessListener {

    appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } } }
  69. ݹ͞ͷ֬ೝ ʢඇඞਢʣ

  70. ݹ͞ͷ֬ೝʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.clientVersionStalenessDays() != null && appUpdateInfo.clientVersionStalenessDays() >= DAYS_FOR_FLEXIBLE) && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } }
  71. ݹ͞ͷ֬ೝʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.clientVersionStalenessDays() != null && appUpdateInfo.clientVersionStalenessDays() >= DAYS_FOR_FLEXIBLE) && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } }
  72. ݹ͞ͷ֬ೝʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.clientVersionStalenessDays() != null && appUpdateInfo.clientVersionStalenessDays() >= DAYS_FOR_FLEXIBLE) && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } }
  73. ༏ઌ౓ͷ֬ೝ ʢඇඞਢʣ

  74. ༏ઌ౓ͷ֬ೝʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.updatePriority() >= HIGH_PRIORITY_UPDATE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } }
  75. appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.updatePriority()

    >= HIGH_PRIORITY_UPDATE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) { // FlexibleΞοϓσʔτΛ࣮ߦ͢Δ } } ༏ઌ౓ͷ֬ೝʢඇඞਢʣ
  76. ༏ઌ౓ͷ֬ೝʢඇඞਢʣ ɾ(PPHMF1MBZ%FWFMPQFS"1*ͰઃఆՄೳ ɾdͷ੔਺஋ʢσϑΥϧτʣ ӡ༻ྫʣ ɹɾ6*ͷϚΠφʔͳվળɿ-PX ɹɾύϑΥʔϚϯεͷվળɿ.FEJVN 'MFYJCMF  ɹɾॏཁͳηΩϡϦςΟߋ৽)JHI *NNFEJBUF

  77. μ΢ϯϩʔυ Ξοϓσʔτ

  78. 'MFYJCMFΞοϓσʔτ

  79. None
  80. 'MFYJCMF μΠΞϩάදࣔ

  81. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  82. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  83. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  84. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  85. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  86. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  87. 'MFYJCMFμΠΞϩάͷදࣔ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&

    appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_FLEXIBLE ) } }
  88. 'MFYJCMF ಉҙঢ়گͷϋϯυϦϯά

  89. 'MFYJCMFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_FLEXIBLE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  90. 'MFYJCMFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_FLEXIBLE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  91. 'MFYJCMFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_FLEXIBLE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  92. 'MFYJCMF ਐ௙ͷ؂ࢹ ʢඇඞਢʣ

  93. 'MFYJCMFਐ௙ͷ؂ࢹʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if(appUpdateInfo.installStatus() == InstallStatus.DOWNLOADING) { val

    bytesDownloaded = appUpdateInfo.bytesDownloaded() val totalBytesToDownload = appUpdateInfo.totalBytesToDownload() // ϓϩάϨεόʔͷදࣔͳͲ } }
  94. 'MFYJCMFਐ௙ͷ؂ࢹʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if(appUpdateInfo.installStatus() == InstallStatus.DOWNLOADING) { val

    bytesDownloaded = appUpdateInfo.bytesDownloaded() val totalBytesToDownload = appUpdateInfo.totalBytesToDownload() // ϓϩάϨεόʔͷදࣔͳͲ } }
  95. 'MFYJCMFਐ௙ͷ؂ࢹʢඇඞਢʣ appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if(appUpdateInfo.installStatus() == InstallStatus.DOWNLOADING) { val

    bytesDownloaded = appUpdateInfo.bytesDownloaded() val totalBytesToDownload = appUpdateInfo.totalBytesToDownload() // ϓϩάϨεόʔͷදࣔͳͲ } }
  96. 'MFYJCMF ׬ྃͷ؂ࢹͱ௨஌ྫ

  97. 'MFYJCMF׬ྃͷ؂ࢹͱ௨஌ྫ override fun onStateUpdate(state: InstallState?) { if (state?.installStatus() == InstallStatus.DOWNLOADED)

    { showDownloadedSnackbar() // SnackbarΛදࣔ͢Δ } } private fun showDownloadedSnackbar() { Snackbar.make( findViewById(R.id.layout_root), "ߋ৽͕μ΢ϯϩʔυ͞Ε·ͨ͠ɻ", Snackbar.LENGTH_INDEFINITE ).setAction("ߋ৽͢Δ") { appUpdateManager.completeUpdate() }.show() }
  98. 'MFYJCMF׬ྃͷ؂ࢹͱ௨஌ྫ override fun onStateUpdate(state: InstallState) { if (state?.installStatus() == InstallStatus.DOWNLOADED)

    { showDownloadedSnackbar() // SnackbarΛදࣔ͢Δ } } private fun showDownloadedSnackbar() { Snackbar.make( findViewById(R.id.layout_root), "ߋ৽͕μ΢ϯϩʔυ͞Ε·ͨ͠ɻ", Snackbar.LENGTH_INDEFINITE ).setAction("ߋ৽͢Δ") { appUpdateManager.completeUpdate() }.show() }
  99. 'MFYJCMF ෮ؼ࣌ͷϋϯυϦϯά

  100. 'MFYJCMF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { showDownloadedSnackbar() // SnackbarΛදࣔ͢Δ } } }
  101. 'MFYJCMF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { showDownloadedSnackbar() // SnackbarΛදࣔ͢Δ } } }
  102. 'MFYJCMF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { showDownloadedSnackbar() // SnackbarΛදࣔ͢Δ } } }
  103. *NNFEJBUFΞοϓσʔτ

  104. None
  105. *NNFEJBUF ը໘ͷදࣔ

  106. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  107. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  108. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  109. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  110. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  111. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  112. *NNFEJBUFը໘ͷදࣔ override fun onCreate(savedInstanceState: Bundle?) { … appUpdateManager = AppUpdateManagerFactory.create(this)

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) ) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  113. *NNFEJBUF ಉҙঢ়گͷϋϯυϦϯά

  114. *NNFEJBUFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_IMMEDIATE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ(དྷͳ͍Մೳੑ͋Γ) } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  115. *NNFEJBUFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_IMMEDIATE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ(དྷͳ͍Մೳੑ͋Γ) } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  116. *NNFEJBUFಉҙঢ়گͷϋϯυϦϯά override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

    super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_IMMEDIATE) { when (resultCode) { Activity.RESULT_OK -> { // ಉҙ(དྷͳ͍Մೳੑ͋Γ) } Activity.RESULT_CANCELED -> { // ڋ൱ɾΩϟϯηϧ } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { // ࣦഊ } } } }
  117. *NNFEJBUF ෮ؼ࣌ͷϋϯυϦϯά

  118. *NNFEJBUF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  119. *NNFEJBUF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  120. *NNFEJBUF෮ؼ࣌ͷϋϯυϦϯά μ΢ϯϩʔυதʹΞϓϦ͔Β཭ΕΔ͜ͱΛ૝ఆ override fun onResume() { super.onResume() appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo

    -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { appUpdateManager.startUpdateFlowForResult( appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_IMMEDIATE ) } } }
  121. αϯϓϧίʔυ ϦϙδτϦ https://github.com/masaibar/in-app-updates-sample 'MFYJCMFΞοϓσʔτ࣮૷ࠩ෼ https://github.com/masaibar/in-app-updates-sample/pull/1 *NNFEJBUFΞοϓσʔτ࣮૷ࠩ෼ https://github.com/masaibar/in-app-updates-sample/pull/2

  122. ݕূํ๏

  123. جຊతͳݕূํ๏

  124. جຊతͳݕূํ๏ ɾ(PPHMF1MBZ4UPSFʹ৽͍͠΋ͷΛΞοϓϩʔυ ɹɾ಺෦ςετ൛ެ։Ͱ΋Մ ɹɾಉҰύοέʔδ໊ɺಉҰॺ໊ͷඞཁ͕͋Δ

  125. ຖճΞοϓϩʔυ ໘౗͍͘͞

  126. Ξοϓσʔτ֬ೝ ετΞʹΞοϓσʔτ͕༗Δ͔Ͳ͏͔Λ֬ೝ ɾWFSTJPO$PEFͷେখͰൺֱ͍ͯ͠Δ ɾ಺෦ςετ൛τϥοΫͰେৎ෉ ɾ͜Ε୯ମͰ΋ར༻Մೳ

  127. Ξοϓσʔτ֬ೝ ετΞʹΞοϓσʔτ͕༗Δ͔Ͳ͏͔Λ֬ೝ ɾWFSTJPO$PEFͷେখͰൺֱ͍ͯ͠Δ ɾ಺෦ςετ൛τϥοΫͰେৎ෉ ɾ͜Ε୯ମͰ΋ར༻Մೳ

  128. ཁ͢ΔʹετΞʹ͋Δ΋ͷΑΓ΋ όʔδϣϯ͕௿͚Ε͹ྑ͍ͷͰ͸ʁ

  129. ݕূͰָΛ͢Δʢ˞BQLݶఆʣ ετΞʹ͋Δ΋ͷΑΓ΋όʔδϣϯ͕௿͚Ε͹ྑ͍ʁ ɾόʔδϣϯίʔυΛԼ͛ͨSFMFBTFϏϧυΛ BECJOTUBMM

  130. ݕূͰָΛ͢Δʢ˞BQLݶఆʣ ετΞʹ͋Δ΋ͷΑΓ΋όʔδϣϯ͕௿͚Ε͹ྑ͍ʁ ɾόʔδϣϯίʔυΛԼ͛ͨSFMFBTFϏϧυΛ BECJOTUBMM ɹˠҰ୴͸໰୊ͳ͘ಈ͖·ͨ͠ ɹʢ˞ಈ࡞Λอূ͢Δ΋ͷͰ͸͋Γ·ͤΜʣ

  131. ݕূ࣌ͷམͱ݀͠

  132. ݕূ࣌ͷམͱ݀͠ ɾΞοϓσʔτͳ͠ͱ൑ఆ͞Ε͕ͪ໰୊ ɾBBC஍ࠈ໰୊ ɾЌ൛ʹ͢Β൓ө͞Εͳ͍໰୊

  133. Ξοϓσʔτͳ͠ͱ൑ఆ͞Ε͕ͪ໰୊ ʲݪҼʳ (PPHMF1MBZ4UPSFΞϓϦ͔ΒݟͯɺΞϓϦͷߋ৽ ͕͋Δ͜ͱΛೝ஌Ͱ͖͍ͯͳ͍

  134. Ξοϓσʔτͳ͠ͱ൑ఆ͞Ε͕ͪ໰୊ ʲղܾํ๏ʳ ɾ಺෦ςετ൛ʹΞοϓϩʔυͨ͠ΒɺҰ౓ (PPHMF1MBZ4UPSFΞϓϦΛλεΫΩϧ͔ͯ͠Β ࠶ىಈ͠ʮϚΠΞϓϦˍήʔϜʯΛ։͘ ɾͦΕͰ΋ͩΊͳΒΩϟογϡΫϦΞ

  135. BBC஍ࠈ໰୊ ʲݪҼʳ ɾϩʔΧϧͰϏϧυ͢Δํ๏͕࢖͑ͳ͍ ɾॺ໊͕ετΞͱϩʔΧϧͰҟͳΔͨΊ ɾҰԠΞοϓσʔτ༗ແͷ֬ೝ·Ͱ͸ಈ͕͘ʜ

  136. BBC஍ࠈ໰୊ ʲղܾࡦʳ ɾ۪௚ʹΞοϓϩʔυͯ͠ݕূ͢Δ ɾόʔδϣϯίʔυΊͬͪΌ૿͑·͢

  137. BBC஍ࠈ໰୊ ʲղܾࡦʳ ɾ۪௚ʹΞοϓϩʔυͯ͠ݕূ͢Δ ɾόʔδϣϯίʔυΊͬͪΌ૿͑·͢ ʲΏΔืʳ ɾBBCͷॺ໊Λಉ͡ʹ͢Δํ๏Λ͝ଘ஌ͷํ✋

  138. Ќ൛ʹ͢Β൓ө͞Εͳ͍໰୊ ʲݪҼʳ ɾҰ෦ͷΞϓϦͷΈ ৹ࠪ׬ྃ·Ͱςετ൛ʹ ൓ө͞Εͳ͍ ɾBBC໰୊ͱֻ͚߹Θ͞ΔͱͲ͏͠Α͏΋ͳ͍

  139. Ќ൛ʹ͢Β൓ө͞Εͳ͍໰୊ ʲղܾࡦʳ ɾ(PPHMFͷํɺԿଔΑΖ͓͘͠ئ͍͠·͢

  140. ՝୊ͱϕετϓϥΫςΟε

  141. JOBQQVQEBUFT ୯ମͷ՝୊

  142. JOBQQVQEBUFT୯ମͷ՝୊ ɾ69ͷग़͠෼͚͕ग़དྷͳ͍ ɾϢʔβʔ͕ڋ൱ͨ͜͠ͱΛ௕ظهԱͰ͖ͳ͍ ɾ*NNFEJBUFͷڧ੍ྗ͕ͳ͍

  143. 69ͷग़͠෼͚͕ग़དྷͳ͍ ͦͷ··࣮૷͢ΔͱͲΕ͔ݻఆʹͳͬͯ͠·͏

  144. 69ͷग़͠෼͚͕ग़དྷͳ͍ ˠग़͠෼͚Λίϯτϩʔϧ͢Ε͹ྑ͍

  145. 69ͷग़͠෼͚͕ग़དྷͳ͍ ˠग़͠෼͚Λίϯτϩʔϧ͢Ε͹ྑ͍ ɾ(PPHMF1MBZ%FWFMPQFS"1*Ͱग़དྷΔ ʁ ˡ/FX

  146. 69ͷग़͠෼͚͕ग़དྷͳ͍ ˠग़͠෼͚Λίϯτϩʔϧ͢Ε͹ྑ͍ ɾ(PPHMF1MBZ%FWFMPQFS"1*Ͱग़དྷΔ ʁ ˡ/FX ɾ3FNPUF$POGJHʹཔΔͷ͕ίεύྑ͍ ɾฐࣾͰ͸'MFYJCMF *NNFEJBUF /POF ɾ΋ͬͱࡉ͔͘΍ΔͳΒKTPOͰόʔδϣϯຖ੍ޚ

    ɾ൓өपظ͕௕͘ͳΔͷ͕೉఺
  147. Ϣʔβʔ͕ڋ൱ͨ͜͠ͱΛ௕ظهԱͰ͖ͳ͍ ΞοϓσʔτΛΩϟϯηϧͯ͠΋PO$SFBUFͷͨͼʹ μΠΞϩά͕ग़ͯ͘Δ

  148. Ϣʔβʔ͕ڋ൱ͨ͜͠ͱΛ௕ظهԱͰ͖ͳ͍ ˠ4IBSFE1SFGFSFODFTͳͲͰڋ൱ͨ࣌ؒ͠ΛهԱ

  149. Ϣʔβʔ͕ڋ൱ͨ͜͠ͱΛ௕ظهԱͰ͖ͳ͍ ˠ4IBSFE1SFGFSFODFTͳͲͰڋ൱ͨ࣌ؒ͠ΛهԱ ɾҰఆ࣌ؒҎ্ܦա͔ͨ͠൱͔ͰϋϯυϦϯά ɾͨͩ͠ϋϯυϦϯά͸'MFYJCMFݶఆ ɾ*NNFEJBUF͸ຖճग़͢΂͖͔ͱ⚠

  150. *NNFEJBUFͷڧ੍ྗ͕ͳ͍ ӈ্ͷ✕Ϙλϯ΍όοΫΩʔͰด͡ΒΕͯ͠·͏

  151. *NNFEJBUFͷڧ੍ྗ͕ͳ͍ ˠը໘͕ด͡ΒΕͨ͜ͱΛݕ஌͢Δ ɾPO"DUJWJUZ3FTVMUͰϋϯυϦϯά ɾ*NNFEJBUF͔ͭ3&46-5@$"/$&- ͩͬͨͱ͖ΞϓϦΛڧ੍ऴྃ ɾऴྃ࣌ʹ5PBTUͰ఻͑ΔͱΑΓ਌੾

  152. ಋೖͨ݁͠Ռ

  153. ࣮ݧ಺༰ #FGPSF ɾJOBQQVQEBUFTΛಋೖ͍ͯ͠ͳ͍ΞϓϦ ɾैདྷͲ͓ΓͷΞοϓσʔτ "GUFS ɾJOBQQVQEBUFTΛಋೖͨ͠ΞϓϦ ɾ'MFYJCMFΛ༗ޮԽͨ͠ঢ়ଶͰͷΞοϓσʔτ

  154. None
  155. None
  156. None
  157. ಋೖͨ݁͠Ռ #FGPSF िؒܦա࣌఺Ͱ ɹɾ௚ۙͷݹ͍όʔδϣϯ͕d ɹɾ࠷৽όʔδϣϯ͕લޙ ɹɾ͔͜͜Β͡Θ͡Θ্͕Δ "GUFS िؒܦա࣌఺Ͱ

  158. None
  159. ಋೖͨ݁͠Ռ #FGPSF िؒܦա࣌఺Ͱ ɹɾ௚ۙͷݹ͍όʔδϣϯ͕d ɹɾ࠷৽όʔδϣϯ͕લޙ ɹɾ͔͜͜Β͡Θ͡Θ্͕Δ "GUFS िؒܦա࣌఺Ͱ ɹɾ௚ۙͷݹ͍όʔδϣϯ͕d ɹɾ࠷৽όʔδϣϯ͸લޙ

    ɹɾݹ͍όʔδϣϯ͕ݮ͚ͬͨͩ
  160. ࠷৽൛ͷׂ߹͕ िؒ࣌఺ͰΞοϓ

  161. ߟ࡯ ɾࣗಈΞοϓσʔτͷਓͷׂ߹͕૬౰ߴ͍ ˠ࢒ΓͷׂʢഽײͰ͢ʣʹରͯ͠ޮ͍ͯ͘Δ  ɾಋೖલͷաڈόʔδϣϯ͸Ͳ͏ͯ͠΋࢒Γ͕ͪ ˠ͕࣌ؒ͋ͬͨΒૣΊʹೖΕ͓͍ͯͨ΄͏͕٢

  162. ·ͱΊ

  163. ·ͱΊ ɾJOBQQVQEBUFTΛ࢖͏ͱΞοϓσʔτૌٻ͕؆୯ʹ࣮૷Ͱ͖Δ ɾ3FNPUF$POGJHͱ૊Έ߹ΘͤΔͱίεύ͕ྑ͍ ɾ௨ৗ࣌͸'MFYJCMF ɾڧ੍࣌͸*NNFEJBUFʢڋ൱࣌ͷϋϯυϦϯά๨Εͣʹ⚠ ʣ ɾಋೖ͕ૣ͚Ε͹ૣ͍΄Ͳޮ͍ͯ͘Δ ɾJOBQQVQEBUFT͸ྑ͍ͧʂ