在 Xamarin Forms 中未收到 Android 12 上的推送通知

问题描述 投票:0回答:1

我使用 Xamarin.Forms 开发了 iOS 和 Android 应用程序。

我已经使用 FCM 和 OneSignal 为我的应用程序实现了推送通知。 对于在 Android 12 以下运行的应用程序,推送通知工作正常。

对于 Android 12 及更高版本,获取推送通知时会发生崩溃。

我为 Xamarin.Firebase.Messaging (71.1740.1) 和 Com.OneSignal(3.8.4) 安装了 nuget 包。

以下是用于 FCM 和 com.OneSignal 的服务。

[Service(Exported = true)]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT", "com.google.firebase.INSTANCE_ID_EVENT" })]

[Service(Exported = true, Name = "com.company.project.OneSignalNotificationExtenderService", Permission = "android.permission.BIND_JOB_SERVICE")]
[IntentFilter(new[] { "com.onesignal.NotificationExtender" })]

对于 Android 12 及更高版本,在获取推送通知时会发生崩溃,下面是堆栈跟踪 -

--- End of managed Java.Lang.RuntimeException stack trace ---
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$4.done(AsyncTask.java:415)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
Caused by: java.lang.IllegalArgumentException: com.company.projectname: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
at com.onesignal.GenerateNotification.getNewActionPendingIntent(GenerateNotification.java:189)
at com.onesignal.GenerateNotification.createGenericPendingIntentsForNotif(GenerateNotification.java:398)
at com.onesignal.GenerateNotification.showNotification(GenerateNotification.java:382)
at com.onesignal.GenerateNotification.fromJsonPayload(GenerateNotification.java:110)
at com.onesignal.NotificationBundleProcessor.ProcessJobForDisplay(NotificationBundleProcessor.java:107)
at com.onesignal.NotificationExtenderService.processJsonObject(NotificationExtenderService.java:202)
at com.onesignal.NotificationExtenderService.processIntent(NotificationExtenderService.java:155)
at com.onesignal.NotificationExtenderService.onHandleWork(NotificationExtenderService.java:123)
at com.onesignal.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:439)
at com.onesignal.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:430)
at android.os.AsyncTask$3.call(AsyncTask.java:394)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
... 3 more

RND 之后,我更新了挂起意图标志,然后也出现了崩溃。

var pendingIntentFlags = (Build.VERSION.SdkInt >= BuildVersionCodes.S)
            ? PendingIntentFlags.Immutable
            : PendingIntentFlags.UpdateCurrent;
                    PendingIntent pendingIntent = PendingIntent.GetBroadcast(this, 1200 + result.Payload.ActionButtons.IndexOf(item), intent, pendingIntentFlags);

我发现我们必须为 Android 12 更新 Xamarin.Firebase.Messaging。 然后我已将 Xamarin.Firebase.Messaging nuget 包更新到最新版本(123.1.2.2)。 更新后有设置设备令牌的方法。

public void SetDeviceToken(object token)
    {
        deviceToken = (string)token;

        if (string.IsNullOrWhiteSpace(deviceToken))
        {
    //deviceToken = FirebaseInstanceId.Instance.Token;

            var id = FirebaseInstallations.Instance.GetId();
            deviceToken = id.ToString();

         //   deviceToken = FirebaseMessaging.Instance.GetToken().ToString();
        }
            

        if (this.chatClient != null && deviceToken != null)
        {
            Logger.Info("ChatClient", "ChatClientCallbackListener: FCM token: " + deviceToken);
            this.chatClient.RegisterFCMToken(new ChatClient.FCMToken((string)deviceToken), new StatusListeners.RegisterFCMTokenStatusListener());
            tokenRegistered = true;
        }
    }

FirebaseInstanceId.Instance.Token 出现错误 - FirebaseInstanceId 在当前上下文中不存在。 所以我得到了一些解决方案来获取令牌,所以我尝试添加

var id = FirebaseInstallations.Instance.GetId();
            deviceToken = id.ToString();

没有崩溃但没有收到通知。 我也尝试添加

deviceToken = FirebaseMessaging.Instance.GetToken().ToString();

我们已经获得了设备令牌,因此它不会进入 if 条件。

我尝试将导出值设置为 false,但这两项服务仍然无法正常工作。

没有崩溃但没有收到通知。是因为下面的错误吗?

对于应用程序构建成功但出现错误的两件事 -

Unknown error getting FCM Token
[OneSignal] java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/firebase/iid/FirebaseInstanceId;
[OneSignal]     at com.onesignal.PushRegistratorFCM.getToken(PushRegistratorFCM.java:94)
[OneSignal]     at com.onesignal.PushRegistratorAbstractGoogle.attemptRegistration(PushRegistratorAbstractGoogle.java:97)
[OneSignal]     at com.onesignal.PushRegistratorAbstractGoogle.access$100(PushRegistratorAbstractGoogle.java:37)
[OneSignal]     at com.onesignal.PushRegistratorAbstractGoogle$1.run(PushRegistratorAbstractGoogle.java:84)
[OneSignal]     at java.lang.Thread.run(Thread.java:1012)
[OneSignal] Caused by: java.lang.ClassNotFoundException: Didn't find class `"com.google.firebase.iid.FirebaseInstanceId" on path: DexPathList[[zip file` `"com.google.firebase.iid.FirebaseInstanceId" on path: DexPathList[[zip file "/data/app/~~clH8Z-xJFqbWR_JeEWSUuQ==/com.company.projectname-_UpkPkjlCAH_1fCi-G2cXQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~clH8Z-xJFqbWR_JeEWSUuQ==/com.company.projectname-_UpkPkjlCAH_1fCi-G2cXQ==/lib/arm64, /data/app/~~clH8Z-xJFqbWR_JeEWSUuQ==/com.company.projectname-_UpkPkjlCAH_1fCi-G2cXQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]`
[OneSignal]     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
[OneSignal]     at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
[OneSignal]     at java.lang.ClassLoader.loadClass(ClassLoader.java:312)

所以我已将 com.OneSignal 更新到 3.10.4 版本。 com.OneSignal 升级后出现以下错误-

android:exported 需要为元素 显式指定。当相应组件定义了意图过滤器时,面向 Android 12 及更高版本的应用需要为

android:exported
指定显式值。

所以我在清单文件中添加了以下代码。

<activity android:name="com.onesignal.NotificationOpenedActivityHMS" android:exported="true"></activity>

仍然没有收到通知,应用程序图标上没有徽章计数。

我正在对此进行 RND。我对这个通知过程有点困惑,我是否正在朝着正确的方向前进,或者没有收到通知。

为 Xamarin.Firebase.Messaging (123.1.2.2) 和 Com.OneSignal(3.10.4) 安装的 nuget 包版本。

版本有问题吗?或者,如果您认为缺少某些内容或需要进行任何更改,请帮助我。

android firebase xamarin.forms push-notification onesignal
1个回答
0
投票

服务应该是这样的:

[Service(Name = "full.dotnet.namespace.in.lowercase.except.for.className.FirebasePushMessagingService", Exported = false)]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class FirebasePushMessagingService : FirebaseMessagingService
{
    public override void OnMessageReceived(RemoteMessage message)
    {
        base.OnMessageReceived(message);
        // Put a breakpoint here to verify receipt of push notification.
    }

    public override void OnNewToken(string token)
    {
        base.OnNewToken(token);
        // Send to server using WorkManager
    }
}

注意:用于向此设备发送通知的令牌是在较新的

OnNewToken
方法中提供给您的。

您还需要在 Android 清单中设置一些内容(如果您没有在实际推送通知中设置这些内容)。这些设置控制通知的默认图标、颜色、通道等。请注意元数据标签。

    <application>
        <!-- Firebase Cloud Messaging settings -->
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
        <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>
        <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_route" />
        <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/notification_color" />
        <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/route_notification_channel_id" />
    </application>

在没有 OneSignal 的情况下,这对我有用。我建议首先尝试在没有 OneSignal 的情况下接收推送通知,看看问题是否存在于那里或您的 FCM 实现中。

© www.soinside.com 2019 - 2024. All rights reserved.