Home > Net >  Custom iOS notifications sound local notifications package Flutter
Custom iOS notifications sound local notifications package Flutter

Time:01-08

I'm using Firebase Cloud Messaging to send notifications to my flutter app, and I'm using the flutter_local_notifications package to handle them, but when I tried to change the default notification sound it worked for android but didn't work for iOS, keep in mind that I add the "sound.aiff" to the root of the native iOS project, can anyone show me what I'm missing here, and thanks in advance

class FCMFunctions {
  static final FCMFunctions _singleton = new FCMFunctions._internal();

  FCMFunctions._internal();

  factory FCMFunctions() {
    return _singleton;
  }

  late FirebaseMessaging messaging;

//************************************************************************************************************ */
  /// Create a [AndroidNotificationChannel] for heads up notifications
  late AndroidNotificationChannel channel;

  /// Initialize the [FlutterLocalNotificationsPlugin] package.
  late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

//************************************************************************************************************ */

  Future initApp() async {
    await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
    );

    messaging = FirebaseMessaging.instance;

    if (!kIsWeb) {
      channel = const AndroidNotificationChannel(
        'high_importance_channel', // id
        'High Importance Notifications', // title
        importance: Importance.high,
        sound: RawResourceAndroidNotificationSound('sound'),
        playSound: true,
      );

      flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

      /// Create an Android Notification Channel.
      ///
      /// We use this channel in the `AndroidManifest.xml` file to override the
      /// default FCM channel to enable heads up notifications.
      await flutterLocalNotificationsPlugin
          .resolvePlatformSpecificImplementation<
              AndroidFlutterLocalNotificationsPlugin>()
          ?.createNotificationChannel(channel);

      //for IOS Foreground Notification
      await messaging.setForegroundNotificationPresentationOptions(
        alert: true,
        badge: true,
        sound: true,
      );
    }
  }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  void initializeNotifications() async {
    var initializationSettingsAndroid =
        const AndroidInitializationSettings('icon');
    var initializationSettingsIOS = const IOSInitializationSettings();
    //var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
    var initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid,
      iOS: initializationSettingsIOS,
    );
    await flutterLocalNotificationsPlugin.initialize(
      initializationSettings,
      onSelectNotification: onSelectNotification,
    );
  }

  Future onSelectNotification(String? payload) async {
    if (payload != null) {
      debugPrint('notification payload: $payload');
    }
    navigatorKey.currentState!.pushNamed(Routes.blackCurrency,
        arguments: false); //message.data['category']
  }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  Future subscripeToTopics(String topic) async {
    await messaging.subscribeToTopic(topic);
  }

  ///Expire : https://firebase.google.com/docs/cloud-messaging/manage-tokens
  Future<String?> getFCMToken() async {
    final fcmToken = await messaging.getToken();
    return fcmToken;
  }

  void tokenListener() {
    messaging.onTokenRefresh.listen((fcmToken) {
      print("FCM Token dinlemede");
      // TODO: If necessary send token to application server.
    }).onError((err) {
      print(err);
    });
  }

  /// IOS
  Future iosWebPermission() async {
    if (Platform.isIOS || kIsWeb) {
      NotificationSettings settings = await messaging.requestPermission(
        alert: true,
        announcement: false,
        badge: true,
        carPlay: false,
        criticalAlert: false,
        provisional: false,
        sound: true,
      );
    }
  }

  ///Foreground messages
  ///
  ///To handle messages while your application is in the foreground, listen to the onMessage stream.
  void foreGroundMessageListener() {
    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      print(
          '///////////////////////////// NOTIFICATIONS ARE COMMING /////////////////////////////');
      print('${message.notification!.body} ');
      print("Message data type : ${message.data.runtimeType}");

      var bodyRaw = message.data['body'];
      var body = List<dynamic>.from(jsonDecode(bodyRaw ?? '[]'));
      print("body : $body");

      String bodyMessage = '';
      if (body.first['sale'] == null) {
        bodyMessage = body.first['name'];
      } else if (body.first['name'] == null) {
        bodyMessage = body.first['sale'];
      } else {
        bodyMessage =
            body.map((e) => e['name']   '-'   e['sale']).join(',  ').toString();
      }

      RemoteNotification? notification = RemoteNotification(
        android: const AndroidNotification(
          smallIcon: 'assets/imgs/logo.png',
          priority: AndroidNotificationPriority.highPriority,
          visibility: AndroidNotificationVisibility.public,
        ),
        apple: const AppleNotification(
          sound: AppleNotificationSound(
            name: 'sound',
          volume: 1.0,
          ),

        ),
        title: message.data['title'],
        body: bodyMessage,
      );
      // message.notification;
      AndroidNotification? android =
          notification.android; //message.notification?.android;
      if (notification != null && android != null && !kIsWeb) {
        flutterLocalNotificationsPlugin.show(
          notification.hashCode,
          notification.title,
          notification.body,
          NotificationDetails(
            android: AndroidNotificationDetails(
              channel.id,
              channel.name,
              channelDescription: channel.description,
              importance: Importance.max,
              priority: Priority.max,
              ticker: 'ticker',
              sound: const RawResourceAndroidNotificationSound('sound'),
              //   icon: "@mipmap/icon",
              playSound: true,
              styleInformation: const DefaultStyleInformation(true, true),
            ),
            iOS: const IOSNotificationDetails(
              presentAlert: true,
              presentBadge: true,
              presentSound: true,
              sound: 'sound',
            ),
          ),
        );
      }
    });

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print('A new onMessageOpenedApp event was published!');
      navigatorKey.currentState!.pushNamed(Routes.blackCurrency,
          arguments: false); //message.data['category']

      //  Navigator.pushNamed(
      //    context,
      //    '/message',
      //    arguments: MessageArguments(message, true),
      //  );
    });
  }
}

final fcmFunctions = FCMFunctions();

CodePudding user response:

Your server administrator will send you the sound name in notification payload which you added in iOS folder. Payload will look like this

{
    aps =     
    {
        alert = "notification message";
        sound = "example.caf";
    };
}

more information check this reference link 49 49

custom sound file for your app, follow this apple documentation.

  • Related