我是 firebase 控制台发送通知。它直接向系统托盘发送通知。我想在用户点击它们时从它们那里获取有效负载。
当您的应用程序在后台运行时,Android 会将通知消息定向到系统托盘。默认情况下,用户点击通知会打开应用程序启动器。
这包括包含通知和数据负载的消息(以及从通知控制台发送的所有消息)。在这些情况下,通知将传递到设备的系统托盘,并且数据负载将在启动器活动的意图的附加内容中传递。
https://firebase.google.com/docs/notifications/android/console-audience
我能够获取从控制台发送的通知 如何从我的意图之外获取通知负载?
android android-intent firebase firebase-cloud-messaging firebase-notifications
我正在尝试实现一个通知系统,您可以在其中订阅另一个用户(不是 Firebase 主题),并在该用户发布内容时获取推送通知。
为此,我决定使用设备组和注册令牌,以便用户可以将推送通知发送到他/她登录的每个设备。
目前,用户可以订阅另一个用户,还可以使用通知键接收他登录的每个设备的推送通知。为此,我每次用户登录时都会获取设备的注册令牌,并使用以下结构将其存储在数据库(应用程序服务器)中。
用户
设备
但是,我无法弄清楚如何管理应用程序服务器中的令牌刷新。
考虑这种情况:
1)user_1首次登录设备。
2) 使用registration_token_1创建设备组(在FCM 和应用程序服务器中)。
3)user_1卸载应用并重新安装(令牌刷新)。
4) user_1 重新登录。
5) App Server 将refresh_token_1添加到user_1,他现在有2 个令牌,旧的和新的。
6) user_1注销和user_2登录同一设备,refresh_token_1转移给user_2。
7) FCM 删除 user_1 的设备组,因为 user_1不再具有任何注册令牌。但 user_1 在应用服务器中仍然拥有 notification_key 和带有 Registration_token_1 的设备。
8) user_1 无法登录,因为应用程序服务器认为他已经拥有设备组并尝试将刷新令牌_1 添加到 FCM 中不存在的 notification_key,并收到错误代码 400“通知密钥不存在”。
我对此有几个问题:
如果刷新令牌,是否有办法从 FCM 检索旧令牌?这样,应用程序服务器可以用新令牌替换旧令牌,而无需将令牌与设备标识符配对,如果标识符在卸载/恢复出厂设置等情况下不存在,则这似乎不可靠
您能否推荐一种更好的方法来将用户(通知键)与应用程序服务器中的注册令牌进行映射?
编辑 我已经阅读了一些其他线程,并找到了一种可能的解决方案,其形式是将注册令牌与设备标识符配对,因此当刷新令牌时,我可以查找设备标识符并替换/删除令牌。现在,我不确定 iOS 和 Android 是否都具有持久标识符,这些标识符是否可以在应用程序卸载、数据擦除和恢复出厂设置之外存在……
我正在使用 firebase,并且有一个应用程序需要向所有用户发送通知。因此,为了实现这一目标,我创建了一个主题 allUsers,每个设备都订阅该主题。现在,如果我向该主题发送推送通知,每个设备都会收到它。我想排除一台设备,该设备间接向 /topics/allUsers 创建推送通知。
这可以实现吗?
我想根据设备的语言向设备发送通知。我的第一个想法是为服务器端可用的每个区域设置创建推送,并让 Firebase 完成所有调度工作。
但为此我需要为每次推送设置区域设置。
我还没有找到任何可用的参数,所以我想知道我是否正确或者是否需要更改我的设计。如果我必须这样做,我该怎么办?
我有一个 Ionic 应用程序和一个使用 Java 的 Mule ESB。当我从在线控制台发送推送通知时,我可以选择启用声音。我怎样才能在Java中实现这一点?
我目前用它来定义我的推送消息:
Message message = Message.builder()
.putData("title", title)
.putData("body", body)
.setTopic(topic)
.build();
Run Code Online (Sandbox Code Playgroud)
这工作正常,发送通知时没有任何声音。标题和正文是我正在使用的两个变量。
为了添加声音我尝试过
.putData("sound", "default")
Run Code Online (Sandbox Code Playgroud)
以及一些类似的东西
.setApnsConfig(ApnsConfig.builder().setAps(Aps.builder().setSound("default").build()).build())
Run Code Online (Sandbox Code Playgroud)
也
.setApnsConfig(ApnsConfig.builder().setAps(Aps.builder().putCustomData("sound", "default").build()).build())
Run Code Online (Sandbox Code Playgroud)
两者都没有任何成功。如何实现与 Java 中的控制台相同的声音选项?
我想在 flutter 中使用 firebase_messaging 推送通知。在文档中有 Application.java 文件,但我的 flutter 项目使用 kotlin 文件格式。如何将此 java 代码更改为 kotlin 类型:
import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;
public class Application extends FlutterApplication implements PluginRegistrantCallback {
@Override
public void onCreate() {
super.onCreate();
FlutterFirebaseMessagingService.setPluginRegistrant(this);
}
@Override
public void registerWith(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry);
}
}
Error is this: Expecting a top level declaration
Run Code Online (Sandbox Code Playgroud) 我最近通过 podfile将 Firebase 更新到最新的 Firebase 版本 7.3.1。现在我收到此错误并且 Xcode 因错误而失败:
Error 'Cannot find 'Messaging' in scope'
Cannot find type 'MessagingRemoteMessage' in scope
Run Code Online (Sandbox Code Playgroud)
Xcode 版本:12.0
斯威夫特 5
我的代码是
extension AppDelegate : MessagingDelegate {
//MARK:- Firebase Delegate
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
}
func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
print("Received data message: \(remoteMessage.appData)")
}
}
Run Code Online (Sandbox Code Playgroud)
我的豆荚如下所示以供参考
pod 'Firebase/Core'
pod 'Firebase/Messaging'
pod 'Firebase/DynamicLinks'
pod 'Firebase/Crashlytics'
Run Code Online (Sandbox Code Playgroud)
我只是尝试使用完全移除豆荚
cocoapods-deintegrate cocoapods-clean
Run Code Online (Sandbox Code Playgroud)
但没有运气!
我经常更新我的豆荚,我看不出是什么会导致这种重大变化。
有谁知道是什么原因?
所以我更新了firebase_messaging并且我不得不更改我的代码,因为FirebaseMessagin.configure()它已被弃用,现在当我收到通知并单击通知时,它不会打开另一个屏幕。
这就是我实现通知的方式:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print('Handling a background message ${message.messageId}');
}
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel', // id
'High Importance Notifications', // title
'This channel is used for important notifications.', // description
importance: Importance.high,
);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'e-R?d?u?i',
debugShowCheckedModeBanner: false,
initialRoute: …Run Code Online (Sandbox Code Playgroud) android push-notification flutter remote-notifications firebase-cloud-messaging
我的 Flutter 应用程序已更新到最新版本的 Flutter,并且我将 firebase_messaging 添加到我的应用程序中。完成此操作后,该应用程序在模拟器上运行良好,但当我尝试在实际 iOS 设备上运行它时崩溃,并出现以下错误:
-[NSNull length]: unrecognized selector sent to instance 0x1ddcb9ee0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x1ddcb9ee0'
*** First throw call stack:
(0x18c8959d8 0x1a0bfeb54 0x18c7a5bbc 0x18c89801c 0x18c899f8c 0x102deadcc 0x102dec698 0x102deb1a8 0x102dea8bc 0x18c4cd298 0x18c4ce280 0x18c4aa4f0 0x18c4aafdc 0x18c4b4800 0x1d4f3b5a4 0x1d4f3e874)
libc++abi.dylib: terminating with uncaught exception of type NSException
* thread #5, queue = 'com.google.firebase.auth.globalWorkQueue', stop reason = signal SIGABRT
frame #0: 0x00000001b86f484c libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill: …Run Code Online (Sandbox Code Playgroud) ios firebase firebase-authentication flutter firebase-cloud-messaging
我有一个旧项目需要更新 Firebase,所以我这样做了。之后,我收到两个错误,但我不明白如何解决它们。有人可以帮我解决这个问题吗?
文件1.swift:
func token(withAuthorizedEntity authorizedEntity: String, scope: String, options: [AnyHashable: Any]? = nil, handler: @escaping InstanceIDTokenHandler) {
}
Run Code Online (Sandbox Code Playgroud)
错误:在范围内找不到类型“InstanceIDTokenHandler”
文件2.swift
func checkDeviceToken() {
let hasDeviceToken: Bool = self.devicesTokenUseCase.hasDeviceToken()
let dontHaveDeviceToken: Bool = !hasDeviceToken
InstanceID.instanceID().instanceID { (result, _) in
if let result = result {
let isNotSameToken: Bool = !self.devicesTokenUseCase.isSameDeviceToken(deviceToken: result.token)
if hasDeviceToken && isNotSameToken {
self.updateDeviceToken(token: result.token)
} else if dontHaveDeviceToken {
self.sendDeviceToken(token: result.token)
}
} else {
self.checkDeviceToken()
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误:在范围内找不到“InstanceID”