发布 Mac Catalyst 应用,以便在 Mac App Store 外发行

除了通过 Mac App Store 发布 Mac Catalyst 应用外,还有一种方法是在 Mac App Store 之外发布。 使用这种方法,Mac Catalyst 应用可以托管在选择的位置下载。 Apple 开发者计划和 Apple Developer Enterprise 计划的成员可以使用此分发方法。

分发 Mac Catalyst 应用要求使用预配配置文件预配应用。 预配配置文件是一种文件,其中包含代码签名信息,以及应用程序标识及其预期分发机制。

如果要在 Mac App Store 之外发布 .NET Multi-platform App UI (.NET MAUI) Mac Catalyst 应用,需要为其生成一个特定的发布配置文件。 此配置文件允许对要发布的应用进行数字签名,使其可安装在 Mac 上。 分发配置文件包含应用 ID 和开发者 ID 应用程序证书。 如果还没有开发者 ID 应用程序证书,则需要创建以便识别自己或组织。 此外,还需要创建开发者 ID 安装程序证书,以便签署应用的安装程序包。

在 Mac App Store 以外发布 .NET MAUI Mac Catalyst 应用的配置过程如下:

  1. 创建两个证书签名请求。 有关详细信息,请参阅创建证书签名请求
  2. 创建开发者 ID 应用程序证书。 有关详细信息,请参阅创建开发者 ID 应用程序证书
  3. 创建开发者 ID 安装程序证书。 有关详细信息,请参阅创建开发者 ID 安装程序证书
  4. 创建应用 ID。 有关详细信息,请参阅创建应用 ID
  5. 创建预配配置文件。 有关详细信息,请参阅创建预配配置文件
  6. 下载预配配置文件。 有关详细信息,请参阅 在 Xcode 中下载预配配置文件

重要说明

本文介绍如何使用 Apple 开发者项目中的 Apple 开发者帐户在 Mac App Store 以外进行分发的配置。 它还可用于属于 Apple 开发者企业版计划的 Apple 开发者帐户,因为所需的步骤大致相同。

然后,配置完成后,应该做好应用发布的准备工作,然后发布应用,并按下列流程公证应用:

  1. 也可以向应用添加权利。 有关详细信息,请参阅添加权利
  2. 更新应用的 Info.plist 文件。 有关详细信息,请参阅更新 Info.plist
  3. 禁用应用的代码签名验证。 有关详细信息,请参阅禁用代码签名验证
  4. 使用命令行发布应用。 有关更多信息,请参阅使用命令行发布
  5. 公证应用。 有关详细信息,请参阅公证应用

创建证书签名请求

在创建分发证书之前,首先需要在 Mac 上的 Keychain Access 中创建证书签名请求 (CSR):

  1. 在 Mac 上启动“密钥链访问”。

  2. 在“密钥链访问”中,选择“密钥链访问”>“证书助手”>“从证书颁发机构请求证书”菜单项。

  3. “证书助手”对话框中,在“用户电子邮件地址”字段中输入电子邮件地址。

  4. “证书助手”对话框中,在“公用名”字段中输入密钥名称。

  5. “证书助手”对话框中,将“CA 电子邮件地址”字段留空。

  6. “证书助手”对话框中,选择“保存到磁盘”单选按钮,然后选择“继续”

    证书助手对话。

  7. 将证书签名请求保存到已知位置。

  8. “证书助手”对话框中,选择“完成”按钮。

  9. 关闭密钥链访问。

重复此过程以创建第二个证书签名请求。 第一个 CSR 将用于创建开发者 ID 应用程序证书。 第二个证书将用于创建开发者 ID 安装程序证书。

重要说明

不能使用相同的证书签名请求来创建开发者 ID 应用程序证书和开发者 ID 安装程序证书。

创建开发者 ID 应用程序证书

