2
votes

I'm developing an app and am trying to work out how I can notify a specific user when a different user performs a specific action. I'm trying to avoid setting up my own backend server, as I believe that what I want to do can be accomplished by OneSignal/Firebase.

I haven't tried it yet, but I figure with each user I could get their own OneSignal player_id (which is basically the OneSignal device_id), upload that to my firebase database, then when I want to send a push notification I simply pull the user's player_id from firebase and then use it to create a notification with OneSignals send to specific device, where using player_ids does not require the API Auth Key.

Though after looking through the documentation I'm not sure how a user can find (so they can then upload to firebase) their player_id, so if anyone could point me in that direction it would be appreciated.

Reading through other questions, it seems like this would work. I just wanted to see if there were any like potential issues with this method or if there were any safer or easier ways to go about it.

1

1 Answers

11
votes

Yes this is possible, what you need to do is:

  • Create an OneSignal and Firebase Account for API-Keys

  • Add One Signal (just an example)

    OneSignal.initWithLaunchOptions(launchOptions, appId: "your app id", handleNotificationReceived: { (notification) in
    
        }, handleNotificationAction: { (result) in
            let payload: OSNotificationPayload? = result?.notification.payload
            print(payload ?? "")
    
        }, settings: [kOSSettingsKeyAutoPrompt : false, kOSSettingsKeyInFocusDisplayOption: OSNotificationDisplayType.notification.rawValue])
    
  • save the push token/playerId to firebase (in users.id.onesignal for example)

    OneSignal.promptForPushNotifications(userResponse: nil)
    OneSignal.idsAvailable({(_ userId, _ pushToken) in
    print("UserId:\(userId!)")
    if let pushToken = pushToken {
        print("pushToken:\(pushToken)")
        FIRDatabase.database().reference().child("users").child(User.sharedInstance.uid).child("onesignal").setValue([userId!: pushToken])
    
    }
    })
    
  • When you have for every user an pushToken, you can send a notification to that playerId

    FIRDatabase.database().reference().child("users").child(friendId).child("onesignal").observeSingleEvent(of: .value, with: {snapshot in
        if snapshot.exists() {
    
            for (playerId, _) in snapshot.value as! Dictionary<String, String> {
    
                OneSignal.postNotification(["headings": ["en": title], "contents": ["en": message], "include_player_ids": [playerId]])
            }
        }
    })
    

This is not the full implementation and how to do it, but it will give you the right way I think.