【Avalonia】無開發者賬號使用iOS真機調試跨平臺應用

文章目錄

  • 1. 要求
    • 1.1 無需Apple開發者賬號
    • 1.2 最新版mac系統
    • 1.3 最新版Xcode
  • 2. 配對Mac
  • 3. 配置開發證書
    • 3.1 創建一個名為MTClient的Xcode項目
    • 3.2 找到簽名證書
    • 3.3 配置簽名
    • 3.4 配置標識符
  • 4. 真機調試
    • 4.1 設置應用首屏 Launch Screen
    • 4.2 設置應用圖標
  • 5. 問題
    • 5.1 DI異常
      • 該問題的解決
        • 使用`<UserInterpreter>`
        • 探索MAUI
      • 曙光
    • 5.2 其他報錯
    • 5.3 Entitlements權利

1. 要求

1.1 無需Apple開發者賬號

我這里開發的應用僅是用于調試、體驗IOS應用開發流程,并沒有發布到AppSotre的計劃,所以沒有申請一年$99的開發者賬號。

但沒加入開發者計劃也有一些使用限制:

  1. 你的應用簽名有效期只有一周,到期之后需要重新把手機插到電腦上重新安裝一次。
  2. 不能分發應用,多臺手機的話只能一個一個裝

(如果你已經有了開發者賬號,則可以參考這篇文章 Maui勸退:用windows直接真機調試iOS,無須和Mac配對,無需mac電腦)

1.2 最新版mac系統

macOS版本:15.0以上。
你需要有一臺裝了macOS的電腦,可以是黑蘋果或白蘋果。(我是找了臺不用的dell電腦,花了50裝了最新的黑果系統)

系統最好是最新版,因為.net 9只支持macOS 15以上的版本。參見:Target Framework
在這里插入圖片描述

1.3 最新版Xcode

AppStore安裝最新的Xcode,xamarin/maui/avalonia開發的ios應用都依賴xcode。

2. 配對Mac

這一步比較簡單,確保開發機和mac在同一個網段,vs就會自動查找到對應的mac。
在這里插入圖片描述
然后點擊“connect”即可,會自動在mac上安裝需要的work load,大概需要十幾分鐘。
我這里已經連接過了所以顯示“disconnect”

3. 配置開發證書

總體上可以參考這篇略過時的文章:如何在iPhone或iPad上構建和運行應用程序。

也可以直接參考我的步驟:

3.1 創建一個名為MTClient的Xcode項目

Xcode中首先登錄你的AppleID,然后創建一個名為MTClient的IOS項目。

創建有三個信息比較重要:

  1. Product Name:這里的MTClient是我應用的名字,你也可以改成其它的。
  2. Organization Identifier:組織名,你用ApppleID登陸Xcode時會提示是否創建一個組織,這里自動填充的GymOrg就是我之前創建的組織。當然這里也可以用其他的組織。
  3. Bundle Identifier核心,牢記,這個相當于你應用的標識符,后續所有的簽名及證書都是基于此標識符。

在這里插入圖片描述
創建完成后,把手機插到mac上調試下看是否能正常跑起來。

3.2 找到簽名證書

打開SpotLight,輸入KeyChainAccess:
在這里插入圖片描述
打開鑰匙串訪問.app,搜索關鍵詞develop找到剛創建的證書。
在這里插入圖片描述
將此證書的名字復制下來備用。

3.3 配置簽名

首先將項目屬性 Bundle Signing Scheme改為Manual Provisioning:
在這里插入圖片描述
然后打開項目的.csproj,添加<CodesignKey>,值就是之前拷貝的證書字符串。
在這里插入圖片描述

3.4 配置標識符

簽名配置好了,還要配置對應的應用標識符。簽名+標識符才是完整的一套。
在這里插入圖片描述
打開info.plist將Bundle Identifier改為之前我們配置的值即可。

4. 真機調試

這個沒什么好說的,rebuild下項目,然后調試設備選擇你的IOS真機,接下來就是正常的調試步驟。

4.1 設置應用首屏 Launch Screen

