SlideShare a Scribd company logo
NATIVE FORMS
Xamarin Forms embedded in Native Project
NATIVE FORMS
 Xamarin Forms v2.5的亮點新功能
http://bit.ly/2BYVc8y
 可將Xamarin Forms的頁面嵌入
 iOS
 Android
 UWP
Xamarin原生專案中使用
官方說明:http://bit.ly/2EXCLE8
原本叫”Xamarin.Forms Embedding”:
http://bit.ly/2FC69wB
本來計畫是在v3.0支援MacOS, GTK#, WPF
時再一起推出:http://bit.ly/2HSRIW2
結果在v2.5發佈時就正式推出&改名了:
http://bit.ly/2CoRWo3
NATIVE FORMS
 使用方法:
1. 在App啟動時的事件,或在需要顯示Xamarin
Forms Page物件前先呼叫Xamarin.Forms.Init()
2. 根據不同平台的API,產生出對應平台的UI物件:
 Android: Fragment
CreateFragment()或CreateSupportFragment()
 iOS: ViewController
CreatViewController()
 UWP: FrameworkElement
CreateFrameworkElement()
3. 將產出UI物件利用該平台UI框架的顯示方法使用。
• 各個平台的Forms.Init()呼叫時機&
輸入參數各有不同,須留心:
http://bit.ly/2BY3I8a
• 建立各平台UI物件的API都是寫成
Xamarin Forms擴充方法,沒文件🤨
NATIVE FORMS Native Forms所『嵌入』到原生平台的UI物件,
可直接使用該平台的顯示導覽框架來操作顯示/隱
藏/換頁等的功能。
 原本Xamarin Forms的MessagingCenter API
(http://bit.ly/2FBDOXk)
可用來做為原生平台和Xamarin Forms頁面物件
連動。
 用.Net事件來硬刻互相溝通的方法也行(惡搞)。
 Android要注意會吃到Android原生theme顏色!!
使用Xamarin Forms v2.5套件來跑Build
2017展示範例Weather App
程式碼: http://bit.ly/2F2h41G
XAMARIN技術架構圖
 這個時候就會覺得很好奇🤨
 Native Forms是怎麼辦到的?
先來建置個可除錯版的XAMARIN.FORMS
如何包Nuget套件?
 Building the Xamarin.Forms NuGet:
http://bit.ly/2GQbboU
 講git clone下來,用Visual Studio build,
根目錄有提供一個批次檔跑下去就有除
錯版的Nuget套件了~
Xamarin Forms專案怎build
 A Beginner’s Guide for Contributing to
Xamarin.Forms:
http://bit.ly/2ouJMBU
 講專案架構目錄裡面的結構
建置可除錯版的
XAMARIN.FORMS套件
 實際上會碰到的坑(沒雷才有鬼😒):
1. 原始碼有使用一個CI Server在使用的git
submodule repo設定,但沒放到github上:
http://github.com/xamarin/Xamarin.Forms/issu
es/1605
用sourcetree一直會顯示找不到該submodule而
失敗,建議用指令列抓目前正式釋出版tag:
2. Visual Studio 2017沒辦法包出原本Nuget spec設
定檔所含的WinRT, Windows 8.1, Windows
Phone的專案產出dll,需要手動修
改.nuspec/Xamarin.Forms.nuspec檔案,修該
內容可參考: http://bit.ly/2FazXTr 。
3. Windows 10的SDK須安裝最早期10240正式版,
而且UWP平台的可能因為是專案包裝app佈署檔
案的設定錯誤,實際上還是無法追進Xamarin。
能在Visual Studio 2017 中建置可除錯
版Nuget的分支:
http://bit.ly/2FGn3up
git clone -b release-2.5.0-sr5 https://github.com/xamarin/Xamarin.Forms.git
建置可除錯版的
XAMARIN.FORMS套件
全部幾十個專案裡面,其實只要建置
Platforms目錄裡全部專案,以及左邊
有選取的專案,就能建出給.Net
Standard和最新Visual Studio 2017
v15.6的Xamarin相關專案可使用的
Nuget了
建置可除錯版的
XAMARIN.FORMS套件
該批次檔執行後會產生版號9.9.x的
Xamrin.Forms套件,每執行一次.x版號
會遞增
建置可除錯版的
XAMARIN.FORMS套件
記得設定自訂Nuget套件本機目錄位址
有一個已經包好實際對應版本v2.5-rs5
的Xamarin.Forms Nuget套件放在:
http://bit.ly/2t08X49
可在跑除錯時追進去看其中玄機了
以下是ANDROID的追CODE截圖
 使用的Android範例專案:http://bit.ly/2FdXL8O
Xamarin native forms
Xamarin native forms
Xamarin native forms
Xamarin native forms
以下是IOS的追CODE截圖
 使用的iOS範例專案:http://bit.ly/2HSCyQz
Xamarin native forms
Xamarin native forms
Xamarin native forms
Xamarin native forms
Xamarin native forms
NATIVE FORMS實作細節
推測
 顯示(View):用原本Xamarin Forms的呈現機制
(Visual tree, platform對應renderer)
 控制(Controller):相對應產生該平台的控制器
(Controller, Fragment)物件,介接application
code。
效能上還是會有些損耗,但應該比架構上整包都套
Xamarin Forms來得小。
使用Xamarin Forms裡面一個顯示
OpenGL 3D內容的OpenGLView:
http://bit.ly/2GMhzNR
做用Native Forms技術載入顯示的
iOS/Android範例專案:
http://bit.ly/2F22HKM
結論:其他可能會產生的問題&好處
 原本App使用的UI Test框架做的自動測試可能會失效。
(目前在App Center上的iOS Launch Test就會Time-out而test fail)
 使用第三方套件的Xamarin Form頁面也有可能會因為元件生命週期問題
而會有bug(還有不知道商業license授權是否可行)。
 一些原本在不同平台上有相同功能的畫面可以藉由這個Native Forms技
術,寫在.Net Standards 2.0專案內共享程式碼。
 開發中的Embeddinator 4000:
https://github.com/mono/embeddinator-4000
可能有使用類似的架構設計思維技巧來實作跨平台共用。

More Related Content

More from Chen Yu Pao (8)

PPTX
HoloLens 2的 MR(Mixed Reality)開發入門
Chen Yu Pao
 
PPTX
SkiaSharp on Xamarin Forms
Chen Yu Pao
 
PPTX
ReactiveUI Xamarin.Forms
Chen Yu Pao
 
PPTX
WebSocket on client & server using websocket-sharp & ASP.NET Core
Chen Yu Pao
 
PPTX
Xamarin Form using ASP.NET Core SignalR client
Chen Yu Pao
 
PPTX
Xamarin ARKit Introduction 01
Chen Yu Pao
 
PPTX
Xamarin的Azure後端懶人包
Chen Yu Pao
 
PPTX
Proto actor 串接 Go 與 C# 簡易上手
Chen Yu Pao
 
HoloLens 2的 MR(Mixed Reality)開發入門
Chen Yu Pao
 
SkiaSharp on Xamarin Forms
Chen Yu Pao
 
ReactiveUI Xamarin.Forms
Chen Yu Pao
 
WebSocket on client & server using websocket-sharp & ASP.NET Core
Chen Yu Pao
 
Xamarin Form using ASP.NET Core SignalR client
Chen Yu Pao
 
Xamarin ARKit Introduction 01
Chen Yu Pao
 
Xamarin的Azure後端懶人包
Chen Yu Pao
 
Proto actor 串接 Go 與 C# 簡易上手
Chen Yu Pao
 

Xamarin native forms