CSR 允许生成开发者 ID 证书,用于确认身份。 必须使用 Apple 开发者帐户的 Apple ID 创建开发者 ID 证书:

  1. 在 Web 浏览器中,登录 Apple 开发者帐户

  2. 在 Apple 开发人员帐户中,选择“证书、ID 与配置文件”选项卡。

  3. 在“证书、标识符与配置文件”页上,选择 + 按钮创建新证书。

  4. “创建新证书 ”页上,点击“ 开发者 ID 应用程序” 单选按钮,然后点击“ 继续 ”按钮:

    创建开发者 ID 应用程序证书。

  5. “创建新证书 ”页上,点击 G2 Sub-CA 单选按钮,然后点击“ 选择文件

    上传开发者 ID 应用程序证书的证书签名请求。

  6. “选择要上传 的文件”对话框中,选择之前创建的第一个证书请求文件(文件扩展名为 .certSigningRequest 文件),然后选择“ 上传”。

  7. “创建新证书”页上,选择“继续”按钮:

    继续生成分发证书。

  8. “下载证书”页上,选择“下载”按钮:

    下载开发者 ID 应用程序证书。

    证书文件(带有 .cer 扩展名的文件)将下载到所选位置。

  9. 在 Mac 上,双击下载的证书文件,将证书安装到密钥链。 该证书显示在密钥链访问中的“我的证书”类别中,并从开发者 ID 应用程序开始

    显示开发者 ID 应用程序证书的“密钥链访问”。

    注意

    记下“密钥链访问”中的完整证书名称。 对应用签名时需要用到它。

创建开发者 ID 安装程序证书

CSR 允许您生成开发者 ID 安装程序证书,该证书是签署您的应用程序安装程序包所必需的。 必须使用 Apple 开发者帐户的 Apple ID 创建安装程序证书:

  1. 在 Apple 开发人员帐户中,选择“证书、ID 与配置文件”选项卡。

  2. 在“证书、标识符与配置文件”页上,选择 + 按钮创建新证书。

  3. “创建新证书 ”页上,点击“ 开发者 ID 安装程序 ”单选按钮,然后点击“ 继续 ”按钮:

    创建开发者 ID 安装程序证书。

  4. “创建新证书 ”页上,点击 G2 Sub-CA 单选按钮,然后点击“ 选择文件

    上传开发者 ID 安装程序证书的证书签名请求。

  5. “选择要上传的文件”对话框中,选择之前创建的第二个证书请求文件(文件扩展名为.certSigningRequest文件),然后选择“上传”。

  6. “创建新证书”页上,选择“继续”按钮:

    继续生成安装程序证书。

  7. “下载证书”页上,选择“下载”按钮:

    下载分发证书。

    证书文件(带有 .cer 扩展名的文件)将下载到所选位置。

  8. 在 Mac 上,双击下载的证书文件,将证书安装到密钥链。 证书显示在密钥链访问中的“我的证书”类别中,并从开发人员 ID 安装程序开始

    显示安装程序证书的“密钥链访问”。

    注意

    记下“密钥链访问”中的完整证书名称。 对应用签名时需要用到它。

创建分发配置文件

通过分发预配配置文件可以对将要发布的 .NET MAUI Mac Catalyst 应用进行数字签名,以便它可以安装在另一个 Mac 上。 Mac App Store 外部分发的预配配置文件包含应用 ID 和开发人员 ID 应用程序证书。

创建 App ID

识别正在分发的应用时,需要使用应用 ID。 应用 ID 类似于反向 DNS 字符串,是应用的唯一识别标识,应当与应用的捆绑标识符相同。 可以使用在将应用部署至设备进行测试时使用的相同应用 ID。

有两种类型应用 ID:

  • 通配符。 通过通配符应用 ID 可以使用单个应用 ID 匹配多个应用,其形式通常为 com.domainname.*。 通配符应用 ID 可用于分发多个应用,并且应当用于不启用特定于应用功能的应用。
  • 精确。 显式应用 ID 对单个应用是唯一的,通常采用 com.domainname.myid 形式。 显式应用 ID 允许分发一个应用,其中包含一个匹配的捆绑标识符。 显式应用 ID 通常用于启用特定于应用功能的应用,例如 Apple Pay 或 Game Center。 有关功能的详细信息,请参阅功能