默認首屏顯示的是一個白底黑字你應用名字的一個頁面。
你可以修改LaunchScreen.xib文件內容進行調整:
在這里插入圖片描述
同樣你可以修改info.plist的選項以關閉首次打開時顯示首屏頁面:
在這里插入圖片描述
(但設置為not set后可以影響你app的展示尺寸)

4.2 設置應用圖標

打開info.plist,在這里設置應用圖標:
在這里插入圖片描述
需要多個不同寬高的圖標:
在這里插入圖片描述
可使用在線工具一次性全部生成。

5. 問題

5.1 DI異常

報錯 Attempting to JIT compile method 'Microsoft.Extensions.DependencyInjection.ServiceProvider :

Received unhandled Objective-C exception that was marshalled from a managed exception: Attempting to JIT compile method 'Microsoft.Extensions.DependencyInjection.ServiceProvider Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions:BuildServiceProvider (Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.DependencyInjection.ServiceProviderOptions)' while running in aot-only mode. See https://learn.microsoft.com/xamarin/ios/internals/limitations for more information.(System.ExecutionEngineException)at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection )at MessageTransferClient.App.OnFrameworkInitializationCompleted() in H:\MyProgram\SomePractice\Avaloni

此問題只出現在IOS真機上,IOS模擬器、Windows、安卓都沒有問題。原因是因為IOS真機不允許JIT,所以只能用AOT,但并非所有的.net 特性都支持AOT,所以就會報錯。

AOT使用的一些限制具體請參考:Xamarin.iOS 的限制

該問題的解決

使用<UserInterpreter>

但并不意味著所有AOT不支持的特性你都不能使用,可以參考iOS 和 Mac Catalyst 上的 Mono 解釋器官方文檔,在csproj中添加<UseInterpreter>。這樣對于AOT不支持的特性就可以使用Mono解釋器執行,缺點就是運行速度會慢一點而且也不是100%解決問題。

然而嘗試使用Mono解釋器后并沒有解決此問題,報錯變成了:

Error: VTable setup of type Microsoft.Extensions.DependencyInjection.ServiceProvider failed.

解釋器無法構造出DI類型所需要的函數表,網上搜了一圈也沒找到如何解決。

后續我又嘗試使用SimpleInject等對AOT友好的DI或者自己手寫DI,但我所用到的SignalR.Client這個庫嚴重依賴MSDI,并且無法替換。

探索MAUI

我曾經一度懷疑.net for ios是個雞肋,于是在github上搜索現成的基于SignalR的MAUI開發的app,看是否都能正常工作。搜到一個之后真機調試運行了沒有發現任何問題,DI也完全正常。這難道是Avalonia自身的問題?

于是乎又經歷了一番嘗試:將.net版本改為與MAUI中的一致、將所有用的nuget package改為與MAUI中的一致、檢查plist是否一致,一番操作之后然而并沒有什么用,同樣的報錯。

此問題遂擱置,等周末再研究。

曙光

于是來到了今天上午,在嘗試繼續解決這個問題前,我升級了下VS2022的版本,從17.10升級到了目前的最新版17.14.11。
神奇的是DI就這樣完全好用了,期間一個星期我沒有改動過任何代碼,就這么升級一下VisualStuido就解決了。不確定最終問題原因是出現了VisualStudio里還是依賴的.net9 workload里。

關于JIT問題的兩個參考鏈接:

  1. https://github.com/AvaloniaUI/Avalonia/discussions/19267
  2. https://github.com/AvaloniaUI/Avalonia/issues/9934

5.2 其他報錯

在這里插入圖片描述
開發過程中如果你遇到了像這種奇奇怪怪本不應該報錯的報錯,clean–>rebuild下你的IOS項目就可以了。

5.3 Entitlements權利

在嘗試解決前面的DI問題時,我猜測可能是權利問題(但其實并不是)。所以又檢索了macOS Catalina 公證以及對 .NET 下載和項目的影響這篇文章,了解了下權利。簡單來說所有你準備在IOS或MAC平臺上進行分發的軟件都需要具備對應的權利。

但Avalonia模板創建出來的默認應用,并沒有添加.net對應的權利,所以適時可以將權利添加到Entitlements.plist文件中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92562.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LLM實戰|langchain】langchain基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 【LLM實戰|langchain】langchain基礎 1. 模型 I/O 封裝 把不同的模型&#xff0c;統一封裝成一個接口&#xff0c;方便更換模型而不用重構代碼。 1.1 …

