有没有办法在 libGDX(Android 和 iOS 项目)中推送通知?

2022-01-12 00:00:00 android ios push-notification java libgdx

有人知道是否可以在带有 RoboVM libGDX 项目的 Android 和 iOS 中添加推送通知(如 Amazon Simple Notification Service)?如果可能的话,是否有任何好的教程或好的提示如何实现这些东西?

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.

推荐答案

您好,我知道这是一个老问题,但我一直在努力寻找专门针对 iOS 的解决方案,但我终于找到了方法.如果下面的解释令人困惑,并且您更愿意在此处查看示例,请参阅带有示例项目的 github 存储库:

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:

回购 GitHub

我只显示 iOS 的代码,请参阅 Android 的 repo.

这个想法很简单,您需要创建一个类来处理在每个项目(Android 和 iOS)上为每个平台发送通知,并让它实现一个名为 NotificationsHandler 的接口.

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 适配器:

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);
            }
        });
    }
}

现在默认情况下,Libgdx 会将您的 ApplicationListener 或 Game 对象连同配置对象一起传递给 AndroidLauncher 和 IOSLauncher.诀窍是将我们之前创建的类传递给 ApplicationListener,以便您可以在核心项目中使用它.很简单:

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();
    }
}

现在您有了对 NotificationHandler 实现的引用,您可以简单地通过您的核心项目调用它.

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;
    }
}

最后一件事

如果你需要运行桌面版本,那么你需要对桌面做同样的事情,否则你可能会得到错误,它不会在桌面上做任何事情,或者你可以在调用方法 showNotfication 之前检查平台.你可以克隆我这样做的仓库:

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:

回购 GitHub

相关文章