创建新的应用 ID。

  1. 在 Apple 开发者帐户中,导航到“证书、ID 和配置文件”。

  2. 在“证书、标识符和配置文件”页上,选择“标识符”选项卡

  3. “标识符”页上,选择 + 按钮创建新的应用 ID。

  4. “注册新标识符”页上,依次选择“应用 ID”单选按钮与“继续”按钮:

    创建应用 ID。

  5. “注册新标识符”页上,依次选择“应用”“继续”按钮:

    注册应用 ID。

  6. “注册应用 ID”页上,输入说明,然后选择“显式”“通配符”捆绑 ID 单选按钮。 然后,以反向 DS 格式输入应用的捆绑 ID:

    指定应用的捆绑包标识符。

    重要

    输入的捆绑 ID 必须与应用项目中 Info.plist 文件中的捆绑标识符相对应。

    .NET MAUI 应用的捆绑标识符以应用 ID 属性的形式存储在项目文件中。 在 Visual Studio 的“解决方案资源管理器”中,右键单击 .NET MAUI 应用项目,然后选择“属性”。 然后,导航到“MAUI 共享”>“常规”选项卡。“应用 ID”字段列出捆绑标识符。

    更新“应用 ID”字段的值时,Info.plist 中的“捆绑标识符”的值将自动更新。

  7. “注册应用 ID”页上,选择应用使用的任何功能。 必须在此页上和应用项目中的 Entitlements.plist 文件中配置任何功能。 有关详细信息,请参阅功能权利

  8. “注册应用 ID”页上,选择“继续”按钮。

  9. “确认应用 ID”页上,选择“注册”按钮。

创建预配配置文件

创建应用 ID 后,应创建分发预配配置文件。 此配置文件允许对要发布的应用进行数字签名,使其可安装在 Mac 上。

若要为 Mac App Store 外部的分发创建预配配置文件,请执行以下操作:

  1. 在 Apple 开发人员帐户的“证书、标识符和配置文件”页中,选择“配置文件”选项卡。

  2. 在“配置文件”选项卡中,单击 + 按钮创建新配置文件。

  3. “注册新的预配配置文件”页中,单击“继续”按钮之前,先点击“开发人员 ID”单选按钮:

    在 App Store 外部注册预配配置文件分发。

  4. “生成预配配置文件”页中,选择“Mac Catalyst”单选按钮。 然后,在“应用 ID”下拉列表中,选择之前创建的应用 ID,然后单击“继续”按钮:

    选择应用 ID。

  5. “生成预配配置文件”页中,选择对应于分发证书的单选按钮,然后单击“继续”按钮:

    选择分发证书。

  6. “生成预配配置文件”页中,输入预配配置文件的名称,然后单击“生成”按钮:

    生成预置描述文件。

    注意

    记下预配配置文件名称,因为对应用签名时需要用到它。

  7. “生成预配配置文件”页中,可以选择单击“下载”按钮下载预配配置文件。

    注意

    此时无需下载预配配置文件。 相反,你将在 Xcode 中执行此操作。

在 Xcode 中下载预配配置文件

在 Apple 开发人员帐户中创建预配配置文件后,Xcode 可以将其下载,使其可用于对应用签名:

  1. 在 Mac 上,启动 Xcode。

  2. 在 Xcode 中 ,选择“Xcode”>“首选项...”菜单项。

  3. “首选项”对话框中,选择“帐户”选项卡。

  4. “帐户”选项卡中,单击 + 按钮将 Apple 开发人员帐户添加到 Xcode:

    首选项中的“Xcode 帐户”对话框。

  5. 在“帐户类型”弹出窗口中,选择“Apple ID”,然后单击“继续”按钮:

    Xcode 选择要添加弹出窗口的帐户类型。

  6. 在“登录”弹出窗口中,输入 Apple ID 并单击“下一步”按钮。

  7. 在“登录”弹出窗口中,输入 Apple ID 密码,然后单击“下一步”按钮:

    Xcode Apple 帐户登录。

  8. “帐户”选项卡中,单击“管理证书...”按钮,以确保已下载分发证书。

  9. “帐户”选项卡中,单击“下载手动配置文件”按钮下载预配配置文件:

    Xcode Apple 开发人员计划帐户详细信息。

  10. 等待下载完成,然后关闭 Xcode。

