我目前正在使用roboVM将LibGDX游戏移植到iOS。一切正常,但我遇到了一些问题,无法使绑定(bind)适用于admob和Google Play游戏服务。我可以解决Admob的问题,但是GPGS也遇到了同样的问题,但我找不到解决的办法。 bindings是绑定(bind)到各种iOS SDK的 Hook 。我使用它们来展示Admob广告并与Google Play服务交互。

我尝试在此处关注Sample.java:

Sample.java

但这对我来说有一些问题。首先,示例重写的didFinishLaunching()方法是错误的,并且永远不会被调用。它应该替代didFinishLaunching(UIApplication应用程序,UIApplicationLaunchOptions launchOptions)。

我现在遇到的主要问题是游戏由于window.makeKeyAndVisible()调用而无法接受用户输入。如果我采用这种方法,一切都会很好,但我无法展示广告或Google Play服务。我将看到有关窗口不在 View 层次结构中的警告。我可以针对admob插页式广告解决此问题,方法是仅在显示广告之前调用makeKeyAndVisible(),然后在插页式广告的代理中将其关闭后再调用setHidden()。但是,我无权对Google Play服务执行相同的操作。似乎没有其他人遇到此问题。可能是什么问题呢?我对iOS不太熟悉,所以我不了解如何使我的应用正确接收输入。

最佳答案

好的,因此使用Admob和GPGS或其他绑定(bind)将LibGDX游戏发布到iOS是一个痛苦的过程,但是我设法使所有功能正常运行,并且游戏现在处于等待审阅状态。在回答此问题时,似乎苹果公司正在拒绝使用Google Play游戏服务的应用程序,因为GPGS SDK会将用户带到Safari进行登录。这对于每个苹果公司都是 Not Acceptable ,因为这是“糟糕的用户体验”。实际上,当用户尝试登录GPGS SDK时,系统会先寻找Google+的安装才能登录,如果找不到该文件,请先然后打开Chrome浏览器,最后打开Safari(如果未安装Chrome)。在正确整合了GPGS并尝试将二进制文件提交给Apple之后,我面临着另一个问题,那就是Google SDK未签名。由于即使我要解决该问题,我的应用程序似乎也会被拒绝,因此我决定放弃GPGS并改用Apple的Game Center。也就是说,在我的测试设备上使用Admob仍能获得GPGS,因此我可以在这里回答。

首先,BlueRiverInteractive中的样本对于LibGDX游戏并不是很有用。您不必弄乱的所有UIWindow,UIViewController和UIView东西。您的IOSLauncher类应扩展Delegate而不是UIApplicationDelegateAdapter。如果在Delegate内部查看,它将为您的应用程序设置UIApplication,UIWindow和其他iOS内容。扩展它时,您将被强制实现createApplication()。例如,这是我的:

@Override
protected IOSApplication createApplication() {

    final IOSApplicationConfiguration config = new IOSApplicationConfiguration();
    config.orientationLandscape = false;
    config.orientationPortrait = true;
    config.useAccelerometer = false;
    config.useCompass = false;

    iosApplication = new IOSApplication(new SplishGame(this), config);
    return iosApplication;
}

将iosApplication保留为IOSLauncher类的字段成员。通过它,您可以获得显示插页式广告和排行榜/成就所需的UIWindow。

第二件事是确保您的IOSLauncher类覆盖了didFinishLaunching(UIApplication application,UIApplicationLaunchOptions launchOptions)而不是仅使用一个参数的didFinishLaunching方法,否则它将不会被调用。在didFinishLaunching方法中,您可以实例化您的GPGS管理器类(稍后详细介绍),然后尝试以静默方式登录。这使我想起了在尝试集成GPGS时遇到的另一个问题-确保您使用GPGS管理器对象使生活更轻松(PlayServicesManager)。 GPGS绑定(bind)项目中有两个示例,我最初是在寻找“难用”的示例,它不使用PlayServicesManager类。设置好管理器对象后,就可以调用诸如manager.login()或manager.getLeaderboards()之类的简单方法来完成您需要做的事情。

要在didFinishLaunching方法中初始化您的经理类,请执行以下操作:
    playManager = new PlayServicesManager();
    playManager.setClientId(CLIENT_ID);
    playManager.setUserDataToRetrieve(true, false);
    playManager.setViewController(iosApplication.getUIViewController());
    playManager.didFinishLaunching();

对于Game Center,它是这样的:
gcManager = new GameCenterManager(iosApplication.getUIWindow(), new GameCenterListener() {...(overridden methods left blank)
gcManager.login();

然后,核心项目中的代码可以通过ActionResolver接口(interface)或任何命名为 native 接口(interface)的函数调用必要的函数。因此,您将拥有以下内容:
@Override
    public void getLeaderboards() {
            log.debug("Showing all leaderboards.");
            playManager.showLeaderboardsPicker();
    }

一切都应该工作。

显然,您需要做的另一件事(仅适用于GPGS)是将该方法复制到IOSLauncher类中:
// copy-paste this to your app delegate.
    @Override
    public boolean openURL(UIApplication application, NSURL url, String sourceApplication, NSPropertyList annotation) {
        return GPPURLHandler.handleURL(url, sourceApplication, annotation);
    }

就我所记得的就此。如果您认为有问题或我忘记了重要事项,请发表。

关于java - libGDX iOS游戏未收到输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27349947/

10-09 06:52