我正在使用离子框架(Web技术)开发android/ios应用程序,我想在新的firebase功能FCM的帮助下添加推送通知.
现在我正在看以下文档:
https://firebase.google.com/docs/cloud-messaging/chrome/client#project-setup
说的是:
- Chrome中的网站可以通过服务工作者和网络实现推送消息传递
- 应用程序符合Webpush标准.Chrome应用和扩展程序可以直接通过chrome.gcm
API 访问FCM服务.
这是否意味着我可以在我的离子应用程序中使用它同时用于android/ios,因为app是使用cordova构建的?
如果有任何实现的例子,我可以看到和学习,这将是非常有帮助的.
谢谢
push-notification cordova firebase ionic-framework firebase-cloud-messaging
我正在使用此代码通过C#和GCM发送通知消息,使用Winforms,Webforms等等.现在我想发送到FCM(Firebase云消息传递).我应该更新我的代码吗?:
public class AndroidGCMPushNotification
{
public AndroidGCMPushNotification()
{
//
// TODO: Add constructor logic here
//
}
public string SendNotification(string deviceId, string message)
{
string SERVER_API_KEY = "server api key";
var SENDER_ID = "application number";
var value = message;
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8";
tRequest.Headers.Add(string.Format("Authorization: key={0}", SERVER_API_KEY));
tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
string postData = "collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.message=" + value + "&data.time=" + System.DateTime.Now.ToString() + "®istration_id=" + deviceId + "";
Console.WriteLine(postData);
Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
tRequest.ContentLength = …Run Code Online (Sandbox Code Playgroud) 我们有一个Android应用,最近报告了很多ANR错误.这仅发生在Android 7.1和8.0上(不在例如4.4,5.0或6.0上).ANR是:
Broadcast of Intent { act=com.google.firebase.INSTANCE_ID_EVENT flg=0x14 cmp=com.our.package.name/com.google.firebase.iid.FirebaseInstanceIdInternalReceiver (has extras) }
问题是:为什么我们得到这个ANR,我们可以做些什么来避免这种情况?请注意,这在早期的Android版本中运行良好,我认为这证明我们没有做任何导致ANR的新手错误.
我很难再现这个bug.由于它仅适用于Android 7.1和8.0,我认为它可能与新的打盹模式和节省电池有关,但即使使用adb shell dumpsys deviceidle force-idle 等,测试也不能重现这个问题,也没有放在SystemClock.sleep(20000);几个地方.
我们的代码InstanceIdService是:
public class InstanceIdService extends FirebaseInstanceIdService {
private Analytics mAnalytics;
@Override
public void onCreate() {
super.onCreate();
mAnalytics = new AnalyticsImpl();
boolean isFullVersion = getApplicationContext().getPackageName().endsWith("full");
mAnalytics.init(getApplicationContext(), isFullVersion);
}
@Override
public void onTokenRefresh() {
boolean initialLoginSucceeded = OurAppNameApplication.getInstance().getSettings().getInitialLoginSucceeded();
mAnalytics.logEvent("FCM_Token_Refresh_Triggered", "initialLoginSucceeded", String.valueOf(initialLoginSucceeded));
if (initialLoginSucceeded) { // We only report the FCM token to our server …Run Code Online (Sandbox Code Playgroud) android firebase firebase-cloud-messaging android-7.1-nougat android-8.0-oreo
我的 flutter 应用程序与 firebase 集成,一切都很好,但是当我将 firebase 项目迁移到客户端 firebase 控制台、添加他的 google 服务文件、更改 DefaultFirebaseOption.currentplatform 文件凭据时,但每当我尝试运行我的应用程序时,我都会收到错误。我的主要方法如下所示:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
token = await FirebaseMessaging.instance.getToken();
Provider.debugCheckInvalidValueType = null;
runApp(const MyApp());
}Run Code Online (Sandbox Code Playgroud)
错误是:
E/flutter (28330): [错误:flutter/lib/ui/ui_dart_state.cc(209)] 未处理的异常:[core/duplicate-app] 名为“[DEFAULT]”的 Firebase 应用程序已存在。
我在这里搜索并从这里找到了解决方案并更新了我的主要方法,如下所示:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
if (Firebase.apps.isNotEmpty) {
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
}else{
Firebase.app()
}
//await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
token = await FirebaseMessaging.instance.getToken();
Provider.debugCheckInvalidValueType = null;
runApp(const MyApp());
}Run Code Online (Sandbox Code Playgroud)
但这一次我没有收到错误,但我的应用程序 UI 没有显示,我只看到黑屏。我花了 4 到 5 个小时试图解决这个问题,但没有找到解决方案。任何帮助将不胜感激。
更新我在这两个场景中都提供了名称参数,并且我的应用程序在第一次安装时工作正常,但是当我重新启动或关闭应用程序并重新运行它时,我遇到了与上述情况相同的错误。
我已经使用FirebaseAuth/FCM等实施了Firebase,并通过Firebase控制台成功发送了通知.
但是,我需要从我自己的应用服务器推送通知.
我想知道下面哪种方式是正确的方法来检索设备的注册ID: -
1)从didRegisterForRemoteNotificationWithDeviceToken中检索注册ID令牌
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
var token = ""
for i in 0..<deviceToken.count {
token += String(format: "%02.2hhx", arguments: [deviceToken[i]])
}
print("Registration succeeded!")
print("Token: ", token)
Callquery(token)
}
Run Code Online (Sandbox Code Playgroud)
2)从firebase检索注册令牌(基于检索当前注册令牌的Firebase文档)
let token = FIRInstanceID.instanceID().token()!
Run Code Online (Sandbox Code Playgroud)
我正在使用第一种方式,即使注册ID相应地存储在我的应用服务器数据库上也没有收到推送通知,我得到了这个CURL会话结果: -
{"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
Run Code Online (Sandbox Code Playgroud)
我还尝试了第二种方式,并在运行应用程序时遇到致命错误,如下所示: -

如果有人能指出我正确的方式表示赞赏,谢谢!
Hello Friends我是这个stackoverflow社区的新手,但在使用各种编程语言(如android)开发代码方面拥有丰富的经验.今天我用我的一个应用程序实现了GCM,我遇到了推送通知消息的延迟问题.我正在看护目镜,发现谷歌最近推出了一些名为FCM的新服务.我阅读了各种文章或博客,但没有从那里找到太多信息.我有一些问题,请给出你的意见,所有stackoverflowian都衷心地邀请他们提出他们的建议.
为什么我们需要这个FCM.
FCM over GCM.
GCM现在是否已折旧.他们是否会停止gcm的所有服务和支持.
如何将我的旧应用程序从GCM更新到FCM.
任何人都可以告诉我谷歌宣布FCM
超过GCM 的原始链接,因为我没有发现这最初发布谷歌.
谢谢你们!
乔丹·查芬斯
我在iOS上遇到FCM通知问题.
我收到成功通知时,我的应用程序是在前台(回调didReceiveRemoteNotification中appdelegate被解雇),但是当应用程序在后台我没有收到通知(我看不出在iOS中的通知栏,任何东西).
所以,我认为问题在于FCM发送的消息格式.我的服务器发送给FCM的json采用以下格式:
{
"data":{
"title":"mytitle",
"body":"mybody",
"url":"myurl"
},
"notification":{
"title":"mytitle",
"body":"mybody"
},
"to":"/topics/topic"
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我的json中有两个块:一个通知块(用于接收后台通知)和一个数据块(用于接收前台通知).
我无法理解为什么没有收到后台通知.我的疑问是关于块的顺序(如果我在"通知"块之前放置"数据"块会有问题吗?).
编辑: 有关该问题的更多信息.
这是我的appdelegate.swift:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
{
var window: UIWindow?
// Application started
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
let pushNotificationSettings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(pushNotificationSettings)
application.registerForRemoteNotifications()
FIRApp.configure()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "tokenRefreshNotification:", name: kFIRInstanceIDTokenRefreshNotification, object: nil)
return true
}
// Handle refresh notification token
func tokenRefreshNotification(notification: NSNotification) {
let …Run Code Online (Sandbox Code Playgroud) ios firebase google-cloud-messaging swift firebase-cloud-messaging
使用新的FirebaseMessaging,可以通过以下方式轻松取消/订阅主题:
FirebaseMessaging.getInstance().subscribeToTopic();
FirebaseMessaging.getInstance().unsubscribeFromTopic();
Run Code Online (Sandbox Code Playgroud)
但有没有办法获得当前安装所订阅的所有主题?
最近我问了一个关于使用GCM 发送推送通知的问题:向Android发送推送通知.现在有了FCM,我想知道它与服务器端开发有多么不同.明智的编码,它们是一样的吗?在哪里可以找到显示从服务器向Android设备发送推送通知的示例FCM代码?
我是否需要下载任何JAR库以使用Java代码向FCM发送通知?向Android发送推送通知中的示例代码显示使用GCM发送推送通知,并且需要服务器端GCM JAR文件.
但是,另一个例子在https://www.quora.com/How-do-I-make-a-post-request-to-a-GCM-server-in-Java-to-push-a-notification-to -the-client-app显示使用GCM发送推送通知,并且不需要服务器端GCM JAR文件,因为它只是通过HTTP连接发送.FCM可以使用相同的代码吗?使用的网址是" https://android.googleapis.com/gcm/send ".什么是FCM的等效URL?
提前致谢.
我已将项目从使用GCM迁移到使用Firebase.当设备处于唤醒状态或最近处于睡眠状态时,推送通知会通过确认,但如果我离开设备一小时,则在我唤醒设备之前不会发送推送.
Android文档说,如果您需要唤醒设备以传递消息,请使用优先级设置为高的FireBase.它还说设备管理应用程序不受Doze限制,我的应用程序是一个设备管理应用程序.
我想我会提到当我将项目从GCM迁移到FCM时,我只在firebase控制台中指定了包名,而不是指纹.
我试过了什么
将优先级设置为高
{
"time_to_live": 300000,
"delay_while_idle": false,
"android": {
"priority": "high"
},
"data": {
"message": "PING_DEVICE",
"time": "21/01/2018 16:20:28",
"pushguid": "10062"
},
"registration_ids": [
"eOMT........"
]
}
Run Code Online (Sandbox Code Playgroud)
设定生存时间,以便最终传达信息.delay_while_idle设置为false,2016年9月后FCM将忽略此值.
设备管理员应用程序不受Doze的影响,我的设备管理员应用程序,但我还明确将应用程序添加到设置 - >电池 - >优化中的Doze白名单中.这是通过设置应用程序手动完成的,而不是以编程方式在代码中完成
我已经离开我的设备睡了3个小时,没有推动通过.我还使用adb将设备置于Doze中.当adb将设备置于Doze中时,没有收到推送,当adb将设备从Doze中取出时,推送就会通过.
进一步的想法我没试过.
我的推动是数据消息.这是因为我不希望推送到设备上的通知栏并让用户单击它来执行功能.用户没有与设备管理应用程序的交互.因此,数据消息由处理
onMessageReceived(RemoteMessage remoteMessage)
Run Code Online (Sandbox Code Playgroud)
我相信通知消息会唤醒设备,这是我需要的,但我希望应用程序处理推送,而不是用户.我可以拥有通知和数据但是onMessageRecievied处理功能的消息吗?
有没有人经历过类似的事情或有任何解决方案?
[编辑1]我在下面找到了以下链接,说明您可以发送通知和数据的消息,但如果应用程序在后台,则会显示通知,但只有在用户单击通知时才会执行数据.这不是我想要的,因为我希望数据立即在onMessageRecived中执行.
[EDIT2]我已向应用添加了以下代码和权限.该应用程序现在要求用户将应用程序列入白名单,因此我单击是.然后我通过adb将设备放入Doze并发送推送.在我将设备退出打盹模式之前,没有任何事情发生.所以,不幸的是,这不起作用.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)
[EDIT3]
我已经做了进一步的测试,试图找出问题并将我的Web应用程序代码排除在外.我通过adb和使用过的FireBase控制台将设备置于Doze中以发送推送.推送正确 …