添加权利

Apple 的应用沙盒限制对 Mac 应用中的系统资源和用户数据的访问,以防当应用遭到入侵时遭受破坏。 可以选择在分发到 Mac App Store 之外的 Mac Catalyst 应用中启用。

这可以通过将 Entitlements.plist 文件添加到 .NET MAUI 应用项目的 Platforms/MacCatalyst 文件夹实现:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
  </dict>
</plist>

应用沙盒权利是使用 boolean 类型的 com.apple.security.app-sandbox 密钥定义的。 有关应用沙盒的信息,请参阅 developer.apple.com 上的使用应用沙盒保护用户数据。 有关应用沙盒权利的信息,请参阅 应用沙盒权利

如果应用打开传出网络连接,则还需要将 boolean 类型的 com.apple.security.network.client 密钥添加到 Entitlements.plist 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>com.apple.security.app-sandbox</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
  </dict>
</plist>

有关传出网络连接权利的信息,请参阅 developer.apple.com 上的 com.apple.security.network.client

Update Info.plist

在发布您的应用程序之前,您应该更新其Info.plist文件,添加额外信息。

指定用户界面风格

Mac Catalyst 应用可以在 iPad 或 Mac 用户界面风格中运行:

  • iPad 用户界面风格告知 macOS 缩放应用的用户界面,以匹配 Mac 显示环境,同时保留类似 iPad 的外观。
  • Mac 用户界面风格不会缩放应用的用户界面以匹配 Mac 显示环境。 某些控件可以更改其大小和外观,同其交互的感觉与同 AppKit 控件交互的感觉相同。

默认情况下,.NET MAUI Mac Catalyst 应用使用 iPad 用户界面风格。 如果这是你所需的行为,请确保应用的 Info.plist 文件仅将 2 指定为 UIDeviceFamily 密钥的值:

<key>UIDeviceFamily</key>
<array>
  <integer>2</integer>
</array>

若要采用 Mac 用户界面风格,请更新应用的 Info.plist 文件,从而将 6 指定为 UIDeviceFamily 密钥的值:

<key>UIDeviceFamily</key>
<array>
  <integer>6</integer>
</array>

有关 Mac Catalyst 用户界面风格的详细信息,请参阅指定 Mac Catalyst 应用的 UI 风格

设置应用的默认语言和区域

将应用的 Info.plist 中的 CFBundleDevelopmentRegion 密钥设置为表示本地化本机开发区域的 string

<key>CFBundleDevelopmentRegion</key>
<string>en</string>

密钥的值应为语言指示符,具有可选的区域指示符。 有关详细信息,请参阅 developer.apple.com 上的 CFBundleDevelopmentRegion

将应用的 Info.plist 中的 NSHumanReadableCopyright 密钥设置为表示关于应用的人工可读版权声明的 string

<key>NSHumanReadableCopyright</key>
<string>MyMauiApp © 2023</string>

有关详细信息,请参阅 developer.apple.com 上的 NSHumanReadableCopyright

声明应用使用加密

如果你的应用使用加密,并且计划在美国或加拿大境外将其分发,则会受到美国出口合规性规定的约束。 可以在其 Info.plist 文件中提供有关应用使用加密的信息。

通过使用指示你的应用是否使用加密的 boolean 值将 ITSAppUsesNonExemptEncryption 密钥添加到应用的 Info.plist 实现:

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

有关详细信息,请参阅 developer.apple.com 上的遵守加密出口条例

禁用代码签名验证

目前,当你尝试发布一个 NET MAUI Mac Catalyst 应用程序以在 Mac App Store 之外分发时,只要你满足预配要求,你将收到一个关于 codesign 退出代码 3 的错误:

/usr/local/share/dotnet/packs/Microsoft.MacCatalyst.Sdk/16.2.1040/tools/msbuild/iOS/Xamarin.Shared.targets(1930,3): error MSB6006: "codesign" exited with code 3. [/Users/davidbritch/Projects/MyMauiApp/MyMauiApp/MyMauiApp.csproj::TargetFramework=net8.0-maccatalyst]

