Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way for push notifications in libGDX (Android and iOS projects)?

Does someone knows if it is possible to add push notifications(like Amazon Simple Notification Service) in an Android and iOS with RoboVM libGDX projects? And if it is possible, are there any good tutorials or good hints how to implement such things?

I would be happy about every hint how I can implement it.

like image 396
Joschka Schulz Avatar asked Feb 20 '14 04:02

Joschka Schulz


2 Answers

Hi I know this is an old question but I was struggling to find a solution for this specially for iOS, but I finally found a way. If the explanation below is confusing and you prefer to see an example here is a github repo with a sample project:

Repo GitHub

I only show the code for iOS see the repo for Android.

The idea is simple you need to create a class that handles sending a notification for each platform on each of your projects (Android and iOS) and have it implement an interface called NotificationsHandler.

NotificationsHandler:

public interface NotificationsHandler {

    public void showNotification(String title, String text);
}

iOS Adapter:

public class AdapteriOS implements NotificationsHandler {

    public AdapteriOS () {
        //Registers notifications, it will ask user if ok to receive notifications from this app, if user selects no then no notifications will be received
        UIApplication.getSharedApplication().registerUserNotificationSettings(UIUserNotificationSettings.create(UIUserNotificationType.Alert, null));
        UIApplication.getSharedApplication().registerUserNotificationSettings(UIUserNotificationSettings.create(UIUserNotificationType.Sound, null));
        UIApplication.getSharedApplication().registerUserNotificationSettings(UIUserNotificationSettings.create(UIUserNotificationType.Badge, null));

        //Removes notifications indicator in app icon, you can do this in a different way
        UIApplication.getSharedApplication().setApplicationIconBadgeNumber(0);
        UIApplication.getSharedApplication().cancelAllLocalNotifications();
    }


    @Override
    public void showNotification(final String title, final String text) {
        NSOperationQueue.getMainQueue().addOperation(new Runnable() {
            @Override
            public void run() {
                NSDate date = new NSDate();
                //5 seconds from now
                NSDate secondsMore = date.newDateByAddingTimeInterval(5);

                UILocalNotification localNotification = new UILocalNotification();
                localNotification.setFireDate(secondsMore);
                localNotification.setAlertBody(title);
                localNotification.setAlertAction(text);
                localNotification.setTimeZone(NSTimeZone.getDefaultTimeZone());
                localNotification.setApplicationIconBadgeNumber(UIApplication.getSharedApplication().getApplicationIconBadgeNumber() + 1);

                UIApplication.getSharedApplication().scheduleLocalNotification(localNotification);
            }
        });
    }
}

Now by default Libgdx passes your ApplicationListener or Game object to AndroidLauncher and IOSLauncher along with a configuration object. The trick is to pass the class we created earlier to the ApplicationListener so that you can use it inside your Core project. Simple enough:

public class IOSLauncher extends IOSApplication.Delegate {

    @Override
    protected IOSApplication createApplication() {
        IOSApplicationConfiguration config = new IOSApplicationConfiguration();

        // This is your ApplicationListener or Game class
        // it will be called differently depending on what you 
        // set up when you created the libgdx project
        MainGame game = new MainGame();

        // We instantiate the iOS Adapter
        AdapteriOS adapter = new AdapteriOS();

        // We set the handler, you must create this method in your class
        game.setNotificationHandler(adapter);

        return new IOSApplication(game, config);
    }

    public static void main(String[] argv) {
        NSAutoreleasePool pool = new NSAutoreleasePool();
        UIApplication.main(argv, null, IOSLauncher.class);
        pool.close();
    }
}

Now that you have a reference to the implementation of NotificationHandler you can simply call it through your Core project.

public class MainGame extends Game {

    // This is the notificatino handler
    public NotificationHandler notificationHandler;

    @Override
    public void create () {

        // Do whatever you do when your game is created
        // ...
    }

    @Override
    public void render () {
        super.render();

        // This is just an example but you
        // can now send notifications in your project
        if(condition)
            notificationHandler.showNotification("Title", "Content");
    }

    @Override
    public void dispose() {
        super.dispose();
    }

    // This is the method we created to set the notifications handler
    public void setNotificationHandler(NotificationHandler handler) {
        this.notificationHandler = handler;
    }
}

One last thing

If you need to run the Desktop version then you will need to do the same thing for Desktop otherwise you might get errors, it will not do anything on the Desktop, or you can check the platform before calling the method showNotfication. You can clone the repo where I do this:

Repo GitHub

like image 121
Leo Avatar answered Oct 13 '22 00:10

Leo


I've never done it myself. But you can use this tutorial to find out how to write Android specific code in your libGDX project. Your Android code could then receive the notifications and trigger a callback in libGDX. I hope this is at least a step in the right direction.

However I' not sure about doing the same for iOS.

like image 20
Steven Trigg Avatar answered Oct 12 '22 22:10

Steven Trigg