因此,我有一个专门针对 Android 的 .NET MAUI 移动应用程序,它通过
OnMessageReceived()
方法和 OnNewToken()
使用意图过滤器和服务实现了推送通知。
在开发过程中,当我在连接的设备上运行应用程序时,一切都运行良好,并且按预期收到了
OnMessageReceived()
。
但是,当将其发布到 APK 文件而不是调用
OnMessageReceived()
时,即使在前台也会显示本地通知。我没有启用此功能的代码。
不确定这是 .NET MAUI 特定问题还是与 firebase 有关。 我接收通知的代码是:
[Service(Exported = false)]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class PushNotificationFirebaseMessagingService : FirebaseMessagingService
{
/// <summary>
/// Called when a new token is created
/// </summary>
/// <param name="token">The token created</param>
public override void OnNewToken(string token)
{
try
{
// Set the token name to secure storage
SecureStorage.SetAsync(Constants.PushNotificationTokenName, token)
.SafeFireAndForget(false);
}
catch (Exception)
{
// Could be secure storage is not supported
}
}
/// <summary>
/// Called when any new notification hub message is received
/// </summary>
/// <param name="message">The message received</param>
public override void OnMessageReceived(RemoteMessage message)
{
// Code executed on UI here
}
}
}
还有我的 MainActivity.cs 代码...
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.PostNotifications) != Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.PostNotifications }, 0);
}
CreateNotificationChannelIfNeeded();
}
private void CreateNotificationChannelIfNeeded()
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
CreateNotificationChannel();
}
}
private void CreateNotificationChannel()
{
var channelId = $"{PackageName}.general";
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
var channel = new NotificationChannel(channelId, "General", NotificationImportance.Default);
notificationManager.CreateNotificationChannel(channel);
FirebaseCloudMessagingImplementation.ChannelId = channelId;
//FirebaseCloudMessagingImplementation.SmallIconRef = Resource.Drawable.ic_push_small;
}
注意事项:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
好吧,我发现了问题,似乎是启用了修剪后,修剪了发布时推送通知的某些功能。因此,请确保通过 右键单击项目 > 搜索“修剪” > 取消选择发布
将其关闭您可以首先重新检查您是否已将用于发布的 SHA-1 签名密钥添加到您的 Firebase 控制台。
对于发布版本,有不同的 SHA-1 密钥。
您可以尝试以下步骤:
SHA-1
以供发布SHA-1
添加到 firebase 控制台google-services.json
。注意: 确保 Play 商店用于签署您的版本的密钥是 也在步骤2中添加了
有一些关于这个问题的类似帖子,你可以在这里查看:
虽然禁用修剪和 AOT 效果很好,但它会显着增加文件大小。因此,我建议确定需要保持未修剪的特定库并命名它们。
LinkerConfig.xml 像这样:
<linker>
<!-- Preserve the entire Firebase Messaging library -->
<assembly fullname="Xamarin.Firebase.Messaging" preserve="all" />
<assembly fullname="Plugin.Firebase" preserve="all" />
<!-- Alternatively, preserve only the specific service -->
<assembly fullname="Namespace">
<type fullname="Namespace.CustomFirebaseMessagingService" preserve="all" />
</assembly>
</linker>
还将这些添加到您的 csproj 中:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net7.0-android33.0|AnyCPU'">
<PublishTrimmed>True</PublishTrimmed>
<RunAOTCompilation>False</RunAOTCompilation>
<TrimMode>link</TrimMode>
<LinkDescription>Linkers\LinkerConfig.xml</LinkDescription>
</PropertyGroup>
<ItemGroup>
<LinkDescription Include="Linkers\LinkerConfig.xml" />
</ItemGroup>