iOS エンジニアが Xamarin を始めた話
第2回 Japan Xamarin User Group Conference 西日本編 https://jxug.connpass.com/event/166449/
iOS ΤϯδχΞ͕Xamarin Λ࢝ΊͨӉࠤݟ ެี
View Slide
About Me4 Ӊࠤݟެีʢtwitter : @usamik26ʣ4 ϑΣϯϦϧגࣜձࣾ ڞಉ։ൃ෦4 iOS ΞϓϦ։ൃ4 ϓϥΠϕʔτ4 OS X ΞϓϦ։ൃ : CotEditorʢςΩετΤσΟλʣ
Xamarin ྺ4 ΄Ͳલ͔Β։࢝4 ࣾʹ࣮ܦݧ͕͋Δৄ͍͠ਓ͕طʹԿਓ͔͍ͨ4 ࣮Ͱ Xamarin + MvvmCross Λ༻4 MvvmCross github ʹ pull request Λૹͬͨ͜ͱ
ͳͥ Xamarin ΛΖ͏ͱࢥ͔ͬͨ
C# ͕͑Δʁ4 εϚϗΞϓϦ։ൃ͕ C# ͰͰ͖Δ4 ɾɾɾ͜Εʹແؔ4 iOS ΞϓϦ։ൃͰ͖Δ4 C# / .NET ͋·ΓΒͳ͍
ΫϩεϓϥοτϑΥʔϜ։ൃ4 iOS / Android ΞϓϦ։ൃ͕ڞ௨ԽͰ͖Δ4 ͜Εେ͖ͳϝϦοτ4 ্࣮ɺ྆ํͷΞϓϦ։ൃ͕ฒߦͯ͠ߦΘΕΔ͜ͱଟ͍4 iOS ΞϓϦ։ൃऀͱ Android ΞϓϦ։ൃऀͱͰɺΞϓϦͷ༷ೝࣝҧ͍Λ͙ͷҊ֎͍ͨΜ
ଞͷπʔϧͱͷൺֱ (1)4 ଞͷπʔϧͰɺ֤ϓϥοτϑΥʔϜ։ൃͷྑ͞Λੜ͔ͤͳ͍͜ͱ͕ଟ͍4 Xamarin ωΠςΟϒ SDK Λੜ͔͍ͯ͠Δ4 ͞Βʹ࠷৽ڥͷରԠૣ͍
ଞͷπʔϧͱͷൺֱ (2)4 ଞͷπʔϧͰɺϓϥοτϑΥʔϜʹ͋ΘͤͨڍಈΛͤ͞Δͷ͕Ҋ֎͍͠4 iOS ΞϓϦ͕ Android ΞϓϦͬΆ͍ಈ͖Λͨ͠ΓɺAndroid ΞϓϦ͕ iOS ΞϓϦͬΆ͍ಈ͖Λͨ͠Γ͢Δͷෆࣗવ
MVVM4 εϚϗΞϓϦ։ൃ͕ MVVM ͰͰ͖Δ4 ݸਓతʹܾఆଧͱͳͬͨͷ͜ͷ4 iOS ΞϓϦ։ൃͰ ReactiveCocoa Λ͏ͱ͍͏બ͕͋Δ͕ɺ·ͩϓϥΫςΟεཱ͕֬͞Ε͍ͯͳ͍ײ͡4 C# / .NET จԽݍͰ͔ͭͪΘΕ͖ͯͨઃܭख๏͔ͩΒɺXamarin ૬ੑ͕Α͍
݁ہɺXamarin Λ࢝Ίͨཧ༝ɾɾɾ4 MVVM Ͱ։ൃͰ͖Δ4 ϏϡʔͱϩδοΫͷ4 ΫϩεϓϥοτϑΥʔϜ։ൃͱͷੑ
վΊͯ MVVM
MVVM (Model - View - ViewModel)4 View ϓϥοτϑΥʔϜґଘ4 View ͱ ViewModel Binding Ͱ࿈ܞ4 ViewModel / Model ͕ϩδοΫ෦ɺϓϥοτϑΥʔϜඇґଘ
MVVM ͱϓϥοτϑΥʔϜͷؔ4 C# / .NET จԽݍͰ͔ͭͪΘΕ͖ͯͨ4 ॳओʹ Windows ϓϥοτϑΥʔϜ্ͷΈͰΘΕ͍ͯͨʁ4 ͔͠͠ɺViewModel ΛϓϥοτϑΥʔϜඇґଘʹͰ͖ΔͨΊɺΫϩεϓϥοτϑΥʔϜ։ൃͱ૬ੑ͕Α͍
MVVM ͱεϚϗϓϥοτϑΥʔϜ4 View Λ֤ϓϥοτϑΥʔϜͰ։ൃ͢Δ4 ͜ͷͨΊɺ֤ϓϥοτϑΥʔϜͷੈք؍Λେࣄʹ͢Δ͜ͱ͕Ͱ͖Δ4 iOS Β͠͞ɺAndroid Β͠͞େࣄ4 ΫϩεϓϥοτϑΥʔϜ։ൃͰͦ͜ MVVM ͷྑ͕͞ੜ͖ΔͷͰɺͱউखʹࢥ͍ͬͯΔ
࣮ࡍʹ Xamarin.iOS ΛͬͯΈΔ
·ͣ࠷ॳʹ4 C# Θ͔Βͳ͍4 ৮ͬͨ͜ͱ͚͋ͬͨͲ C# 1.0 / 2.0 ͘Β͍4 ͱΓ͋͑ͣجຊతͳจ๏Λ͞Βͬͱݟͯɺ͋ͱ࣮ͱฒߦͰษڧ
C# ʹ׳Εͯ͘Δͱ4 ݴޠ͕ҧ͏͚ͩͰࠜͬ͜ͷϑϨʔϜϫʔΫಉ͡4 ϑϨʔϜϫʔΫؔ࿈͜Ε·Ͱͷ͕ࣝ΄΅ͦͷ··௨༻͢Δ4 ίʔυ͕ॻ͖͍͢͜ͱʹؾͮ͘4 ݸਓతʹϥϜμࣜͱ͔ LINQ ͱ͔͖
Α͘Δϛε4 Xamarin Studio ্Ͱ Objective-C ͷίʔυΛॻ͍ͯ͠·͏4 [UIImage ima ͘Β͍·Ͱॻ͍ͯɺ͋Εิ͞Εͳ͍ͳ͋ɺͱ͔4 ϝιου໊͕Θ͔Βͳ͘ͳΔ4 ໋໊نଇ͕ Objective-C ෩ͱ C# ෩Ͱҧ͍ͬͯΔ
Α͘Δϛεͷٯύλʔϯ4 ׳Εͯ͘ΔͱٯύλʔϯΒ͔ͨ͠4 Xcode ্Ͱ UIImage image = ͱ͔ॻ͍͍ͯͯɺͳΜͰϏϧυΤϥʔͳͷ͔ͳ͋ɺͱ͔ʢΞελϦεΫΛΕΔʣ
υΩϡϝϯτʁ4 MonoDoc ͷυΩϡϝϯτ͕ͪΐͬͱใෆʁ4 ରԠ͢Δϝιουͷ Xcode υΩϡϝϯτΛࢀরͨ͠Γ4 Xamarin ͷαΠτʹ͍Ζ͍ΖυΩϡϝϯτ͕͋ͬͨ
ศརΫϥε4 UITableViewSource4 UITableViewDataSource ͱ UITableViewDelegate ͷ౷߹4 ͍ͭ͜Β͍͍ͩͨ͋Θͤͯ͏͜ͱ͕ଟ͍ͷͰͪΐͬͱָʹͳΔ4 UICollectionViewSource ͋Δ
Storyboard4 ໊લೖΕΔ͚ͩͰউखʹϓϩύςΟՃͯ͘͠ΕΔͱ͔ศར4 μϒϧΫϦοΫͰΞΫγϣϯੜͰ͖Δͱ͔ศར4 Xcode ʹ͜͏͍͏ͷͳ͔ͬͨͳɾɾɾ
AutoLayout4 Constraint ͷՃͷํ͕ͪΐͬͱҧ͏4 ׳ΕΔͱָ4 Constraint μϒϧΫϦοΫͰฤूͰ͖Δ
API 100% ରԠ4 AVFoundation ͱ͔͍͍ͨΜ͚ͩͲɾɾɾ4 ͱࢥͬͨΒɺԿʹߟ͑ͳͯ͑ͨ͘using MonoTouch.AVFoundation;var session = new AVCaptureSession();...
MVVM ͷಋೖ
MvvmCross4 Γํ͍Ζ͍Ζ͋Δ͚Ͳɺ୲ϓϩδΣΫτͰMvvmCross Λ࠾༻4 ࣾʹઌۦऀ͕ଟ͍4 ΦʔϓϯιʔεͳͷͰͳΜͳΒमਖ਼͢Δʢ࣮ࡍͨ͠ʣ
͜Ε࠷ॳʹ4 MVVM Θ͔Βͳ͍4 ࣮ࡍʹίʔυॻ͍ͯΈΔͱ࠷ॳҊ֎ॻ͚ͳͯ͘ͱ·Ͳ͏4 ͳΜ͔खറΒΕͯΔײ͕͋Δ
MVVM ʹ׳Εͯ͘Δͱ4 ٯʹͳΜͰ MVVM ʹͨ͘͠ͳΔ4 Xamarin ͳ͠Ͱ iOS ΞϓϦʁͩͬͨΒ ReactiveCocoa ͓͏͔ʁ
ศརΫϥε4 Binding Λָʹͯ͘͠ΕΔ4 MvxTableViewCell4 MvxImageView4 URL ͨ͠Βউखʹը૾औಘͯ͘͠ΕΔͱ͔
MvvmCross ϓϩδΣΫτߏ4 Core ϓϩδΣΫτ : Model / ViewModel4 Touch ϓϩδΣΫτ : iOS View4 Droid ϓϩδΣΫτ : Android View
Α͘Δʢʁʣϛε4 MonoTouch ͷΫϥε͕͑ͳ͍ɺͱࢥͬͨΒ ViewModelͩͬͨ4 ViewModel : Core ϓϩδΣΫτ4 View : Touch ϓϩδΣΫτ
Α͘Δʢʁʣϛε (2)4 View ʹ͕Γ͕Γ࣮ͯ͠͠·͏ɾɾɾ4 ςϯύ͖ͬͯͨͱ͖ʹΒ͔͢4 MVVM ͷྑ͞Λແ͠ʹ͢Δ
ϓϥάΠϯ4 ϓϥοτϑΥʔϜґଘͷػೳΛ ViewModel ͔Β͍͍ͨ4 ΠϯλʔϑΣʔεఆٛ Core ϓϩδΣΫτ4 ࣮ Touch ϓϩδΣΫτ
ϓϥάΠϯͷΑ͋͠͠4 ਖ਼Θ͟Θ͟ϓϥάΠϯԽ͢Δͷ໘͍͘͞4 ͚ͩͲͦ͏͠ͳ͍ͱ View ʹ͕Γ͕Γॻ͘͜ͱʹͳΔ4 Ұॻ͍ͯ͠·͖͑ͬ͢Γͨ͠ίʔυ͕ॻ͚Δ
ݒ೦4 64ϏοτରԠɾɾɾʁ4 Xamarin ͷ Unified ͷΈʹ MvvmCross ͕ରԠͯ͘͠Εͳ͍ͱͭΒ͍4 Forms ʹҠߦͨ͠΄͏͕͍͍ͷʁ4 Forms Ͱ iOS / Android ͦΕͧΕͷੈք؍ΛେࣄʹͰ͖ΔͳΒ
·ͱΊ
·ͱΊ4 Xamarin Ͱ C# / MVVM Ͱ iOS ΞϓϦ࡞Δͷؾ࣋ͪΑ͘ͳ͖ͬͯͨ4 ͍·ઈࢍ Xamarin Ҋ͍݅͠ͷͰࢮͳͳ͍ఔʹ͕ΜΔ