OneSignal Not calling didReceiveRemoteNotification
Asked Answered
V

4

5

We migrated from UA to One Signal. We are sending push from cloud code like

var pushInfo = {
      "app_id" : "xxxxxx",          
      "data": {
          "objectId": objectId,
          "placeId": placeId,
      },
      "included_segments": ["All Users"],
      "contents": {"en": message}
};
var headers = {
    "Content-Type": "application/json; charset=utf-8",
    "Authorization": "Basic XXXXX"
};

var options = {
 host: "onesignal.com",
 port: 443,
 path: "/api/v1/notifications",
 method: "POST",
 headers: headers,
};

var https = require('https');
var req = https.request(options, function(res) {  
res.on('data', function(data) {
  console.log("Response:");
  console.log(JSON.parse(data));
});
});

req.on('error', function(e) {
console.log("ERROR:");
console.log(e);
 });  
req.write(JSON.stringify(pushInfo));
req.end();

In my AppDelegate.m I do

[OneSignal initWithLaunchOptions:launchOptions appId:@"XXXXX"];

Now earlier when a notification is received and user Taps on it, it used to call

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

Q. This is not getting called now. How do I handle it with OneSignal. Q. What I need to do to handle a silent notification (no visible badge/banner etc)

Vixen answered 15/11, 2016 at 0:27 Comment(0)
A
7

I Assume you are testing/running your app on an iOS10 device,

I looked at OneSignal SDK Code and I think the SDK automatically uses the new UserNotifications Framework (add in iOS10), when iOS10 is detected on device.

In this case, the AppDelegate method you mentioned above does not get invoked, instead methods in UNUserNotificationCenterDelegate get invoked, which are captured by SDK to record clicks/views.

To Fix the issue, Create a new class which implements OSUserNotificationCenterDelegate and provide its instance to OneSignal using [OneSignal setNotificationCenterDelegate:yourCustomNotificationCenterDelegateInstance]

Please note that application:didReceiveRemoteNotification:fetchCompletionHandler: is still called when a silent push notification (content-available: 1) arrives, but its not called when user taps the notification if UNUserNotificationCenterDelegate is used.

Also, there was an issue on iOS 10.0.X where the application:didReceiveRemoteNotification was called instead of application:didReceiveRemoteNotification:fetchCompletionHandler: See: https://forums.developer.apple.com/thread/54332 , but I doubt if this is the case with you.

