.Net Maui iOS 本机绑定,用于创建 .Net Maui Nuget 包

.Net Maui iOS Native Binding to create a .Net Maui Nuget package

提问人:helper 提问时间:7/22/2023 更新时间:8/22/2023 访问量:410

问:

我有一个 .net Maui 本机 iOS 绑定一些 iOS 框架。我设法成功绑定。但是,我想创建一个 .Net Maui 类库来使用 iOS 本机绑定。请参阅下面的项目结构:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net7.0;net7.0-android;net7.0-ios</TargetFrameworks>
        <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
        <!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
        <UseMaui>true</UseMaui>
        <SingleProject>true</SingleProject>
        <ImplicitUsings>enable</ImplicitUsings>

        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">16.1</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
    </PropertyGroup>

    <PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net7.0-ios|AnyCPU'">
      <CreatePackage>false</CreatePackage>
    </PropertyGroup>
    <ItemGroup>
      <ProjectReference Include="..\NativeSdk.Android\NativeSdk.Android.csproj" />

      <ProjectReference Include="..\NativeSdk.iOS\NativeSdk.iOS.csproj" />
    </ItemGroup>
    <ItemGroup Condition=" '$(TargetFramework)' == 'net7.0-ios' ">
  <ProjectReference Include="Path\To\Your\iOSNativeBindingProject.csproj" />
</ItemGroup>
    <ItemGroup>
      <None Remove="Platforms\Android\Models\" />
      <None Remove="Platforms\Android\Aar\" />
      <None Remove="Platforms\Android\Aar\TransaktSDK.aar" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="Platforms\Android\Models\" />
      <Folder Include="Platforms\Android\Aar\" />
    </ItemGroup>
    <ItemGroup>
       <AndroidAarLibrary Include="Platforms\Android\Aar\TransaktSDK.aar">
          <AndroidSkipResourceProcessing></AndroidSkipResourceProcessing>
      </AndroidAarLibrary>
    </ItemGroup>
    <ItemGroup>
      <Compile Condition=" '$(EnableDefaultCompileItems)' == 'true' " Update="SecureServiceInfo.cs">
        <ExcludeFromCurrentConfiguration>true</ExcludeFromCurrentConfiguration>
      </Compile>
    </ItemGroup>
</Project>

我尝试在我的本机绑定项目上添加其他平台以避免兼容性问题。我还添加了条件以尝试仅使用 ios 进行编译。当我这样做时,apiDefinition 类中的所有文件都会中断。请参阅下面的本机 iOS 项目

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   <TargetFrameworks>net7.0-ios;net7.0;net7.0-android;net7.0-maccatalyst</TargetFrameworks>
    <Nullable>enable</Nullable>
    <ImplicitUsings>true</ImplicitUsings>
    <IsBindingProject>true</IsBindingProject>
  </PropertyGroup>

<!--  <ItemGroup>
    <Compile Remove="StructsAndEnums.cs" />
    <Compile Remove="ApiDefinitions.cs" />
  </ItemGroup>-->
  <ItemGroup>
    <ObjcBindingCoreSource Include="StructsAndEnums.cs" />
  </ItemGroup>
  <ItemGroup>
    <ObjcBindingApiDefinition Include="ApiDefinitions.cs" />
  </ItemGroup>
  <ItemGroup Condition="'$(TargetFramework)' == 'net7.0-ios'">
    <NativeReference Include="..\..\..\..\..\Downloads\nativeSKD_iOS\NativeSDK.xcframework">
      <Kind>Framework</Kind>
      <Frameworks>Foundation</Frameworks>
      <ForceLoad>True</ForceLoad>
    </NativeReference>
  </ItemGroup>
</Project>

我已经坚持了好几天了。我只想创建一个 maui 类库,包括我的本机 iOS 绑定项目

Xamarin.Forms Xamarin.iOS Maui NuGet-Package 类库

评论


答:

0赞 Jessica 8/11/2023 #1

为什么要创建 MAUI 类库?可以直接在 .NET MAUI 应用项目中引用 iOS 绑定库创建的 dll。或者,可以从 iOS 绑定库创建 nuget,并在 .NET MAUI 应用项目中使用它。

评论

1赞 Community 8/14/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 zegee29 8/22/2023 #2

不幸的是,你还有很长的路要走:-/

MAUI 与 Xamarin 相同,具有许多必须精确完成的配置。

从你的例子中,我看不出来

<ObjcBindingApiDefinition Include="..\NativeSdk.iOS\ApiDefinitions.cs" />

该^必须由Sharpie工具生成。此外,Sharpie 输出不是 100% 正确的,您必须在这里和那里修复一些部件。

然后,你看起来差不多了,请添加SmartLink:

<NativeReference Include="..\..\..\..\..\Downloads\nativeSKD_iOS\NativeSDK.xcframework">
  <Kind>Framework</Kind>
  <Frameworks>Foundation</Frameworks>
  <ForceLoad>True</ForceLoad>
  <SmartLink>False</SmartLink>
</NativeReference>

否则 ForceLoad 将被忽略(取决于 env conf,但添加它以确保)。

最后的建议是,你应该在这里写一个你看到的错误,否则它真的是我们的尝试和失败的提示。