Slide 1

Slide 1 text

Xamarin.AndroidͰ࢝ΊΔ
 ΫϩεϓϥοτϑΥʔϜ
 ϞόΠϧΞϓϦ։ൃ 2017.4.8 Xamarin ษڧձ in ໊ݹ԰ with JXUGֶੜࢧ෦, MSP @amay077

Slide 2

Slide 2 text

About me • Ԟࢁ ༟ਈ - @amay077ʢ͋Ί͍ʣ • ۀ຿ܥϓϩάϥϚ+α • Ѫ஌ݝࡏॅͷϑϧϦϞʔτϫʔΧʔ • ஍ཧ৘ใγεςϜɺҐஔ৘ใϓϩάϥϛϯά • Android, iOS, Xamarin, Java, C#, Salesforce

Slide 3

Slide 3 text

Work for • B2B޲͚PaaSɺ૔ݿ؅ཧɾӡૹۀ޲͚SaaS • AWS, Elasticsearch, Cassandra, Lambda, etc • શһ͕ϑϧϦϞʔτϫʔΧʔ ͓࢓ࣄ಺༰΍ϦϞʔτͰͷಇ͖ํͳͲڵຯ͋Δํɺؾܰʹฉ͍͍ͯͩ͘͞

Slide 4

Slide 4 text

Target • Androidॳʙதڃऀ • iOSΞϓϦ΋։ൃͯ͠Δʗͦ͠͏ͳਓ • Xamarinͬͯฉ͍ͨ͜ͱ͋Δ͚Ͳ࣮ࡍԿͳͷʁ ͱࢥͬͯΔਓ • .NETܥͷ։ൃ͸͋·Γͨ͠ࣄ͕ͳ͍ਓ

Slide 5

Slide 5 text

Agenda 1. Xamarinͱ͸ʁ 2. ௨ৗͷAndroid։ൃͱͷҧ͍ 3. C#ͷར఺ 4. X-PlatΞϓϦ։ൃͱίʔυͷڞ༗ 5. Xamarinͷ࢖͍Ͳ͜Ζ

Slide 6

Slide 6 text

Xamarinͱ͸ʁ ⏰ 45

Slide 7

Slide 7 text

Xamarinͱ͸ʁ /&5ϑϨʔϜϫʔΫʢ.POPʣ 9BNBSJO"OESPJE 9BNBSJOJ04 9BNBSJO .BD 9BNBSJO'PSNT Mono(.NETϑϨʔϜϫʔΫͷOSS࣮૷)Λ ج൫ͱͨ͠։ൃπʔϧΩοτ܈

Slide 8

Slide 8 text

Xamarin.Androidͱ͸ʁ • C#͔ΒAndroid API, Java API͕ݺͼग़ͤΔ ʮബ͍ϥούʔʯ • Activity, Intent, ϦιʔεXML౳Λී௨ʹ࢖͑Δ • தؒίʔυ(MSIL)ͱMono VMΛΞϓϦ(apk) ʹ ಉࠝɺJava VMͱฏߦՔಇ

Slide 9

Slide 9 text

