如何在颤振中实现推送通知
Posted
技术标签:
【中文标题】如何在颤振中实现推送通知【英文标题】:how to implement push notification in flutter 【发布时间】:2018-03-16 16:13:54 【问题描述】:您好我正在尝试在颤振中实现推送通知如何显示为通知可以任何人提供帮助,我可以在收到通知时收听但我无法看到消息并且它显示为警报但我希望通知可以帮助任何人,在 android 或 ios 中,我们应该在清单文件和应用程序委托文件中正确处理 Flutter 中的这一点
我的代码看起来像这样
class PushMessagingExample extends StatefulWidget
@override
_PushMessagingExampleState createState() => new _PushMessagingExampleState();
class _PushMessagingExampleState extends State<PushMessagingExample>
String _homeScreenText = "Waiting for token...";
bool _topicButtonsDisabled = false;
final FirebaseMessaging _firebaseMessaging = new FirebaseMessaging();
final TextEditingController _topicController =
new TextEditingController(text: 'topic');
Future<Null> _showItemDialog(Map<String, dynamic> message) async
final Item item = _itemForMessage(message);
showDialog<Null>(
context: context,
child: new AlertDialog(
content: new Text("Item $message has been updated"),
actions: <Widget>[
new FlatButton(
child: const Text('CLOSE'),
onPressed: ()
Navigator.pop(context, false);
),
new FlatButton(
child: const Text('SHOW'),
onPressed: ()
Navigator.pop(context, true);
),
],
)).then((bool shouldNavigate)
if (shouldNavigate == true)
_navigateToItemDetail(message);
);
Future<Null> _navigateToItemDetail(Map<String, dynamic> message) async
final Item item = _itemForMessage(message);
// Clear away dialogs
Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
if (!item.route.isCurrent)
Navigator.push(context, item.route);
@override
void initState()
super.initState();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message)
print("onMessage: $message");
print(message);
_showItemDialog(message);
,
onLaunch: (Map<String, dynamic> message)
print("onLaunch: $message");
print(message);
_navigateToItemDetail(message);
,
onResume: (Map<String, dynamic> message)
print("onResume: $message");
print(message);
_navigateToItemDetail(message);
,
);
_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings)
print("Settings registered: $settings");
);
_firebaseMessaging.getToken().then((String token)
assert(token != null);
setState(()
_homeScreenText = "Push Messaging token: $token";
);
print(_homeScreenText);
);
@override
Widget build(BuildContext context)
return new Scaffold(
body: new Material(
child: new Column(
children: <Widget>[
new Center(
child: new Text(_homeScreenText),
),
],
),
));
【问题讨论】:
能够在 android 中接收推送通知,但在 ios 中的 onmessage 和 onresume 无法获取该数据。 【参考方案1】:在 Flutter 中推送通知可能特别困难,因为您必须做两倍的工作才能让它们与 Android 和 iOS 的特定实现一起工作(当然,两者完全不同)。
我一直在为颤振构建 OneSignal SDK。它会在几天内准备好。我们非常努力地尽可能简化推送通知,并且很容易以符合 GDPR 的方式使用我们的 SDK。
repo 在这里 (https://github.com/OneSignal/OneSignal-Flutter-SDK),它是开源的,我们欢迎任何人的贡献。它充当原生 Android 和 iOS OneSignal SDK 之上的包装器。
【讨论】:
有多复杂?这对我来说似乎很直接。您只需按照说明一一进行即可。 是否有推荐的方法来处理 OneSignal 的后台通知?我需要在收到后台通知时调用 Flutter 方法。 并不是“特别难”。你这么说是因为你在推销你的产品。 Android 10 怎么样?如文档Tested from Android 4.0.3 (API level 15) to Android 9.0 (28)
中所述【参考方案2】:
如果您尝试在锁定屏幕上放置消息,请确保您发送的是“通知”消息类型,而不是将传送到正在运行的应用程序的“数据”消息。您可以在 Firebase 开发者指南中详细了解 different types of Firebase messages。
【讨论】:
我在锁定屏幕中收到通知,但是当屏幕处于活动状态以及打开其他应用程序时,应该显示此应用程序的通知 我没有进入锁屏 你能分享你的经验吗?我应该添加什么? @sivakumar @Aliy,你找到锁屏通知的解决方案了吗?【参考方案3】:1.添加依赖
为了发送推送通知,我们使用了一个名为 firebase_messaging 的插件……
https://pub.dev/packages/firebase_messaging
打开您的 pubspec.yaml 文件并添加此依赖项
依赖: firebase_messaging:^6.0.9
2. Firebase 帐户
在继续之前,请确保您拥有 Firebase 帐户。 在下一步中,您应该能够下载 google-services.json 文件。
下载文件后,请务必将其复制到您的 Android 项目的 app/ 文件夹中。
3. Android 清单 添加
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
将这些行添加到 [project]/android/build.gradle
dependencies
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.google.gms:google-services:4.3.3'
将这些行添加到 [project]/android/app/build.gradle
dependencies
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.firebase:firebase-messaging:20.2.3'
implementation 'com.google.firebase:firebase-analytics:17.4.4'
// Add the SDK for Firebase Cloud Messaging
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
apply plugin: 'com.google.gms.google-services'
完成
【讨论】:
我在一个小时内完成了 Android,但我花了一个星期的时间完成了 IOS,但没有任何效果,只是有一个糟糕的指令,他们总是比 Android 更复杂。 我也是,现在卡在 Flutter IOS 找不到 'Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig' 错误并且找不到我的出路,几乎尝试了所有方法在***上提到。【参考方案4】:让我给你最突出的使用 Flutter 推送通知的解决方案,这是我今天遇到的,它是 locally
它是 samuelezedi.com 的一个包,它发送本地通知。安排它,最好的部分是它不需要太多设置,就像我们对flutter_local_notification
所做的那样,人们正在失去他们的 Strands ? 使用它之后,它是如此复杂并且对初学者不友好,所以我们发现 locally
在本地会有所帮助你。
发送本地推送通知
Locally locally = Locally(
context: context,
payload: 'test',
pageRoute: null, //Link to which page you want to open
appIcon: 'mipmap/ic_launcher', //Icon of your app, in android>app>src>main>res>drawable-v21 I put my png Icon..
);
locally.show(title: "Remaindero to use Toodolee", message: "Hey do this work");
看看这是多么容易发送推送通知,
发送本地预定通知
使用.schedule
代替.show
这将帮助您安排时间
locally.schedule(title: "Toodolee Reminder, message: "Hey have a run, duration: Duration(seconds: 5));
他们的文档非常好,令人惊叹,像我这样的新手可以很好地理解它,我在这里找不到的一件事是对自定义声音的支持。
这是文档的链接。 https://pub.dev/packages/locally
非常感谢
【讨论】:
以上是关于如何在颤振中实现推送通知的主要内容,如果未能解决你的问题,请参考以下文章