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

Mac1台でアプリを作る時代再び

73e80d16abc7cc65e08d430c2eae811b?s=47 taminif
November 09, 2017

 Mac1台でアプリを作る時代再び

Osaka Mix Leap Study #1 - Android / iOSで発表した資料です。

73e80d16abc7cc65e08d430c2eae811b?s=128

taminif

November 09, 2017
Tweet

Transcript

  1. Mac1୆Ͱ ΞϓϦΛ࡞Δ࣌୅࠶ͼ Osaka Mix Leap Study #1 - Android /

    iOS 2017/11/09 େౡ ޫو@sbntaminif
  2. ࣗݾ঺հ • ΢ΣϒϦΦגࣜձࣾWEBΤϯδχΞ + ϓϩμΫτ Ϛωʔδϟʔ • ฏ೔͸WEBΞϓϦɺٳ೔͸iOSΞϓϦΛ΍ͬͯ·͢ • WebRTC

    Meetup Osakaओ࠵ • ීஈ͸ژ౎Ͱಇ͍͍ͯ·͢
  3. http://ejje.weblio.jp/content/ios

  4. iOSDC 2017Ͱొஃ͖ͯ͠·ͨ͠ ຊ೔͸಺༰ͪΐͬͱඃͬͯ·͢ https://speakerdeck.com/taminif/ ying-hui-hua-sabisufalsetamenikai- fa-sitabideotiyatutoapurifalseji-shu

  5. λΠτϧʹʮ࣌୅ʯͱ͋ΔͷͰ ·ͣ͸ྺ࢙

  6. ΞϓϦ։ൃͷྺ࢙
 ʢݸਓͷओ؍Ͱ͢ʣ • γϯϓϧͳҰػೳΞϓϦ • ίϯγϡʔϚʔҠ২ͷΑ͏ͳങ͍੾ΓܕΞϓϦ • αʔόʔͱͷ࿈ܞΛඞཁͱ͍ͯ͠ΔΞϓϦ ϝϞ΍ి୎ γϯϓϧͳήʔϜ

    ιγϟή ϘʔυήʔϜ౳ͷରઓܕ Ϋϥ΢υܥ
  7. ࠓ͸ͱʹ͔͘αʔόʔͱͷ ࿈ܞ͕ඞཁ ͦͷͨΊʹ͸αʔόʔΛ ༻ҙ͢Δඞཁ͕͋Δ

  8. αʔόʔ͕͍Δʂ

  9. αʔόʔΛ༻ҙ͢Δͷ͸ ΞϓϦ։ൃऀʹͱَͬͯ໳

  10. ͦ͜ͰɺαʔόʔϨε

  11. ͦ͜ͰɺFirebase • Firebase͸Google͕ఏڙ͢ΔmBaaS • iOS, Android, ΢ΣϒͰ΋࢖༻Մೳ • ։ൃΛॿ͚Δଟ͘ͷػೳ͕͋Γ·͢ɻ

  12. ͦ͜ͰɺFirebase • ࣗ෼ͰαʔόʔΛ༻ҙ͢ΔΑΓ΋҆Ձ • Ұఆͷ௨৴·Ͱ͸ແྉͰ࢖͑Δ • Google͕ӡӦ͢Δ͚ͩ͋ͬͯ΄ͱΜͲམ ͪͳ͍ • ೖΕΔ͚ͩͰଟ͘ͷػೳΛΧόʔ͢Δ

  13. ଟ͘ͷΞϓϦ։ൃऀ͕ ஫໨͍ͯ͠Δʂʂ

  14. FirebaseΛΞϓϦʹ ૊ΈࠐΜͰΈΑ͏

  15. ͜͜Ͱ͸ɺνϟοτΞϓϦ Λྫʹߟ͑ͯΈ·͢

  16. ͦͷલʹɾɾɾ FirebaseΛΞϓϦʹ૊Έࠐ Ή͜ͱͰԿ͕࣮ݱͰ͖Δ͔

  17. ͜͏ͳΔ • Կ΋͠ͳͯ͘΋Analytics͕૊Έࠐ·ΕΔ • CrashϩάΛݟΔ͜ͱ͕Ͱ͖Δ • ϓογϡ௨஌ΛૹΔ͜ͱ͕Ͱ͖Δ • NEW! A/BςετΛߦ͏͜ͱ͕Ͱ͖Δ

  18. શͯΛ஌Γ͍ͨํ͸ ԼهURL΁ https://firebase.google.com/products/?hl=ja

  19. νϟοτΞϓϦʹ͸
 Realtime Database • Ϋϥ΢υͰϗεςΟϯά͞ΕΔDB • JSONͰอଘ͞ΕɺπϦʔߏ଄Ͱߏங • શͯͷΫϥΠΞϯτͰಉظ͞ΕΔ •

    ΦϑϥΠϯ/ΦϯϥΠϯͷ੾Γସ͑΋ରԠ
  20. Realtime DatabaseΛ࢖ͬ ͯνϟοτΛ࣮૷

  21. Realtime Databaseͷ࢓૊Έ 'JSFCBTFαʔό ᶄ3FBMUJNF%BUBCBTFʹ ॻ͖ࠐΈ ᶅॻ͖ࠐ·Εͨ಺༰Λ ௨஌ ᶃࢦఆͨ͠ύεΛ؂ ࢹ͢ΔΑ͏ઃఆ

  22. νϟοτͷ࣮ݱ ,FZ7BMVFͰ஋Λอଘ औಘ͢Δࡍ͸+40/ܗ ࣜͰऔಘͰ͖Δ ҰͭͷϊʔυͰҰͭͷνϟοτΛ ࣮ݱ͍ͯ͠Δ ࣌ܥྻॱʹฒ΂Δ͜ͱͰνϟοτͬΆ͘ දࣔ

  23. Realtime Database let withBlock = { (snapshot: FIRDataSnapshot) in //

    received chat data if let dictionary = snapshot.value as? [String : AnyObject] { guard let isRoleProf = dictionary["is_role_prof"] as? Bool, let timeMsec = dictionary["time_msec"] as? UInt64, let senderIdString = dictionary["sender_id"] as? String, let senderId = Int(senderIdString), let text = dictionary["text"] as? String else { return } let time:Double = Double(timeMsec) / 1000 } var data:ChatDataStruct if isRoleProf { // prof data = ChatDataStruct(messageSender: .YOU, message: text, displayTime: self.displayTimeFormatter.string(from: Date(timeIntervalSince1970: time))) } else { // member data = ChatDataStruct(messageSender: .ME, message: text, displayTime: self.displayTimeFormatter.string(from: Date(timeIntervalSince1970: time))) } self.chatTableReload(data: data) } firebaseChatObserveHandle = firebaseUserReference.child(`Firebaseͷύε `).observe(.childAdded, with: withBlock) ௥ՃࣜͰ0CTFSWFS ηοτ 'JSFCBTF͔Βϊʔ υΛड͚औͬͨ࣌ ͷॲཧΛఆٛ
  24. ͪΐͬͱ୤ઢ

  25. νϟοτػೳ͸WebRTCΛ ࢖ͬͯ΋࣮ݱͰ͖·͢ WebRTCͱ͸ɾɾɾ • W3C͕ఏএ͢ΔP2PϦΞϧλΠϜίϛϡχέʔ γϣϯΛ࣮ݱ͢Δٕज़ • ϓϥάΠϯͳ͠Ͱϒϥ΢βؒͷ΍ΓͱΓ͕Մೳ • ςΩετ΍όΠφϦͳͲͷσʔλܗࣜ΍ө૾΍

    Ի੠ͳͲͷStreamܗࣜͷ΍ΓͱΓ͕Մೳ
  26. WebRTCͷ࢓૊Έ ᶅ௨৴ʂ 456/563/ ʢதܧʣαʔό γάφϦϯά αʔό ᶃ ᶄ ᶄ ᶃ

  27. ͪ͜Β΋ɺαʔυύʔςΟ͕ ͋ΔͷͰແྉͰ࣮૷Ͱ͖·͢

  28. ͡Ό͋ɺͲͬͪΛ࢖͑͹ ྑ͍ͷʁ

  29. 3ͭͷ؍఺Ͱબ୒͢Δͷ͕ྑ͍ • MVP • νϟοτҎ֎ͷ෇ՃՁ஋ • ͍ͣΕαʔϏε֦େͨ͠৔߹ͷ
 ίετύϑΥʔϚϯε

  30. MVP • Minimum Viable Product • ϦʔϯελʔτΞοϓΛ࣮ߦ͢Δͨ Ίͷखஈ • ελʔτΞοϓʹ͔ܽͤͳ͍ߟ͑ํ

    • ࣗ෼ʹͱͬͯ࠷খݶͷίετͰʂ
  31. νϟοτҎ֎ͷ෇ՃՁ஋ • Firebase͸આ໌ͨ͠௨Γ • WebRTCͩͱϏσΦνϟοτ΋࣮૷ Ͱ͖Δ • ଞʹ͚͍ͭͨػೳ౳Ͱߟ͑Δʂ

  32. αʔϏε֦େ࣌ • ͲͪΒ΋࢖༻ྔ͕૿͑Δͱ͓͕͔ۚ ͔Δ • ࢖༻ਓ਺΍μ΢ϯϩʔυྔͳͲ • Ͳ͜·Ͱ࢖͑͹͓͕͔͔ۚΔ͔Λܭ ࢉ͠Α͏ʂ

  33. ·ͱΊ

  34. ·ͱΊ • Firebaseྑ͍Αʂ • ͱʹ͔͘Կ͔࡞Ζ͏ʂ • WebRTC΋ྑ͍Αʂ • େࡕͰMeetup։࠵ͯ͠Δ͔ΒདྷͯͶʂ

  35. ྑ͍αʔϏεͰɺྑ͍ਓੜΛ

  36. ͋Γ͕ͱ͏͍͟͝·ͨ͠