文章目录

  • 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 红队测试与外部评估…