虽然codesign成功签署了您的应用程序,但_CodesignVerify目标无法验证代码签名。

test-requirement: code failed to satisfy specified code requirement(s)

由于此故障,未生成 .pkg 文件。

因此,目前有必要将以下生成目标添加到项目文件的末尾,以禁用对代码签名的验证:

<Project Sdk="Microsoft.NET.Sdk">
  ...
  <Target Name="_SkipCodesignVerify" BeforeTargets="_CodesignVerify" AfterTargets="_CodesignAppBundle">  
    <PropertyGroup>    
      <_RequireCodeSigning>false</_RequireCodeSigning>  
    </PropertyGroup>
  </Target>
</Project>

使用命令行发布

若要从 Mac 上的命令行发布 Mac Catalyst 应用,请打开终端并导航到 .NET MAUI 应用项目的文件夹。 运行 dotnet publish 命令,提供以下参数:

参数
-f--framework 目标框架,即 net8.0-maccatalyst
-c--configuration 生成配置,即 Release
-p:MtouchLink 项目的链接模式,可以是 NoneSdkOnly 或者 Full
-p:CreatePackage 设置为 true,从而在生成结束时为应用创建包 (.pkg)。
-p:EnableCodeSigning 设置为 true,从而启用代码签名。
-p:EnablePackageSigning 设置为 true,使创建的包得到签名。
-p:CodesignKey 代码签名密钥的名称。 按照密钥链访问中所示设置为分发证书的名称。
-p:CodesignProvision 对应用捆绑包签名时要使用的预配配置文件。
-p:CodesignEntitlements 指定应用所需权利的权利文件的路径。 设置为 Platforms\MacCatalyst\Entitlements.plist
-p:PackageSigningKey 对包签名时要使用的包签名密钥。 按照密钥链访问中所示设置为安装程序证书的名称。
-p:RuntimeIdentifier 项目的运行时标识符 (RID)。 发布 .NET MAUI Mac Catalyst 应用的内部版本默认为使用 maccatalyst-x64maccatalyst-arm64 用作运行时标识符,以支持通用应用。 若要仅支持单个体系结构,请指定 maccatalyst-x64maccatalyst-arm64
-p:UseHardenedRuntime 设置为 true 启用强化的运行时,这是 Mac Catalyst 应用在 Mac App Store 外部分发所必需的。

警告

尝试发布 .NET MAUI 解决方案将会导致 dotnet publish 命令尝试单独发布解决方案中的每个项目,当你已经将其他项目类型添加到解决方案时,这可能会导致出现问题。 因此,dotnet publish 命令的范围应限定为 .NET MAUI 应用项目。

可以在命令行上指定其他生成参数,前提是你的项目文件中的 <PropertyGroup> 未提供这些参数。 下表列出了一些常用参数:

参数
-p:ApplicationTitle 应用的用户可见名称。
-p:ApplicationId 应用的唯一标识符,例如 com.companyname.mymauiapp
-p:ApplicationVersion 标识应用迭代的生成版本。
-p:ApplicationDisplayVersion 应用的版本号。
-p:RuntimeIdentifier 项目的运行时标识符 (RID)。 发布 .NET MAUI Mac Catalyst 应用的内部版本默认为使用 maccatalyst-x64maccatalyst-arm64 用作运行时标识符,以支持通用应用。 若要仅支持单个体系结构,请指定 maccatalyst-x64maccatalyst-arm64

有关生成属性的完整列表,请参阅 项目文件属性

重要说明

所有这些参数的值不必在命令行上提供。 还可以在项目文件中提供它们。 当在命令行上和项目文件中提供参数时,命令行参数优先。 有关在项目文件中提供生成属性的详细信息,请参阅 在项目文件中定义生成属性

例如,使用以下命令在 Mac 上生成和签名 .pkg ,以便在 Mac App Store 外部分发:

