Flutter中使用OneSignal API定时发通知、点击容器触发及SDK初始化问询
Flutter 实现点击容器触发 OneSignal 通知推送
1. 配置依赖
首先在pubspec.yaml中添加所需依赖:
dependencies: flutter: sdk: flutter onesignal_flutter: ^5.0.0 # 建议使用最新稳定版本 http: ^1.1.0 # 用于调用 OneSignal REST API
执行flutter pub get完成依赖安装。
2. OneSignal SDK 初始化代码
在应用启动时完成 SDK 初始化,示例如下:
import 'package:flutter/material.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 替换为你的 OneSignal 应用 ID await OneSignal.initialize("YOUR_ONESIGNAL_APP_ID"); // 请求用户通知权限 OneSignal.Notifications.requestPermission(true); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: const HomePage(), ); } }
3. 点击容器触发推送的实现
以下是包含完整逻辑的页面代码,点击蓝色容器即可触发通知推送:
class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { String? _currentPlayerId; @override void initState() { super.initState(); // 获取当前设备的 Player ID _getCurrentPlayerId(); } Future<void> _getCurrentPlayerId() async { final deviceState = await OneSignal.User.getDeviceState(); setState(() { _currentPlayerId = deviceState?.userId; }); } // 调用 OneSignal API 发送通知 Future<void> _sendNotification() async { if (_currentPlayerId == null) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("未获取到用户标识,无法发送通知")), ); return; } // 替换为你的 OneSignal REST API Key 和应用 ID const apiKey = "YOUR_ONESIGNAL_REST_API_KEY"; const appId = "YOUR_ONESIGNAL_APP_ID"; final url = Uri.parse("https://onesignal.com/api/v1/notifications"); final headers = { "Content-Type": "application/json", "Authorization": "Basic $apiKey", }; final requestBody = jsonEncode({ "app_id": appId, "include_player_ids": [_currentPlayerId!], "contents": {"en": "测试通知内容"}, "headings": {"en": "测试通知"}, }); final response = await http.post(url, headers: headers, body: requestBody); if (response.statusCode == 200) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("通知发送成功")), ); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("发送失败: ${response.body}")), ); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("OneSignal 通知测试")), body: Center( child: GestureDetector( onTap: _sendNotification, child: Container( width: 220, height: 110, decoration: BoxDecoration( color: Colors.blueAccent, borderRadius: BorderRadius.circular(12), ), alignment: Alignment.center, child: const Text( "点击发送通知", style: TextStyle(color: Colors.white, fontSize: 19), ), ), ), ), ); } }
关键注意事项
- 凭证获取:
YOUR_ONESIGNAL_APP_ID和YOUR_ONESIGNAL_REST_API_KEY需从 OneSignal 控制台的设置 > 密钥与ID页面获取。 - 平台配置:Android 需配置 Firebase 服务,iOS 需上传推送证书,具体步骤参考 OneSignal 对应平台的配置指引。
- Player ID:若需向其他用户发送通知,只需将
include_player_ids数组中的值替换为目标用户的 Player ID 即可。
内容的提问来源于stack exchange,提问作者user23648464
相关产品推荐
相关产品推荐

