Xamarin Mac 一個出了很久的東西,最近剛好有機會,寫了一個小 App 嘗試,記錄一下心得
Xamarin Mac 研究心得
基礎知識
微軟官方 Xamarin.Mac 文件網站:https://docs.microsoft.com/zh-tw/xamarin/mac/
開發環境
- 開發工具:VisualStudio for Mac
- 僅能在 Mac 上,使用 VisualStudio for Mac 來開發
- 開發的作業系統最低需求:10.13
- Xamarin.Mac App 的執行的最低需求:10.7
- 開發步驟看文件初步看起來應該就跟原生開發 Mac 接近
- Xamarin.Mac Sample Code : https://github.com/xamarin/mac-samples
- Xamarin.Mac API Reference : https://docs.microsoft.com/en-us/dotnet/api/?view=xamarin-mac-sdk-14
- Xamarin.Mac 基本上應該就跟 Mac 上面能用的東西是一對一的
- 媒體播放的 AVAudioPlayer, AVAudoiSession 都有對應的
- 也可以用 Plugin.MediaManager 或者 LibVLCSharp
- 媒體播放的 AVAudioPlayer, AVAudoiSession 都有對應的
開發筆記
- Keyboard Mapping 不一樣,可以設定為 VS (Windows) or Mac 原生,但是 Mac 原生的差滿多,要去一一找,目前設定是 VS (Windows)
- 還是沒找到一些本來在 VS 有的像 ctrl + j 的快速鍵要怎麼較出來
- Debug 的經驗有點奇妙,預設發生 Exception 是不會跳的,要去 Breakpoints 視窗裡面新增一個例外觸發的條件
- 既有公司寫好的 .NET Libray Project 幾乎可以無痛轉移,尤其用 .NET Standard 的,更是
- UI 編輯是回到 Xcode 使用 UI Builder,但是 VS 會去監控那個 UI 的檔案 (Storyboard),編輯完切換回去 VS 會自動偵測後產生對應的程式碼
- XCode 在綁定 UI 的方式有兩種,一種是用 Outlet (產生一個對應的物件,好比說一個 Button 就可以在 code 裡面多一個 Button 的成員變數), 一種是用 Action (產生一個執行的 method,就是在 Code 裡面會產生一個 method )
- 使用 Action 的話,似乎不支援 async,因為 Action 會採用 partial method 的方式達成,兩個 method 宣告不一致不行
- Mac 的 MVC 的 ViewController 感覺根本就是 View 的 CodeBehind 而不是真的 Controller
- 實際上開發的話,可以考慮多一層真的 Controller
- 從設定可以簡單切換到英文版 IDE
- File 不給路徑的會建立在 App 應用程式的封裝內,不會直接看到實體的檔案,但雖然在封裝內一樣都可以讀寫
- 可以用 Environment.GetFolderPath & Environment.SpecialFolder 來取得 (.NET Standard)
- 有結合路徑的需求,可以用 Path.Combine,會有更好的跨平台相容性!(因為路徑的分隔符號不一樣)
- 有些東西不一定要用原生的 class 去寫,可以用 .NET Standard ,寫起來會更順暢
- 像 File IO 等等
- 也許有 效能 考量的話可以再調整
- 像我用的套件(可以參考裡面的 SourceCode)
- 像 File IO 等等
- CollectionView 依照微軟的文件操作上花了些功夫,發現是微軟文件漏掉一些步驟,實際使用上是沒問題的
- 拉 Seque 是要從 ViewController 的文字按下 Ctrl 拖到另外一個 ViewController 上,不是在 Designer 的介面上拉
- Debug 的 step over 有點不太一樣,疑似按下去也會進去到更底層的 sourceCode 而不是真的 step over
- 取得媒體檔案資訊,可以不用真的要去播放他,可以用 cocoa 內建的讀取檔案 meta 的 class 去讀取.
- 使用 TableView 比起用更彈性的 CollectionView 輕鬆愉快
- TableView 裡面的 Column 和 Cell 的 Identifier 不可以一樣
- Cell 的 Identifier 可以重複
- TableViewDelegate 裡面的 GetViewForItem 寫的時候,要把 "建立" 和 "給值" 分開來寫,否則編輯後呼叫 TableView.ReloadData 就會發現畫面出現很恐怖的事情 XD 原因就是同一個地方本來不需要被建立 Item 的又被重新建立了一次
- NSSlider 在會一直更新 Position 又想讓使用者執行 Seek 的動作的時候,記得要去 UI Builder 裡面把 continuous 的屬性打勾,否則會一直被 Position 更新位置回去,就是會讓用戶的 Seek 行為失效
總結心得
Xamarin Mac 在開發上的確是滿乏人問津的,用 Google 就知道了,能夠下 Xamarin Mac 搜尋到的東西絕大部分都還是 iOS 或 Android 的,除此之外微軟文件也是 2266 的。這個套件應該推出很多年了但看起來主力還是放在 iOS / Android 多。希望未來的 MAUI 可以改進 XD
開發上最主要會遇到的瓶頸應該是跟使用 Xamarin.Android or Xamarin.iOS 去開發會遇到的狀況一樣,就是每個平台特性的用法,包含 UI 控制項上,其餘單純只有 code 的地方能夠沿用既有 .NET Code 真的是滿輕鬆愉快的。
至於問我有沒有覺得可以拿來開發產品,我是覺得有的!!就只是要習慣一下 VS for Mac 還有那些快速鍵 囧 ,那些快速鍵找不到真的是會拖慢開發速度的 XD (還有 Mac 本身的快速鍵跟 Windows 不一樣也是會拖慢,然後兩個作業系統切換來切換去,手都會錯亂按錯 Orz)
然後最好能夠先熟悉一下 Mac 的開發模式,像我邊做邊學有地方就容易卡住。
大概就這樣啦~ 有什麼好奇想問的可以流言(咦~有這個功能嗎?XD)
工商服務時間:
https://www.accupass.com/organizer/detail/1910170752158115281580
如果有對 Xamarin Forms 有興趣的朋友,這邊有 Xamarin Class 開設的課程喔~ 可以參考看看~