dotnet publish -f net8.0-maccatalyst -c Release -p:MtouchLink=SdkOnly -p:CreatePackage=true -p:EnableCodeSigning=true -p:EnablePackageSigning=true -p:CodesignKey="Developer ID Application: John Smith (AY2GDE9QM7)" -p:CodesignProvision="MyMauiApp (Non-App Store)" -p:CodesignEntitlements="Platforms\MacCatalyst\Entitlements.plist" -p:PackageSigningKey="Developer ID Installer: John Smith (AY2GDE9QM7)" -p:UseHardenedRuntime=true

注意

在 .NET 8 中,dotnet publish 命令默认为 Release 配置。 因此,可以从命令行中省略生成配置。

发布生成、签名和打包应用,然后将 .pkg 复制到 bin/Release/net8.0-maccatalyst/publish/ 文件夹。 如果仅使用单个体系结构发布应用,则会将其发布到 bin/Release/net8.0-maccatalyst/{architecture}/publish/ 文件夹。

在签名过程中,可能需要输入登录密码并允许 codesignproductbuild 运行:

允许 codesign 为 Mac 上的应用签名。允许 productbuild 在 Mac 上为你的应用签名。

有关 dotnet publish 命令的更多信息,请参阅 dotnet publish

在项目文件中定义生成属性

在命令行上指定生成参数的替代方法是在 <PropertyGroup> 内的项目文件中指定它们。 下表列出了一些常见的生成属性:

属性
<ApplicationTitle> 应用的用户可见名称。
<ApplicationId> 应用的唯一标识符,例如 com.companyname.mymauiapp
<ApplicationVersion> 标识应用迭代的生成版本。
<ApplicationDisplayVersion> 应用的版本号。
<CodesignKey> 代码签名密钥的名称。 按照密钥链访问中所示设置为分发证书的名称。
<CodesignEntitlements> 指定应用所需权利的权利文件的路径。 设置为 Platforms\MacCatalyst\Entitlements.plist
<CodesignProvision> 对应用捆绑包签名时要使用的预配配置文件。
<CreatePackage> 设置为 true,从而在生成结束时为应用创建包 (.pkg)。
<EnableCodeSigning> 设置为 true,从而启用代码签名。
<EnablePackageSigning> 设置为 true,使创建的包得到签名。
<MtouchLink> 项目的链接模式,可以是 NoneSdkOnly 或者 Full
<PackageSigningKey> 对包签名时要使用的包签名密钥。 按照密钥链访问中所示设置为安装程序证书的名称。
<RuntimeIdentifier> 项目的运行时标识符 (RID)。 发布 .NET MAUI Mac Catalyst 应用的内部版本默认为使用 maccatalyst-x64maccatalyst-arm64 用作运行时标识符,以支持通用应用。 若要仅支持单个体系结构,请指定 maccatalyst-x64maccatalyst-arm64
<UseHardenedRuntime> 设置为 true 启用强化的运行时,这是 Mac Catalyst 应用在 Mac App Store 外部分发所必需的。

有关生成属性的完整列表,请参阅 项目文件属性

重要说明

这些生成属性的值不必在项目文件中提供。 发布应用时,还可以在命令行上提供它们。 这可以让你省略项目文件中的特定值。

以下示例显示了一个典型的属性组,用于生成和签名 Mac Catalyst 应用,以便在 Mac App Store 外部分发:

<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-maccatalyst|AnyCPU'">
  <MtouchLink>SdkOnly</MtouchLink>
  <EnableCodeSigning>True</EnableCodeSigning>
  <EnablePackageSigning>true</EnablePackageSigning>
  <CreatePackage>true</CreatePackage>
  <CodesignKey>Developer ID Application: John Smith (AY2GDE9QM7)</CodesignKey>
  <CodesignProvision>MyMauiApp (Non-App Store)</CodesignProvision>
  <CodesignEntitlements>Platforms\MacCatalyst\Entitlements.plist</CodesignEntitlements>
  <PackageSigningKey>Developer ID Installer: John Smith (AY2GDE9QM7)</PackageSigningKey>
  <UseHardenedRuntime>true</UseHardenedRuntime>
</PropertyGroup>

本示例 <PropertyGroup> 添加了条件检查,除非条件检查通过,否则阻止处理设置。 条件检查着重于两项:

  1. 生成配置设置为 Release
  2. 目标框架设置为包含文本 net8.0-maccatalyst 的内容。
  3. 平台设置为 AnyCPU

