跳到内容

MAUI Dotnet

要集成 SDK,您的 MAUI 项目需要满足以下包版本、目标框架和最低操作系统版本要求:

  • Pushwoosh.DotNet 2.1.0 或更高版本。该包提供适用于 .NET 8 和 .NET 10 的构建(net10.0-android36.0 和 net10.0-ios26.0)。

  • Android:目标框架 net8.0-android34.0 或更高版本,设备 API 23 或更高版本。在 .NET 8 SDK 上,单纯的 net8.0-android 会解析为 android34.0。

  • iOS:设备 iOS 15.0 或更高版本。在项目文件中设置最低版本:

    <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>

    如果设置的值更低,构建会以 error PW0001 停止。

SDK 集成

Anchor link to

1. 将 Pushwoosh.DotNet Nuget 包添加到 Android 和 iOS 项目中:

2. 如果需要,请接受传递性 Android 依赖项的许可证:

3. 在 Firebase Console 中配置您的项目。

4. 将 google-services.json 添加到您的 Android 平台目录的根目录。为此文件设置 GoogleServicesJson 构建操作:

5. 在 MainApplication.cs 中声明命名空间之前添加以下行(此处的 XXXXX-XXXXX 是您的 Pushwoosh Application Code):

[assembly: MetaData("com.pushwoosh.appid", Value = "XXXXX-XXXXX")]

6. 在您的 MainApplication.cs 中,重写 OnCreate(),并在 base.OnCreate(); 之前调用 PushManager.Init();:

using Android.App;
using Android.Runtime;
using Pushwoosh.Android;
...
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
public override void OnCreate()
{
PushManager.Init();
base.OnCreate();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

base.OnCreate() 会构建 MAUI 应用并创建 App,而 App 已经在使用 PushManager.Instance。不要在 MainActivity.OnCreate 中调用 PushManager.Init()。Activity 在 App 之后创建,因此当 App 需要 PushManager.Instance 时,它仍然是 null。

7. 在您的 AndroidManifest.xml 中,添加以下内容:

<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_TYPE_API_TOKEN" />

重要提示: 确保 Device API token (设备 API 令牌) 在您的 Pushwoosh Control Panel 中有权访问正确的应用程序。了解更多

8. 在 iOS 平台文件夹中,创建带有 aps-environment 键的 Platforms/iOS/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>aps-environment</key>
<string>development</string>
</dict>
</plist>

没有此 entitlement,iOS 不会签发 APNs 设备令牌,因此 Register() 总是失败。调试构建请使用 development。分发构建需要 production 以及启用了推送通知的描述文件(provisioning profile)。

9. 在您的项目文件(.csproj)中,将 iOS 目标指向 entitlements 文件:

<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
<CodesignEntitlements>Platforms/iOS/Entitlements.plist</CodesignEntitlements>
</PropertyGroup>

10. 在您的 iOS 项目的 AppDelegate.cs 中,在 FinishedLaunching 方法的开头调用 PushManager.Init();:

using Foundation;
using UIKit;
using Pushwoosh.iOS;
...
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
PushManager.Init();
return base.FinishedLaunching(application, launchOptions);
}

11. 将这些方法添加到 AppDelegate。MauiUIApplicationDelegate 类默认不导出这些方法,因此请手动添加:

[Export("application:didReceiveRemoteNotification:fetchCompletionHandler:")]
public void DidReceiveRemoteNotification(UIKit.UIApplication application, NSDictionary userInfo, Action<UIKit.UIBackgroundFetchResult> completionHandler)
{
PushManager.Instance.ReceivedRemoteNotification(userInfo);
}
[Export("application:didRegisterForRemoteNotificationsWithDeviceToken:")]
public void RegisteredForRemoteNotifications(UIKit.UIApplication application, NSData deviceToken)
{
PushManager.Instance.RegisteredForRemoteNotifications(deviceToken);
}
[Export("application:didFailToRegisterForRemoteNotificationsWithError:")]
public void FailedToRegisterForRemoteNotifications(UIKit.UIApplication application, NSError error)
{
PushManager.Instance.FailedToRegisterForRemoteNotifications(error);
}

12. 在 Info.plist 中,将 Pushwoosh_APPID 值更改为您的 Pushwoosh Application Code。您可以在您的 Control Panel 中找到它:

Xcode 中的 Info.plist,其中 Pushwoosh_APPID 键已设置为应用程序代码

13. 在 Info.plist 中,将 Pushwoosh_API_TOKEN 键设置为您的 Pushwoosh Device API Token (设备 API 令牌)。

重要提示: 请务必为该令牌授予访问您 Pushwoosh Control Panel 中正确应用程序的权限。了解更多

14. 在 App.xaml.cs 的跨平台部分,在 OnStart 方法中调用 Register()。它会向用户请求通知权限,并为设备注册推送通知:

using PushwooshSDK.DotNet.Core;
...
public partial class App : Application
{
...
protected override void OnStart()
{
base.OnStart();
PushManager.Instance.Register();
}
}

从 2.0.x 升级到 2.1.0

Anchor link to

如果您的应用是按照本指南的早期版本设置的,请在更新到 2.1.0 时进行以下更改:

  • 在 Android 上,将 PushManager.Init() 从 MainActivity.OnCreate 移到 MainApplication.OnCreate 中 base.OnCreate() 之前,如第 6 步所示。如果您使用 Geozones,也请将 LocationManager.Init() 移到那里,紧接在 PushManager.Init() 之后。
  • 从 Resources/values/strings.xml 中删除 com.pushwoosh.senderid 元数据行和 fcm_sender_id 字符串。SDK 不会读取它们。
  • 在 iOS 上,如果您的应用还没有第 8 步和第 9 步中的 aps-environment entitlement,请添加它。
  • 将 iOS 目标的 SupportedOSPlatformVersion 提高到 15.0,如要求中所示。MAUI 8 项目模板设置的是 11.0。
  • 如果您的应用使用 Geozones,请将 Pushwoosh.DotNet.Geozones 与 Pushwoosh.DotNet 一起更新到 2.1.0。使用 Geozones 2.0.x 时,构建会以 error PW0002 停止。
  • iOS 上的 PWInlineInAppView 已标记为 [Obsolete] 且不显示任何内容,因为原生 iOS SDK 7.x 不支持内嵌应用内消息。请将其从您的布局中删除。

Windows 用户请注意: 在构建时,您可能会遇到与文件路径长度相关的问题。 这是因为 Visual Studio 使用的目录和 Pushwoosh SDK 内的文件路径的组合长度超过了 Windows 260 个字符的最大路径长度限制。 要解决此问题,请在 Windows 注册表中启用 LongPathsEnabled 设置。

与我们分享您的反馈

Anchor link to

您的反馈有助于我们创造更好的体验,因此,如果您在 SDK 集成过程中遇到任何问题,我们非常希望听到您的声音。如果您遇到任何困难,请随时通过此表单与我们分享您的想法。