十九、MySQL-DQL-基本查詢

基本查詢代碼&#xff1a;DQL:基本查詢 1.查詢指定字段 name,entrydate 并返回 -- 1.查詢指定字段 name,entrydate 并返回 select name,entrydate from tb_emp;2.查詢返回所有字段 -- 2.查詢返回所有字段 -- 推薦 select id, username, password, name, gender, image, job, e…

CamX-驍龍相機修改

1. 修改視頻模式預覽尺寸和分辨率 vendor/codeaurora/packages/apps/SnapdragonCamera/src/com/android/camera/CaptureModule.javaprivate void updatePreviewSize() {int width mPreviewSize.getWidth();int height mPreviewSize.getHeight(); - mPreviewSize new …

容器技術基礎與實踐:從鏡像管理到自動運行配置全攻略

1. 相比較虛擬機&#xff0c;容器有哪些技術優勢&#xff1f;&#xff08;1&#xff09;直接在操作系統上運行&#xff0c;從而跨系統上的所有容器共享資源&#xff0c;‘&#xff08;2&#xff09;共享主機的內核。&#xff08;3&#xff09;與虛擬機相比&#xff0c;它需要的…

書生浦語第五期-L1G4-InternLM 論文分類微調實踐(XTuner 版)

XTuner介紹一句話介紹XTuner&#xff1a;XTuner 是一個高效、靈活、全能的輕量化大模型微調工具庫。核心特點&#xff1a;高效&#xff1a;支持在有限資源下微調大模型&#xff0c;如在8GB顯存上微調7B參數模型&#xff0c;也支持多節點微調70B模型&#xff1b;自動分發高性能算…

從靈感枯竭到批量產出:無憂秘書創作平臺如何重構內容生產者的工作流程?全環節賦能分析

在當今快節奏的數字時代&#xff0c;內容創作者面臨著前所未有的挑戰。無論是自媒體運營者、自由撰稿人還是企業營銷人員&#xff0c;都需要高效地生產高質量的內容以滿足市場需求。然而&#xff0c;靈感枯竭、效率低下以及內容質量不穩定等問題常常困擾著這些內容生產者。為了…

【開源工具】基于Python的PDF清晰度增強工具全解析(附完整源碼)

??? 【開源工具】基于Python的PDF清晰度增強工具全解析(附完整源碼) ?? 個人主頁:創客白澤 - CSDN博客 ?? 系列專欄:??《Python開源項目實戰》 ?? 熱愛不止于代碼,熱情源自每一個靈感閃現的夜晚。愿以開源之火,點亮前行之路。 ?? 希望大家多多支持,我們一起進…

Qwen-Image開源模型實戰

Qwen-Image開源模型實戰&#xff1a;ComfyUI低顯存量化部署與中文海報生成指南 阿里云通義千問團隊最新開源的Qwen-Image模型以其卓越的中英文文本渲染能力在AI繪圖領域掀起了一場革命。這款200億參數的MMDiT架構模型不僅能夠生成高質量圖像&#xff0c;更突破了AI繪圖長期存在…

JavaWeb03——javascript基礎語法

1.什么是JavaScript&#xff1f;JavaScript&#xff08;簡稱 JS&#xff09;是一種 編程語言&#xff0c;它主要用來為網頁添加交互功能。它可以讓網頁變得動態&#xff0c;讓它不僅僅是靜態的文字和圖片&#xff0c;還能響應用戶操作&#xff08;比如點擊按鈕、彈框警告等&…

數據庫入門:從零開始構建你的第一個數據庫

歡迎來到數據庫的世界&#xff01;今天&#xff0c;我們將一起探索如何創建、管理和查詢數據庫。無論你是初學者還是希望加深理解的開發者&#xff0c;這篇博客都將幫助你更好地掌握數據庫的基礎知識。一、數據庫的基本操作創建數據庫首先&#xff0c;讓我們從創建一個新數據庫…

從匯編角度揭秘C++構造函數(1)

C的構造函數一直比較神秘&#xff0c;今天我們通過匯編的角度來揭秘一下&#xff0c;它的本質是什么。與常規函數有什么不同。從以下這段代碼說起&#xff1a; class Person { public:Person(int age) { _age age; }void printAge(){ printf("age %d\r\n",_age); …

java10學習筆記

Java 10 于 2018 年 3 月發布&#xff0c;是 Java 平臺按照新的六個月發布周期發布的第一個版本。雖然相比 Java 8 和 Java 9 的大型更新&#xff0c;Java 10 的變化較小&#xff0c;但仍然引入了一些重要的特性&#xff0c;特別是本地變量類型推斷&#xff08;var&#xff09;…

Flutter Listview的基本使用

Listview() 前端頁面常見的一個以列表方式顯示內容的組件。可垂直或水平滾動的列表。屬性說明scrollDirection設置滾動的方向&#xff0c;取值包括horizontal、verticalreverse設置是否翻轉&#xff0c;默認值falseitemExtent設置滾動方向子元素的長度&#xff0c;垂直方向為高…

強化學習筆記:從Q學習到GRPO

推薦學習huggingface的強化學習課程&#xff0c;全面了解強化學習的發展史。 以下是個人筆記&#xff0c;內容不一定完整&#xff0c;有些是個人理解。 基于值函數(value function)的強化學習 基于值函數(value function)的強化學習&#xff1a;學習的是一個值函數&#xff0…

MySQL索引底層原理與性能優化實踐

#技術棧深潛計劃一、前言 在日常開發中&#xff0c;MySQL數據庫以其高效、易用、可擴展等特性成為最主流的關系型數據庫之一。而索引作為數據庫查詢優化的核心工具&#xff0c;被譽為“數據庫的加速器”。但你真的了解MySQL索引的底層原理嗎&#xff1f;為什么InnoDB默認采用B樹…

Ext系列文件系統

1.硬件常見的硬件有磁盤、服務器、機柜、機房機械磁盤但是計算機中唯一的一個機械設備磁盤外設的特點就是外設慢容量大&#xff0c;價格便宜1.1.磁盤的物理結構磁盤的物理圖&#xff1a;磁盤的存儲圖扇區:是磁盤存儲數據的基本單位&#xff0c;512字節&#xff0c;塊設備磁盤的…

前綴函數——KMP的本質

前綴函數我個人覺得 oiwiki 上的學習順序是很合理的&#xff0c;學 KMP 之前先了解前綴函數是非常便于理解的。前后綴定義 前綴 prefixprefixprefix 指的是從字符串 SSS 的首位到某個位置 iii 的一個子串&#xff0c;這樣的子串寫作 prefix(S,i)prefix(S,i)prefix(S,i)。 后綴 …

解決chrome下載crx文件被自動刪除,加載未打包的擴展程序時提示“無法安裝擴展程序,因為它使用了不受支持的清單版本解決方案”

解決chrome下載crx文件被自動刪除 【chrome設置-隱私與安全-安全瀏覽】&#xff0c;選擇 不保護 【chrome設置-下載內容】&#xff0c;勾選 下載前詢問每個文件的保存位置 下載crx文件時&#xff0c;選擇保存文件夾&#xff0c;將 .crx后綴 改為 .zip后綴&#xff0c;再確定。 …

嵌入式學習day23-shell命令

linux軟件編程學習大綱&#xff1a;1.IO操作文件2.多任務編程3.網絡編程4.數據庫編程5.硬件設備管理學習目標&#xff1a;1.學習接口調用&#xff08;第一層&#xff09;2.軟件操作流程和思想&#xff08;第二層&#xff09;3.軟件設計思想和流程架構&#xff08;第三層&#x…

GPT-5 系列深度詳解:第1章-引言(目錄)

1 引言2 模型數據與訓練3 觀察到的安全挑戰與評估 3.1 從強制拒絕到安全完成 3.2 禁?內容 3.3 拍?屁 3.4 越獄 3.5 指令層級 3.6 幻覺 3.7 欺騙 3.7.1 欺騙思維鏈監控 3.8 圖像輸入 3.9 健康 3.10 多語言性能 3.1.1公平性與偏見&#xff1a; BBQ評估4 紅隊測試與外部評估…