如果上述任一条件失败,则不会处理设置。 更重要的是,不会设置 <CodesignKey><CodesignProvision><PackageSigningKey> 设置,从而阻止对应用签名。

添加上述属性组后,可以通过打开终端并导航到 .NET MAUI 应用项目的文件夹,从 Mac 上的命令行发布应用。 然后,运行以下命令:

dotnet build -f net8.0-maccatalyst -c Release

注意

在 .NET 8 中,dotnet publish 命令默认为 Release 配置。 因此,可以从命令行中省略生成配置。

发布生成、签名和打包应用,然后将 .pkg 复制到 bin/Release/net8.0-maccatalyst/publish/ 文件夹。

对应用进行公证

macOS 包含一项名为 Gatekeeper 的技术,它有助于确保只有受信任的软件才能在 Mac 上运行。 当用户下载并打开安装程序包或应用时,Gatekeeper 会验证软件是否来自已识别的开发人员。 为此,它通过检查开发人员 ID 证书,并检查 Apple 是否对软件进行了公证,以确保其不含已知的恶意内容并且未被篡改。 因此,预配和发布应用后,应将其提交到 Apple 进行公证。 Apple 的公证服务会自动扫描开发人员 ID 签名的应用并执行安全检查。 当公证成功时,您的软件将被分配一张票证,以让 Gatekeeper 知道它已经被公证。

应用可以使用命令行工具提交到 Apple 的公证服务 notarytool

xcrun notarytool submit {my_package_filename} --wait --apple-id {my_apple_id} --password {my_app_specific_password} --team-id {my_team_id}

以下是使用 notarytool 该工具对 .NET MAUI Mac Catalyst .pkg 文件进行签名的示例:

xcrun notarytool submit MyMauiApp-1.0.pkg --wait --apple-id johm.smith@provider.com --password fqtk-cprr-gqdt-bvyo --team-id AY2GDE9QM7

标志 wait 指示 notarytool 仅在公证服务完成提交处理后退出,因此无需轮询服务的状态。 apple-idpasswordteam-id 参数用于提供 App Store Connect 凭据。 App Store Connect 需要双重身份验证,因此必须为 notarytool 创建特定于应用的密码。 有关创建特定于应用的密码信息,请参阅 developer.apple.com 上的 使用特定于应用的密码,使用 Apple ID 登录应用

向 Apple 提交申请后,公证过程一般不超过一小时。

注意

大多数应用的公证在 5 分钟内完成。 有关避免公证服务响应时间过长的信息,请参阅 developer.apple.com 上的避免公证服务响应时间过长和大小限制

如果公证成功,公证服务会为已签名的安装程序包及其中的应用捆绑包生成票据。

有关公证的详细信息,请参阅分发前公证 macOS 软件。 有关将应用提交到 Apple 公证服务的其他方法,请参阅在 developer.apple.com 上将应用上传到公证服务。 有关解决常见公证问题的信息,请参阅解决常见的公证问题

将票证装到应用

公证会为已签名的安装程序包及其中的应用捆绑包生成一个票证,告知 Gatekeeper 应用已经公证。 公证完成后,用户尝试在 macOS 10.14 或更高版本上运行应用时,Gatekeeper 会在线查找票证。

公证成功后,应使用 stapler 工具将票证附加到应用。 这可确保没有网络连接时,Gatekeeper 也能找到票证。 运行下列命令,将票证附加到.pkg

xcrun stapler staple {filename}.pkg

stapler 工具会检索票证,并将其附加到安装程序包中。 如果装订成功,你将收到一条信息,告知装订和验证操作已成功。

验证公证

如果要验证公证,可以使用以下命令:

xcrun stapler validate mypackage.pkg

分发应用

经签名和公证的 .pkg 可以安全地在 Mac App Store 之外发布,发布地点任选,例如网络服务器。

有关在 Mac 上安全打开应用的信息,请参阅 support.apple.com 上的在 Mac 上安全地打开应用

另请参阅