我在我的项目中使用
flutter_local_notifications: 4.0.1+2
。
出现通知我正在尝试在 iOS 上播放自定义声音。”
我尝试按照以下方法为 iOS 实现自定义声音,但它不起作用:
flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
IOSFlutterLocalNotificationsPlugin>()
?.requestPermissions(
alert: true,
badge: true,
sound: true,
);
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
flutterLocalNotificationsPlugin.initialize(initializationSettings);
const AndroidNotificationDetails androidPlatformChannelSpecifics =
AndroidNotificationDetails(
'Adhan Times Notification', 'Islamic App', 'Allah O Akbar',
priority: Priority.high,
sound: RawResourceAndroidNotificationSound('azan'));
const IOSNotificationDetails iOSPlatformChannelSpecifics =
IOSNotificationDetails(sound: 'azan.aiff');
azaan.aiff
文件位于 app/ios/Runner
。
如有任何帮助,我们将不胜感激。谢谢
除了
playsound
构造函数的 sound
属性之外,属性 IOSNotificationDetails
也必须设置为 true。
const DarwinNotificationDetails darwinNotificationDetails =
DarwinNotificationDetails(sound: 'slow_spring_board.aiff');
final NotificationDetails notificationDetails = NotificationDetails(
iOS: darwinNotificationDetails,
// linux: linuxPlatformChannelSpecifics,
);
await flutterLocalNotificationsPlugin.show(
id++,
'custom sound notification title',
'custom sound notification body',
notificationDetails,
);
还可以将声音文件拖放到 xcode 中的 ios 文件夹中
经过几天的故障排除,我已经使用 flutter_local_notifications 包在 Flutter 中成功实现了本地通知。以下是针对可能面临类似挑战的其他人的简明指南和警告。
pubspec.yaml:
environment:
sdk: '>=2.19.2 <3.0.0'
dependencies:
flutter:
sdk: flutter
timezone: ^0.9.2
flutter_local_notifications: ^15.1.0+1
notification_service.dart:
class LocalNotificationService {
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
final AndroidInitializationSettings initializationSettingsAndroid = const AndroidInitializationSettings('@mipmap/launcher_icon');
final DarwinInitializationSettings initializationSettingsDarwin = const DarwinInitializationSettings();
Future<void> showNotification(title, description, route) async {
// Android Notification Configuration
AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails(
'jbvfbfdjh', // Customize channel id
'channel_default', // Customize channel title
channelDescription: 'channel_default',
playSound: true,
sound: const RawResourceAndroidNotificationSound('notification_sound'), // Add your sound file WITHOUT file extension (ex.: .mp3, .mp4, etc)
importance: Importance.max,
styleInformation: BigPictureStyleInformation(
const DrawableResourceAndroidBitmap('@mipmap/launcher_icon)'),
largeIcon: const DrawableResourceAndroidBitmap('@mipmap/launcher_icon'),
contentTitle: title,
summaryText: description,
),
enableVibration: true,
);
// iOS Notification Configuration
DarwinNotificationDetails iOSPlatformChannelSpecifics = const DarwinNotificationDetails(
sound: 'notification_sound.caf' // add the sound file name with the extension
);
NotificationDetails platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics
);
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin
);
// Show the notification
await flutterLocalNotificationsPlugin.show(
0,
title,
description,
platformChannelSpecifics,
payload: route,
);
}
}
警告:
您的通知声音必须放置在两个位置才能在 Android 和 iOS 上正常运行。
对于 Android,请将其放置在
your_flutter_project/android/app/src/main/res/raw/notification_sound.mp3.
对于 iOS,在 XCode 上打开 ios/Runner.xcworkspace 并将声音放在根目录中。
确保您使用适用于 Android (.mp3) 和 iOS (.caf) 的适当文件扩展名。
我希望本指南可以帮助其他在 Flutter 中面临类似本地通知挑战的人。如果您有任何疑问或需要进一步说明,请随时询问!
您可以在主屏幕的 init 方法中调用以下方法
void _requestPermissions() {
flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
IOSFlutterLocalNotificationsPlugin>()
?.requestPermissions(
alert: true,
badge: true,
sound: true,
);
flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
MacOSFlutterLocalNotificationsPlugin>()
?.requestPermissions(
alert: true,
badge: true,
sound: true,
);
}