Xamarin.AndroidͷHello World [Activity(Label = "AppTitle", MainLauncher = true, Icon = "@mipmap/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle state) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); var btn = FindViewById(Resource.Id.btn); btn.Click += (s, e) => btn.Text = "Hello World!"; } }

Slide 10

Slide 10 text

Xamarin.Androidͷ࣮ߦϞσϧ "OESPJE04 +BWB7. .POP7. 9BNBSJO"OESPJE.POP ΞϓϦ $ "OESPJE04 +BWB7. "OESPJE4%, ΞϓϦ +BWB +BWB4%, AndroidωΠςΟϒ Xamarin.Android

Slide 11

Slide 11 text

Xamarin.iOSͱ͸ʁ • iOS SDK(CocoaTouch)͕C#͔Βݺͼ(ry • ViewController, Storyboard౳Λී௨ʹ࢖͑Δ • ࣄલ(AOT)ίϯύΠϥͰϚγϯޠΛੜ੒͠Ξϓ Ϧ(ipa) ʹಉࠝ

Slide 12

Slide 12 text

Xamarin.iOSͷ࣮ߦϞσϧ "3. "3.Ϛγϯޠ $PDPB5PVDI 9BNBSJOJ04.POP ΞϓϦέʔγϣϯ $ .POP"05ίϯύΠϥ ࣮ػ Xamarin.iOS "3. "3.Ϛγϯޠ $PDPB5PVDI ΞϓϦέʔγϣϯ 4XJGU --7.ίϯύΠϥ ࣮ػ iOSωΠςΟϒ

Slide 13

Slide 13 text

Xamarin.Formsͱ͸ʁ • Android, iOS, Win, ͦͷଞͰUIͷ࣮૷Λڞ௨Խ ͢ΔϑϨʔϜϫʔΫ • ωΠςΟϒͷUI͕࢖༻͞ΕΔ • .NETͷσεΫτοϓΞϓϦ։ൃख๏ʹ͍ۙ (XAML<βϜϧ>Ͱը໘Λهड़ͳͲ) • ϚΠΫϩιϑτ͸͜Εਪ͠

Slide 14

Slide 14 text

Slide 15

Slide 15 text

௨ৗͷAndroid։ൃͱ Xamarin.Androidͷҧ͍

Slide 16

Slide 16 text

౷߹։ൃ؀ڥ • Visual Studio 2017ʗfor Mac Λ࢖͏ • AndroidΞϓϦ։ൃʹಛԽͨ͠Android Studio ΑΓ͸एׯޮ཰͕མͪΔ(ओ؍) • UIσβΠφ • XMLϦιʔεͷΠϯϥΠϯදࣔɺ౳ • JetBrains Riderͱ͍͏৽IDE΋ʂ

Slide 17

Slide 17 text

ϏϧυγεςϜ • Gradle͸࢖༻Ͱ͖ͳ͍ • annotation processorΛ࢖͏πʔϧ΍ϥΠϒϥ Ϧ͸࢖༻Ͱ͖ͳ͍ • AndroidσʔλόΠϯσΟϯά • Orma, PermissionsDispatcherͱ͔ • .NETͷϏϧυγεςϜʮMSBuildʯΛ࢖͏

Slide 18

Slide 18 text

ύοέʔδ؅ཧγεςϜ • maven, JitPackͳͲ͸࢖͑ͳ͍ • nuget(ʹΎʔ͛ͬͱ)Λ࢖͏ • ׂͱ؆୯ʹ୭Ͱ΋ϥΠϒϥϦΛొ࿥Մೳ

Slide 19

Slide 19 text

JavaͷϥΠϒϥϦ͸࢖͑Δʁ • “BindingϥΠϒϥϦ”Λ࡞ΔࣄͰ࢖༻Մೳ • “BindingϓϩδΣΫτ”ʹjarΛ์ΓࠐΉ͚ͩ • ෳࡶͳjarͩͱΧελϜϚοϐϯά͕ඞཁ • ஶ໊ͳJavaϥΠϒϥϦ͸طʹଘࡏ͢Δ • Google Play services, Support Libs • Picasso, Glide, OkHttp, LeakCanary, Lottie

Slide 20

Slide 20 text

C#ͷར఺ ⏰ 40

Slide 21

Slide 21 text

ඇಉظॲཧ(async/await) • ΍ͬͺ͜Ε • Task, TaskΫϥε • async/awaitߏจ • Rxͱ૬ޓม׵Մೳ

Slide 22

Slide 22 text

ඇಉظॲཧͷ࿈࠯(Java) void sendZip(String src, String dest) // 1. σʔλΛμ΢ϯϩʔυͯ͠ downloadAsync(src, data -> // 2. ZIPѹॖͯ͠ zipAsync(data, zipped -> // 3. ผͳͱ͜Ζʹૹ৴ sendAsync(zipped, dest, () -> activity.runOnUiThread(() -> // ૹ৴׬ྃ(UIεϨου) )))); } ωετͭΒ͍ɾɾɾ

Slide 23

Slide 23 text

ඇಉظॲཧͷ࿈࠯(C#) async void SendZip(string src, string dest) { // 1. σʔλΛμ΢ϯϩʔυͯ͠ var data = await DownloadAsync(src); // 2. ZIPѹॖͯ͠ var zipped = await ZipAsync(data); // 3. ผͳͱ͜Ζʹૹ৴ await SendAsync(zipped, dest); // ૹ৴׬ྃ(UIεϨου) } ϑϥοτʂ

Slide 24

Slide 24 text

ϥϜμࣜɺLINQ to Objects var list=new[]{0,1,2,3,4,5,6,7,8,9}// 0ʙ9Λ .Where(x => x % 2 == 0) // ۮ਺ͷΈ .OrderByDescending(x => x) // ߱ॱ .Select(x => x * 10); // 10ഒ // ݁Ռ: 80 60 40 20 0 // ↑ͷ݁Ռͱ [40, 20, 10] ͱͷੵू߹Λऔಘ͢Δ var ret = list.Intersect(new[]{40,20,10}); // ݁Ռ: 40 20 ֎෦ϥΠϒϥϦʹཔΒͣͰ͖Δͷ͕ڧ͍ʂ

Slide 25

Slide 25 text

ͪΐͬͱnull҆શʁ // hoge ͕ null ͳΒ࣮ߦ͠ͳ͍ hoge?.DoSomething(); // hoge, fuga ͕ null ͳΒ “none” Λฦ͢ var text = hoge?.fuga?.ToString() ?? “none"; int count = null; // ίϯύΠϧΤϥʔ int? count = null; // null ୅ೖՄೳ ൥ࡶͳnullνΣοΫΛ؆ུԽͰ͖Δ

Slide 26

Slide 26 text

vs Kotlin • ηϛίϩϯϨεͳͲͷ؆ܿͳߏจ • ڧྗͳnull҆શ • ܕਪ࿦ɺϥϜμࣜ • ύλʔϯϚον • ίϧʔνϯ(async/await) C#͸.NETϑϨʔϜϫʔΫͱڞʹਐԽͰ͖ΔڧΈ ݴޠͷϞμϯͩ͞ͱKotlinͷউͪ

Slide 27

Slide 27 text

X-PlatΞϓϦ։ൃͱ ίʔυͷڞ༗ ⏰ 30

Slide 28

Slide 28 text

.NETϑϨʔϜϫʔΫͰڞ௨Խ • .NETͷΫϥεϥΠϒϥϦΛ࢖ͬͨίʔυ͸ AndroidɺiOSͰڞ༗Մೳ • ྫ:JavaͷArrayList → .NETͷListɺ JavaͷCalendar → .NETͷDateTime /&5ϑϨʔϜϫʔΫʢ.POPʣ 9BNBSJO"OESPJE 9BNBSJOJ04 9BNBSJO .BD

Slide 29

Slide 29 text

.NET੡ϥΠϒϥϦΛ࢖͓͏ • ετϨʔδ - PCLStorage, Stream • σʔλϕʔε - SQLite-net, Realm Xamarin • ௨৴ - HttpClient • JSON - Json.NET • mBaaS - Azure, AWS, Firebase

Slide 30

Slide 30 text

MVVM+RxʹΑΔ ϞμϯͳΞϓϦ։ൃ

Slide 31

Slide 31 text

MVVMύλʔϯ • View: UIύʔπͷ഑ஔͱόΠϯσΟϯά • ViewModel: ViewͷͨΊͷσʔλͱॲཧ • Model: ্هҎ֎શͯ 7JFX 7JFX .PEFM .PEFM σʔλόΠϯσΟϯά Method Call Notify

Slide 32

Slide 32 text

RxͱReactive Programing • Rx = Reactive Extensions • LINQͷඇಉظόʔδϣϯ • RxJava, RxSwiftͳͲ΁Ҡ২͞Εͨ • RxJavaͷਐԽ͸RxΑΓૣ͍ • ํݴ͸͋ΕͲɺجຊ͸ಉ͡ • Reactive Programing͸ࠓ΍ඞਢεΩϧ

Slide 33

Slide 33 text

XamarinʹΑΔ “X-Plat” MVVM+RxΞϓϦ։ൃ ⏰ 30

Slide 34

Slide 34 text

Xamarin͸ MVVM΍Rxͱ૬ੑ͕Α͍ʂ • Rx͸ɺϚΠΫϩιϑτൃͷOSS͔Βීٴ • MVVM͸ɺ௕೥ͷσεΫτοϓΞϓϦΞʔΩ ςΫνϟͷ੒Ռ(Windows.Forms → WPF) • .NETʹ͸ɺ஌ݟΛ࣋ͬͨਓ΍ؔ࿈ϑϨʔϜ ϫʔΫ͕๛෋ʹଘࡏ

Slide 35

Slide 35 text

MVVMϑϨʔϜϫʔΫ • Prism.Forms
 ࠷΋Hotͳਖ਼౷೿ϑϧελοΫϑϨʔϜϫʔΫ • MvvmCross
 ݹ͔͘ΒX-Plat MVVMΛࢧ͖͑ͯͨ
 NHKߚനΞϓϦͰ࠾༻ • ReactiveUI
 MVVMʹRxΛ࣋ͪࠐΜͩ࠷ॳͷϑϨʔϜϫʔΫ

Slide 36

Slide 36 text

ReactiveProperty • ModelͷStreamΛViewʹ”ܨ͙”ϥΠϒϥϦ • ॳظ։ൃऀ͸UniRxͷ࡞ऀ(a.k.a “Rxਆ”) • JavaʹҠ২ͨ͠ “RxProperty Android” ΋͋ΔΑ

Slide 37

Slide 37 text

MVVM+RxͰ࡞ͬͯΈͨ ͓୊: GPSड৴ΞϓϦ (14ͷҢ౓ܦ౓Λ ඵ͓͖ʹߋ৽ ։࢝ͱఀࢭ ʮ౓ʯ͔ʮ౓෼ඵʯʹ ੾Γସ͑

Slide 38

Slide 38 text

Android-JavaͰͷ࣮૷ύλʔϯ .BJO"DUJWJUZ .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ 5FYU7JFX දࣔܗࣜ 4XJUDI TUBSU 3Y+BWB MPDBUJPO 0CTFSWBCMF MPDBUJPO ։࢝ #VUUPO PO$IFDLFE PO$MJDL "OESPJEσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS 'VTFE-PDBUJPO"QJ

Slide 39

Slide 39 text

iOS-SwiftͰͷ࣮૷ύλʔϯ .BJO7JFX$POUSPMMFS .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ 6*5FYU'JFME දࣔܗࣜ 6*4XJUDI TUBSU 3Y4XJGU MPDBUJPO 0CTFSWBCMF MPDBUJPO ։࢝ 6*#VUUPO PO4XJUDI TUBSU 4XJGU#POE -PDBUJPO"QJ $--PDBUJPO.BOBHFS

Slide 40

Slide 40 text

Xamarin.FormsͰͷ࣮૷ύλʔϯ .BJO1BHF .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ -BCFM දࣔܗࣜ 4XJUDI 4UBSU 3FBDUJWF&YUFOTJPOT -PDBUJPO 0CTFSWBCMF -PDBUJPO ։࢝ #VUUPO *T%NT'PSNBU 4UBSU 9BNBSJO'PSNTσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS -PDBUJPO"QJ $--PDBUJPO.BOBHFS

Slide 41

Slide 41 text

.BJO1BHF .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ -BCFM දࣔܗࣜ 4XJUDI 4UBSU 3FBDUJWF&YUFOTJPOT -PDBUJPO 0CTFSWBCMF -PDBUJPO ։࢝ #VUUPO *T%NT'PSNBU 4UBSU 9BNBSJO'PSNTσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS -PDBUJPO"QJ $--PDBUJPO.BOBHFS AndroidσʔλόΠϯσΟϯά SwiftBond ↓ Xamarin.Forms σʔλόΠϯσΟϯά Xamarin.FormsͰͷ࣮૷ύλʔϯ

Slide 42

Slide 42 text

.BJO1BHF .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ -BCFM දࣔܗࣜ 4XJUDI 4UBSU 3FBDUJWF&YUFOTJPOT -PDBUJPO 0CTFSWBCMF -PDBUJPO ։࢝ #VUUPO *T%NT'PSNBU 4UBSU 9BNBSJO'PSNTσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS -PDBUJPO"QJ $--PDBUJPO.BOBHFS RxJava RxSwift ↓ Reactive Extensions Xamarin.FormsͰͷ࣮૷ύλʔϯ

Slide 43

Slide 43 text

.BJO1BHF .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ -BCFM දࣔܗࣜ 4XJUDI 4UBSU 3FBDUJWF&YUFOTJPOT -PDBUJPO 0CTFSWBCMF -PDBUJPO ։࢝ #VUUPO *T%NT'PSNBU 4UBSU 9BNBSJO'PSNTσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS -PDBUJPO"QJ $--PDBUJPO.BOBHFS andoid:LocationaManager ios:CLLocationManager ↓ ϓϥοτϑΥʔϜݻ༗APIΛ ࢖࣮ͬͨ૷ΛDI (Dependency Injection) Xamarin.FormsͰͷ࣮૷ύλʔϯ

Slide 44

Slide 44 text

.BJO1BHF .BJO7JFX.PEFM ViewModel View Model -PDBUJPO6TFDBTF Ң౓ܦ౓ -BCFM දࣔܗࣜ 4XJUDI 4UBSU 3FBDUJWF&YUFOTJPOT -PDBUJPO 0CTFSWBCMF -PDBUJPO ։࢝ #VUUPO *T%NT'PSNBU 4UBSU 9BNBSJO'PSNTσʔλόΠϯσΟϯά -PDBUJPO"QJ -PDBUJPO.BOBHFS -PDBUJPO"QJ $--PDBUJPO.BOBHFS ڞ௨ԽͰ͖ͳ͍ͷ͸͚ͩ͜͜ Xamarin.FormsͰͷ࣮૷ύλʔϯ

Slide 45

Slide 45 text

X-Platڞ௨ԽͰ͖ΔʁͰ͖ͳ͍ʁ • ViewModel૚ɿ׬શʹڞ௨ԽͰ͖Δ • Model૚ • Usecaseɿ׬શʹڞ௨ԽͰ͖Δ • APIɿҰ෦ڞ௨ԽͰ͖ΔɺͰ͖ͳ͚Ε͹DI • View૚ɿҰ෦ڞ௨ԽͰ͖ΔɺͰ͖ͳ͚Ε͹DI ⏰ 20

Slide 46

Slide 46 text

ڞ௨Խࣄྫ1: B2B޲͚ ं᫑ӡߦ؅ཧΞϓϦ • ໿20ը໘ • ڞ௨Ͱͳ͍ॲཧ: GPS, Push௨஌, Ի੠࠶ੜ, Toast౳ • ૯ίʔυߦ਺: 22,816 Android:9% 2,134ߦ iOS:6% 1,407ߦ ڞ௨:85%
 19,275ߦ

Slide 47

Slide 47 text

ڞ௨Խࣄྫ2: ΤΠνɾΤεূ݊ εϚג • ໿70ը໘ • View͸C#ɺViewModelͱModel͸ F# Λ࢖༻ • ૯ίʔυߦ਺: 72,445 Android:3% 2,130ߦ iOS:4% 2,897ߦ ڞ௨:93% 67,418ߦ JXUG#17ʮূ݊औҾΞϓϦͱNote app࡞ͬͯΈͨʯΑΓ

Slide 48

Slide 48 text

Open Xamarin, ɹɹOpen Microsoft • Xamarin.Android .iOS .Forms ͸શͯOSS • .NET Core • .NETϑϨʔϜϫʔΫ(ͷҰ෦)ΛOSS&X-PlatԽ • AWS Lambda΍GCP͕.NET/C#ʹରԠ ϚΠΫϩιϑτ = ϓϩϓϥΠΤλϦ .NET = Windows ͸΋͸΍ඇৗࣝʂ

Slide 49

Slide 49 text

Xamarinͷ࢖͍Ͳ͜Ζ ʙۜͷ஄ؙ͸ͳ͍ΑͶʙ

Slide 50

Slide 50 text

Xamarin͕޲͍͍ͯͳ͍έʔε • AndroidɺiOSͷτοϓΤϯδχΞ͕ډΔ
 ˠAndroidͷΤʔεʹXamarin͸ෆཁ • ΞϓϦͷ഑෍αΠζΛؾʹ͢ΔϓϩμΫτ
 ˠ.NETϥϯλΠϜΛಉࠝ͢ΔͷͰ༰ྔ૿͑Δ • फڭ্ͷཧ༝
 →͏Μ͏ΜͦΕ΋͋ΔΑͶ

Slide 51

Slide 51 text

XamarinΛ࢖͏΂͖έʔε • B2BͳϞόΠϧɾλϒϨοτΞϓϦ • Win, Android, iOSͰڞ௨ϩδοΫΛ࠷େԽ • ӡ༻อकίετ㽊ɺཁһ֬อ • ελʔτΞοϓاۀ • ϏδωεϞσϧݕূ༻ʹαΫοͱ։ൃ • AndroidͱiOSࢢ৔ʹಉ࣌౤ೖ • ϑΟʔυόοΫɾϧʔϓΛૉૣ͘ճͤΔ

Slide 52

Slide 52 text

·ͱΊ

Slide 53

Slide 53 text

Xamarin.AndroidͰ࢝ΊΔ
 ɹɹɹɹX-PlatϞόΠϧΞϓϦ։ൃ 1. JavaͷAndroidΞϓϦΛɺXamarin.Android ʹҠ২ͯ͠ΈΑ͏ 2. iOSΞϓϦΛXamarin.iOSͰ࡞ͬͯΈΑ͏ 3. ڞ௨ϩδοΫΛ.NETͰॻ͖௚ͯ͠ΈΑ͏ 4. Xamarin.FormsͰը໘΋ڞ௨ʹͯ͠ΈΑ͏ 5. MVVM΍RxΛద༻ͯ͠ΈΑ͏

Slide 54

Slide 54 text

Android ΋ iOS ΋ .NET ΋ͥΜͿֶΜͰ C# Ͱ D.R.Y ͢Δͷ͕ Xamarin

Slide 55

Slide 55 text

ଓ͖͸ʮٕज़ॻయ̎ʯͰʂ • ͏-13ʮXamaritansʢ͟·ΓͨΜͣʣʯ • Xamarinͷ࠷ઌ୺৘ใΛ·ͱΊͨຊΛ഑෍͠·͢ • ௒ٕज़ॻయ(in χίχί௒ձٞ2017)΋ʂ

Slide 56

Slide 56 text

͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠$