使用 Microsoft.AppCenter 在 Xamarin Forms 中推送通知
PUSH Notifications in Xamarin Forms with Microsoft.AppCenter
问:我在 Microsoft.AppCenter 中使用 XAMARIN Forms。如何使用 AppCenter API 获取 firebase 设备 ID,以便从我的后端向我的移动客户端 (Android/IOS) 发送推送通知?
前端(要求)
1.XAMARIN 表格
2. Microsoft.AppCenter
3. Microsoft.AppCenter.推
4. 必须使用 AppCenter 获取 FireBase 设备 ID。
5. AppCenter.GetInstallIdAsync() 不适用于我的后端。我需要 FireBaseDeviceID
6.
后端(要求)
1. 我必须使用 FireBase 的 https://fcm.googleapis.com/fcm/send POST 请求进行调用。
我有一个后端服务器需要将推送直接发送到 firebase。不通过 AppCenter。对于我要发送到的每个设备,我都需要 firebase 的 DeviceID。我让它为我的应用程序推送到所有设备。但我还需要转到通过 AppCenter 注册的特定设备。这就是为什么我需要我的前端应用程序来获取 PUSH 的 FireBase DeviceID。
您无法通过使用 AppCenter 获取 Firebase id。
您有两种解决方法:
1. 跳过在您的应用程序中使用 AppCenter 进行推送。根据文档,您必须在支持的每个平台上实现与 Firebase 的交互。如果您选择此选项,我可以分享更多技巧。
2. 说服后端团队使用 AppCenter API 发送个人推送通知 https://openapi.appcenter.ms/#/push/Push_Send
我知道这些解决方案中的每一个都与您的一个要求相矛盾。但是您必须为您的项目只选择一种推送服务,AppCenter 或 Firebase,并坚持使用它。就我个人而言,我投票支持 Firebase,这是通过艰苦的方式学到的。
已更新
大多数时候,Firebase documentation 是您切换到 FCM 时最好的朋友。
应用端:
正在设置 Firebase 客户端for iOS and for Android。
我的一些技巧:
Android:
您必须监听 FirebaseMessagingService
的后代中的 Firebase InstanceID 更改并将其存储以备后用。它不像 AppCenter 那样在您需要时可用。
我的 activity 有 LaunchMode = LaunchMode.SingleTop
,我重写了两种方法来处理推送,具体取决于到达时的应用程序状态:void OnNewIntent(Intent intent)
和 void OnPostCreate(Bundle savedInstanceState)
。这可能不是你的情况,因为我也处理静默推送。检查意图是否包含来自 Firebase 的推送 运行 intent?.GetStringExtra("google.message_id") != null
.
iOS:
推送通知在 iOS 模拟器上不起作用,当在模拟器上 运行 时,初始化步骤可能会使您的应用程序崩溃。我在 csproj 文件的 Debug|iPhoneSimulator
配置下的 __IOS__
和 DEBUG
旁边创建了 __IOS_SIMULATOR__
常量。并像这样在 AppDelegate.cs 中使用它:
#if !__IOS_SIMULATOR__
new FirebaseCloudMessagingInitializer().Init();
#endif
AppDelegate
提供了两种方法来覆盖 void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
和 void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
。我一开始使用第一个,在未调用时遇到边缘情况。所以我不得不切换到覆盖后者。但是不要盲目地遵循这个建议,检查什么最适合你的需要。
此外,请注意 https://github.com/firebase/firebase-ios-sdk/issues/2438,我不确定它是否已经修复,因为我不得不处理它。
如果它仍然存在,请应用 https://github.com/firebase/firebase-ios-sdk/issues/2438#issuecomment-469472087
中的修复程序
在后端:
https://fcm.googleapis.com/fcm/send 是所谓的遗留协议,请改用 HTTP v1
POST https://fcm.googleapis.com/v1/projects/project_name/messages:send. Explore documentation.
问:我在 Microsoft.AppCenter 中使用 XAMARIN Forms。如何使用 AppCenter API 获取 firebase 设备 ID,以便从我的后端向我的移动客户端 (Android/IOS) 发送推送通知?
前端(要求) 1.XAMARIN 表格 2. Microsoft.AppCenter 3. Microsoft.AppCenter.推 4. 必须使用 AppCenter 获取 FireBase 设备 ID。 5. AppCenter.GetInstallIdAsync() 不适用于我的后端。我需要 FireBaseDeviceID 6.
后端(要求) 1. 我必须使用 FireBase 的 https://fcm.googleapis.com/fcm/send POST 请求进行调用。
我有一个后端服务器需要将推送直接发送到 firebase。不通过 AppCenter。对于我要发送到的每个设备,我都需要 firebase 的 DeviceID。我让它为我的应用程序推送到所有设备。但我还需要转到通过 AppCenter 注册的特定设备。这就是为什么我需要我的前端应用程序来获取 PUSH 的 FireBase DeviceID。
您无法通过使用 AppCenter 获取 Firebase id。
您有两种解决方法:
1. 跳过在您的应用程序中使用 AppCenter 进行推送。根据文档,您必须在支持的每个平台上实现与 Firebase 的交互。如果您选择此选项,我可以分享更多技巧。
2. 说服后端团队使用 AppCenter API 发送个人推送通知 https://openapi.appcenter.ms/#/push/Push_Send
我知道这些解决方案中的每一个都与您的一个要求相矛盾。但是您必须为您的项目只选择一种推送服务,AppCenter 或 Firebase,并坚持使用它。就我个人而言,我投票支持 Firebase,这是通过艰苦的方式学到的。
已更新
大多数时候,Firebase documentation 是您切换到 FCM 时最好的朋友。
应用端:
正在设置 Firebase 客户端for iOS and for Android。
我的一些技巧:
Android:
您必须监听 FirebaseMessagingService
的后代中的 Firebase InstanceID 更改并将其存储以备后用。它不像 AppCenter 那样在您需要时可用。
我的 activity 有 LaunchMode = LaunchMode.SingleTop
,我重写了两种方法来处理推送,具体取决于到达时的应用程序状态:void OnNewIntent(Intent intent)
和 void OnPostCreate(Bundle savedInstanceState)
。这可能不是你的情况,因为我也处理静默推送。检查意图是否包含来自 Firebase 的推送 运行 intent?.GetStringExtra("google.message_id") != null
.
iOS:
推送通知在 iOS 模拟器上不起作用,当在模拟器上 运行 时,初始化步骤可能会使您的应用程序崩溃。我在 csproj 文件的 Debug|iPhoneSimulator
配置下的 __IOS__
和 DEBUG
旁边创建了 __IOS_SIMULATOR__
常量。并像这样在 AppDelegate.cs 中使用它:
#if !__IOS_SIMULATOR__
new FirebaseCloudMessagingInitializer().Init();
#endif
AppDelegate
提供了两种方法来覆盖 void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
和 void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
。我一开始使用第一个,在未调用时遇到边缘情况。所以我不得不切换到覆盖后者。但是不要盲目地遵循这个建议,检查什么最适合你的需要。
此外,请注意 https://github.com/firebase/firebase-ios-sdk/issues/2438,我不确定它是否已经修复,因为我不得不处理它。 如果它仍然存在,请应用 https://github.com/firebase/firebase-ios-sdk/issues/2438#issuecomment-469472087
中的修复程序在后端:
https://fcm.googleapis.com/fcm/send 是所谓的遗留协议,请改用 HTTP v1
POST https://fcm.googleapis.com/v1/projects/project_name/messages:send. Explore documentation.