Mac OS應(yīng)用 避坑 和 源碼)
首先 Visual Studio 2019 for mac 有很多版本必須一對一和Xcode的版本對應(yīng)才能正確開發(fā) 否則編譯都報錯本人xcode11.1 、13.2.1、12.5.1 輪著配 VS2019 for Mac 8.4、8.10 編譯都報錯。提醒大家不要以為是自己問題就是兩者版本不適配。本人最后試出來 vs2019 for mac 8.3.1 配 Xcode 11.2 。 親測正常了。搞了一禮拜 微軟還不讓正常下載舊版舊版從微軟訂閱頻道下載要收費的。 現(xiàn)在最新版VS for Mac 又要升級自己的mac系統(tǒng)這升級就會破壞本機目前使用一些mac應(yīng)用的環(huán)境導(dǎo)致又要下載新版應(yīng)用。果斷不能如此勸大家不要踩坑給Visual Studio for Mac開發(fā)蘋果應(yīng)用的初學(xué)者建議1、 VS版本和Xcode要對應(yīng)。 不出錯就用本人親測可用的版本2、mac OS系統(tǒng)里卸載應(yīng)用就是卸不干凈無論是360 還是 騰訊的mac維護應(yīng)用現(xiàn)在用deepseek 它會回答 清理的終端代碼就可以清干凈。 VS 和 Xcode是附件太占硬盤容量掉了它本體其它東西還在mac電腦里如果你需要卸載整個 Visual Studio for Mac 和所有 Xamarin 組件可以下載并使用微軟官方提供的卸載腳本。腳本下載地址為https://raw.githubusercontent.com/MicrosoftDocs/visualstudio-docs/master/mac/resources/uninstall-vsmac.sh。下載后在終端中通過chmod x賦予執(zhí)行權(quán)限后運行即可。手動刪干凈xcode ,本人上篇文章 點這里Visual Studio Mac 開發(fā)Mac應(yīng)用的原理在vs中寫代碼事件在xcode中擺放控件如button label textbox這兩個軟件因為適配就會同步更新兩邊的更改微軟的一步步教的步驟 HelloMac - 演練 - Xamarin | Microsoft Learn在vs for mac中獲取本機電池的代碼using System; using Xamarin.Essentials; namespace helloworld1 { public class BatteryInfoHelper { public static double GetBatteryPercent() { double level Battery.ChargeLevel; level level * 100; return level; } public static string getState() { // 根據(jù)狀態(tài)執(zhí)行邏輯 switch (Battery.State) { case BatteryState.Charging: // 正在充電 return 充電中;//break; case BatteryState.Full: // 電池已滿 return 電量已滿; //break; case BatteryState.Discharging: case BatteryState.NotCharging: // 正在放電或未充電 return 正在放電或未充電; //break; case BatteryState.NotPresent: // 設(shè)備無電池如臺式機 return 本機無電池; //break; case BatteryState.Unknown: // 無法檢測狀態(tài) return 無法檢測狀態(tài); // break; default: return 狀態(tài)未知; } } public static void GetBatteryStatus() { // 1. 獲取當(dāng)前電量百分比 (0.0 到 1.0) // 如果連接交流電或無電池通常返回 1.0 double level Battery.ChargeLevel; // 2. 獲取電池狀態(tài) BatteryState state Battery.State; // 3. 獲取電源來源 BatteryPowerSource source Battery.PowerSource; // 輸出調(diào)試信息 //Debug.WriteLine($電池電量: {level * 100}%); //Debug.WriteLine($電池狀態(tài): {state}); //Debug.WriteLine($電源來源: {source}); // 根據(jù)狀態(tài)執(zhí)行邏輯 switch (state) { case BatteryState.Charging: // 正在充電 break; case BatteryState.Full: // 電池已滿 break; case BatteryState.Discharging: case BatteryState.NotCharging: // 正在放電或未充電 break; case BatteryState.NotPresent: // 設(shè)備無電池如臺式機 break; case BatteryState.Unknown: // 無法檢測狀態(tài) break; } } } }使用上述代碼需要Xamarin.Essential包 可以在VS for Mac 里用nutget 在線獲取。VS for mac 開發(fā)mac播放聲音/* * * var player new AudioPlayerHelper(); // 播放包內(nèi)資源假設(shè) Resources 文件夾中有 sound.mp3 player.PlayFromBundle(sound, mp3); // 或播放絕對路徑文件 player.PlayFromFile(/Users/你的用戶名/Music/example.mp3) * * * */ using System; using AVFoundation; using Foundation; namespace helloworld1 { public class MacAudioPlayer { // 必須保持強引用否則播放可能被 GC 中斷 private AVAudioPlayer _audioPlayer; /// summary /// 從絕對文件路徑播放聲音 /// /summary public void PlayFromFile(string filePath) { var url NSUrl.FromFilename(filePath); Play(url); } /// summary /// 從應(yīng)用程序包資源中播放聲音 /// 例如資源文件名為 beep.mp3放在 Resources 文件夾Build Action 設(shè)為 BundleResource /// /summary public void PlayFromBundle(string resourceName, string extension) { var path NSBundle.MainBundle.PathForResource(resourceName, extension); if (path null) { Console.WriteLine($未找到資源: {resourceName}.{extension}); return; } var url NSUrl.FromFilename(path); Play(url); } private void Play(NSUrl url) { // 如果已有播放器在播放先停止并釋放 Stop(); NSError error; _audioPlayer AVAudioPlayer.FromUrl(url, out error); if (error ! null) { Console.WriteLine($AVAudioPlayer 初始化失敗: {error.LocalizedDescription}); _audioPlayer null; return; } // 配置播放參數(shù) _audioPlayer.Volume 1.0f; // 音量 0.0 ~ 1.0 _audioPlayer.NumberOfLoops 0; // 0 播放一次-1 無限循環(huán) _audioPlayer.FinishedPlaying OnFinishedPlaying; _audioPlayer.PrepareToPlay(); bool started _audioPlayer.Play(); Console.WriteLine(started ? 開始播放 : 播放失敗); } private void OnFinishedPlaying(object sender, AVStatusEventArgs e) { Console.WriteLine(播放完成); Stop(); // 播放結(jié)束后釋放 } public void Stop() { if (_audioPlayer ! null) { _audioPlayer.FinishedPlaying - OnFinishedPlaying; if (_audioPlayer.Playing) _audioPlayer.Stop(); _audioPlayer.Dispose(); _audioPlayer null; } } } }在VS for Mac里開發(fā)C#代碼主要在Viewcontroller.cs文件里編寫各類控件事件 上面的代碼被調(diào)用就這樣的。Viewcontroller.cs有Viewcontorller.designer.cs的文件這由vs for Mac自己維護它會自動根據(jù)xcode控件變化 同步自我更新。