如何将普通的Xamarin.iOS解决方案(没有Xamarin Forms)更新到.net 6(没有MAUI)以在iOS和Mac Catalyst上运行?

7bsow1i6  于 2023-08-01  发布在  iOS
关注(0)|答案(2)|浏览(157)

我有一个Xamarin.iOS解决方案,其中包括一个库项目和一个可执行文件。该解决方案不使用Xamarin Forms,即所谓的“Xamarin Native”解决方案。
我想把这个升级到.net 6解决方案。不幸的是,我看到的所有示例和文档都只解释了如何将Xamarin Forms解决方案升级到使用MAUI(这是Xamarin Forms的演变)的.net 6解决方案。
于是:
1.如何将我的解决方案更新为.net 6“原生”iOS解决方案?
1.由于.net 6也支持Mac Catalyst,我如何将我的解决方案配置为除了在iOS上运行之外还在Mac Catalyst上运行?

flvtvl50

flvtvl501#

方法一:

第一个月
查看可用的VS projects类型,您可以执行以下操作:VS 2022预览版/新项目/ language=c#,platform=ios。滚动到列表底部附近,选择iOS Application (Preview)。然后在解决方案资源管理器中,右键单击项目/属性。结果目标是“.NET 6.0”和“iOS”-您想要的。
查看.csproj,它具有预期的<TargetFramework>net6.0-ios</TargetFramework>
您可以手动添加;net6.0-maccatalyst
但是:

  • 文件夹没有设置成多重目标。
  • 这可能是一种症状,即缺少与多目标相关的其他代码行和xml设置。
  • [可选]即使您没有使用Maui for UI,使用Maui.Essentials也可能很有用。我认为需要在应用程序启动过程中添加一些东西来初始化它。

我不推荐方法#1在这个时候-特别是因为你希望目标Mac也;你必须知道你在做什么,以便以一种简化你的开发过程的方式来组织一切。
除非有人能指出在没有Maui的情况下运行multi-platform net6的详细说明。

方法#2:Maui Application (Preview)。然后删除所有你不需要的东西,因为你没有使用Maui UI。

就我个人而言,我现在会这样做,让代码在iOS和Mac上运行。一旦你看到它的工作,你可以得到积极的删除的东西。

  • 修改iOSMac文件夹中的启动代码。启动一个“本机”根viewcontroller,而不是maui app builder。就像你今天在Xamarin.iOS中做的一样。

您可以 * 推迟 * 删除Maui UI代码和引用,直到最终的Maui版本。到那时,multi-platform net6应该更容易获得,而不依赖于Maui框架。
底线是:感觉像multi-platform net6没有被强调(短期),除了作为毛伊岛的一部分。即使net6 on iOS(和其他平台)在代码库中也是独立的。所以“顺其自然”,直到一切都是坚实的。

0x6upsns

0x6upsns2#

我已经升级到.net7了:
1.将库(取决于iOS)csproj升级为新格式:

<Project Sdk="Microsoft.NET.Sdk"> 
  <PropertyGroup> 
    <TargetFrameworks>net7.0-ios;net7.0-maccatalyst</TargetFrameworks> 
    <OutputType>Library</OutputType> 
    <AssemblyName>MYASSEMBLYNAME</AssemblyName> 
    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)'))
== 'ios'">12.0</SupportedOSPlatformVersion> 
    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)'))
== 'maccatalyst'">13.1</SupportedOSPlatformVersion> 
  </PropertyGroup>
...
</Project>

字符串
1.升级您的应用csproj:

<Project Sdk="Microsoft.NET.Sdk">   
  <PropertyGroup>
    <TargetFrameworks>net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
    <OutputType>Exe</OutputType>
    <UseMaui>true</UseMaui>
    <SingleProject>true</SingleProject>
    ...
    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)'))== 'ios'">13.0</SupportedOSPlatformVersion>
    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)'))== 'maccatalyst'">14.0</SupportedOSPlatformVersion>         
    <ApplicationTitle>MYAPPTITLE</ApplicationTitle>
    <ApplicationId>a.b.c</ApplicationId>
    <ApplicationIdGuid>aaadfffffaa....</ApplicationIdGuid>
    <ApplicationDisplayVersion>12.0</ApplicationDisplayVersion>
    <ApplicationVersion>12.0.0</ApplicationVersion>   
  </PropertyGroup>
 ...
 </Project>


2.2从csproj中删除所有.cs文件和所有xib、故事板文件。或者不添加它们,它们将自己添加。
2.3使用上下文菜单将所有xib、故事板文件构建操作更改为“界面定义”。
1.从info.plist中删除minoskey-value(因为它现在在csproj中)。
3.1将info.plist UIRequiredDeviceCapabilities从armv7更改为arm 64
3.2从maccatalystinfo.plist中删除LSRequiresIPhoneOS
1.创建文件夹Platforms/iOS和Platforms/MacCatalyst。将info.plist移动并复制到这些文件夹中。(否则您将无法使用通常的(应用程序)视图编辑信息列表)。
1.尽管它说我们使用Maui,但实际上我们并没有使用Maui,但它允许我们使用,编译多目标应用程序。如果您将其删除,您将无法选择要部署的Catalyst目标。您可以使用另一种方法,即复制应用程序csproj,并在第二个csproj中仅为Catalyst保留目标,这也将有效。
1.将特定于平台的代码放在上面的文件夹中,它们可能具有相同的类名和签名,并且将仅针对特定的平台进行编译。

相关问题