Artamas answered 16/11, 2016 at 5:58 Comment(1)
Thanks. May be it is a good idea to just use [OneSignal initWithLaunchOptions:launchOptions appId:@"XXXX" handleNotificationReceived:^(OSNotification *notification) { } which will work always across iOS8/9/10Vixen
S
4

One Signal Notification Integration

Use Following Block Of Code TO Handle PushNotification Message Content

Put below code in AppDelegate's ApplicationDidFinishLaunch Options method

    let notificationReceivedBlock: OSHandleNotificationReceivedBlock = { notification in

        print("Received Notification: \(notification!.payload.notificationID)")
    }

    let notificationOpenedBlock: OSHandleNotificationActionBlock = { result in
        // This block gets called when the user reacts to a notification received
        let payload: OSNotificationPayload = result!.notification.payload

        var fullMessage = payload.body
        print("Message = \(String(describing: fullMessage))")

        if payload.additionalData != nil {
            if payload.title != nil {
                let messageTitle = payload.title
                print("payload.category \(payload.category)")
                print("payload.subtitle \(payload.subtitle)")
                print("Message Title = \(messageTitle!)")
            }

            let additionalData = payload.additionalData
            if additionalData?["actionSelected"] != nil {
                fullMessage = fullMessage! + "\nPressed ButtonID: \(String(describing: additionalData!["actionSelected"]))"
            }
        }
    }

    let onesignalInitSettings = [kOSSettingsKeyAutoPrompt: false,
                                 kOSSettingsKeyInAppLaunchURL: true]

    OneSignal.initWithLaunchOptions(launchOptions,
                                    appId: "Your App Id",
                                    handleNotificationReceived: notificationReceivedBlock,
                                    handleNotificationAction: notificationOpenedBlock,
                                    settings: onesignalInitSettings)
   **Use following block of code To Receive OneSingnal Notification Content** 

    OneSignal.inFocusDisplayType = OSNotificationDisplayType.notification;

    // Recommend moving the below line to prompt for push after informing the user about
    //   how your app will use them.
    OneSignal.promptForPushNotifications(userResponse: { accepted in
        print("User accepted notifications: \(accepted)")
    })
Siglos answered 31/7, 2018 at 7:39 Comment(0)
A
1

application:didReceiveRemoteNotification:fetchCompletionHandler: is the correct selector for background silent content-available notifications. Make sure you are using the latest 2.2.2 OneSignal SDK as there were some fixes to maintain compatibility with the older AppDelegate selectors.

You may want to look into using UNNotificationServiceExtension with mutable-content for iOS 10 devices as this still works when the app has been swiped away.

Appling answered 15/11, 2016 at 3:28 Comment(0)
H
1

In my case all I had to do is remove the Firebase handlers in app delegate. OneSignal can hijack the events from FCM. This way I had both the OneSingal Push notification and the ones delivered by Firebase. As for One signal I used a simple copy and paste from their examples.

THIS ARE THE PARTS THAT I REMOVED FROM MY AppDelegate.m

REMOVE IMPORTS -> #import "RNFirebaseMessaging.h"
REMOVE IMPORTS -> #import "RNFirebaseNotifications.h"

IN: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
REMOVE ->[RNFirebaseNotifications configure];

REMOVE HANDLERS:
- (void)application:(UIApplication *)application 
didReceiveLocalNotification:(UILocalNotification *)notification {
  [[RNFirebaseNotifications instance] 
didReceiveLocalNotification:notification];
}
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo
                                                   
fetchCompletionHandler:(nonnull void (^). 
(UIBackgroundFetchResult))completionHandler{
  [[RNFirebaseNotifications instance] 
didReceiveRemoteNotification:userInfo 
fetchCompletionHandler:completionHandler];
  [UIApplication sharedApplication].applicationIconBadgeNumber += 1;
}

- (void)application:(UIApplication *)application 
didRegisterUserNotificationSettings:(UIUserNotificationSettings 
*)notificationSettings {
  [[RNFirebaseMessaging instance] 
didRegisterUserNotificationSettings:notificationSettings];
}

import { Platform } from 'react-native'
import OneSignal, { NotificationReceivedEvent, OpenedEvent } from 'react-native-onesignal'
import Config from '../../Config/Config'
import State from '../../State/State'

interface WithSuccess {
    success: boolean
}

interface ExternalUserIdResultI {
    push: WithSuccess
    email: WithSuccess
    sms: WithSuccess
}

class Messaging {

    public Init = () => {
        //OneSignal Init Code
        OneSignal.setLogLevel(Config.messaging.debugLevel, 0)
        OneSignal.setAppId(Platform.OS === 'ios' ? Config.messaging.iosAppId : Config.messaging.androidAppId)
        //END OneSignal Init Code

        //Prompt for push on iOS
        OneSignal.promptForPushNotificationsWithUserResponse((response: boolean) => {
            console.log("Prompt response:", response);
        })

        //Method for handling notifications received while app in foreground
        OneSignal.setNotificationWillShowInForegroundHandler((notificationReceivedEvent: NotificationReceivedEvent) => {
            console.log("OneSignal: notification will show in foreground:", notificationReceivedEvent);
            let notification = notificationReceivedEvent.getNotification();
            console.log("notification: ", notification);
            notificationReceivedEvent.complete(notification)
        })

        //Method for handling notifications opened
        OneSignal.setNotificationOpenedHandler((notification: OpenedEvent) => {
            console.log("OneSignal: notification opened:", notification);
        })

        OneSignal.addSubscriptionObserver(event => {
            console.log("OneSignal: subscription changed:", event);
        })
    }

    public SendTag = (key: string, value: string) => {
        OneSignal.sendTag(key, value)
    }

    public SetExternalUserId = (externalUserId: string) => {
        //@ts-ignore
        OneSignal.setExternalUserId(externalUserId, (results: ExternalUserIdResultI) => {
            // The results will contain push and email success statuses
            console.log('Results of setting external user id');
            console.log(results);
            
            // Push can be expected in almost every situation with a success status, but
            // as a pre-caution its good to verify it exists
            if (results.push && results.push.success) {
              console.log('Results of setting external user id push status:');
              console.log(results.push.success);
            }
            
            // Verify the email is set or check that the results have an email success status
            if (results.email && results.email.success) {
              console.log('Results of setting external user id email status:');
              console.log(results.email.success);
            }
          
            // Verify the number is set or check that the results have an sms success status
            if (results.sms && results.sms.success) {
              console.log('Results of setting external user id sms status:');
              console.log(results.sms.success);
            }
          });
    }

    public RemoveExternalUserId = () => {
        //@ts-ignore
        OneSignal.removeExternalUserId((results: ExternalUserIdResultI) => {
            // The results will contain push and email success statuses
            console.log('Results of removing external user id');
            console.log(results);
            // Push can be expected in almost every situation with a success status, but
            // as a pre-caution its good to verify it exists
            if (results.push && results.push.success) {
              console.log('Results of removing external user id push status:');
              console.log(results.push.success);
            }
            
            // Verify the email is set or check that the results have an email success status
            if (results.email && results.email.success) {
              console.log('Results of removoing external user id email status:');
              console.log(results.email.success);
            }
          });
    }

}

export default new Messaging()
Hilburn answered 13/11, 2021 at 20:23 Comment(2)
can you edit this for appdelegate.swift versionKarlakarlan
@HüseyinSezen I'm sorry but at current time I am not capable of editing this answer du to my work responsibilities. Feel free to do some research and back it up with a code in this thread or please send me the code so I could add it to the answer.Hilburn

© 2022 - 2024 — McMap. All rights reserved.