java - libgdx iOS 与 Android Studio with MobiDevelop/robovm-robopods 登录 "keychain error"

标签 java libgdx robovm

我在 Android Studio 下使用 LibGDX 和 RoboPods 为 iOS 编译。 从 RoboVM 迁移到 mobidevelop 我现在面临一些问题。 最主要的是我无法登录 Google。

我收到以下错误:

[GPGManager signIn:didSignInForUser:withError:]:[main] FAILED LOGGING INTO GOOGLE PLUS GAMES Error Domain=com.google.GIDSignIn Code=-2 "keychain error" UserInfo={NSLocalizedDescription=keychain error} 

Xcode 版本 8.2 安卓工作室 我正在使用适用于 iOS 的 Google 登录 SDK 版本 4.0.0 https://developers.google.com/identity/sign-in/ios/sdk/

我知道您可以在 XCode 中更改您的 KeyChain 参数,但由于这是一款 LibGDX 游戏,我不使用 XCode。

说明该问题的示例项目位于 githiub 上:https://github.com/julienvillegas/LibGDX-Google-Play-Game-Services-Integration-Sample

我的代码如下:

import com.badlogic.gdx.Screen;
import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;
import com.julienvillegas.CrosswordParty.CrosswordParty;
import com.julienvillegas.CrosswordParty.NearbyGPGSPlayers;
import com.julienvillegas.GameWorld.CrosswordCommon.CrosswordGiftCreate.GiftGridCombinations;
import com.julienvillegas.GameWorld.Global;
import com.julienvillegas.actionResolver.ActionResolver;

import org.robovm.apple.foundation.Foundation;
import org.robovm.apple.foundation.NSArray;
import org.robovm.apple.foundation.NSAutoreleasePool;
import org.robovm.apple.foundation.NSError;
import org.robovm.apple.foundation.NSObject;
import org.robovm.apple.foundation.NSString;
import org.robovm.apple.foundation.NSURL;
import org.robovm.apple.uikit.UIActivityViewController;
import org.robovm.apple.uikit.UIApplication;
import org.robovm.apple.uikit.UIApplicationLaunchOptions;
import org.robovm.apple.uikit.UIViewController;
import org.robovm.objc.block.VoidBlock4;
import org.robovm.pods.google.games.GPGAchievement;
import org.robovm.pods.google.games.GPGAchievementUnlockCallback;
import org.robovm.pods.google.games.GPGLauncherController;
import org.robovm.pods.google.games.GPGLeaderboard;
import org.robovm.pods.google.games.GPGLeaderboardLoadScoresCallback;
import org.robovm.pods.google.games.GPGLeaderboardTimeScope;
import org.robovm.pods.google.games.GPGManager;
import org.robovm.pods.google.games.GPGPlayer;
import org.robovm.pods.google.games.GPGPlayerGetCallback;
import org.robovm.pods.google.games.GPGScore;
import org.robovm.pods.google.games.GPGScoreReport;
import org.robovm.pods.google.games.GPGScoreReportCallback;
import org.robovm.pods.google.games.GPGStatusDelegate;
import org.robovm.pods.google.mobileads.GADInterstitial;
import org.robovm.pods.google.mobileads.GADInterstitialDelegateAdapter;
import org.robovm.pods.google.mobileads.GADMobileAds;
import org.robovm.pods.google.mobileads.GADRequest;
import org.robovm.pods.google.mobileads.GADRequestError;
import org.robovm.pods.google.signin.GIDSignIn;
import org.robovm.pods.google.signin.GIDSignInUIDelegateAdapter;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class IOSLauncher extends IOSApplication.Delegate implements ActionResolver,GPGStatusDelegate {
    private static NearbyGPGSPlayers nearbyGPGSPlayers;
    public static final String CLIENT_ID_FREE = "xxxx.yy.z1";
    public static final String CLIENT_ID_NOADS = "xxxx.yy.z2";
    public static String CLIENT_ID = "";
    private IOSApplication app;
    static public GADInterstitial interstitial;
    static private GPGPlayer gpgplayer;
    private Screen postAdScreen;
    GADRequest request;
    IOSApplication local_app;

    @Override
    protected IOSApplication createApplication() {
        System.out.println("IOSLauncher:createApplication:start");
        if(Global.FREE_EDITION){
            CLIENT_ID = CLIENT_ID_FREE;
        }
        else{
            CLIENT_ID = CLIENT_ID_NOADS;
        }
        System.out.println("IOSLauncher:createApplication:Step1");
        IOSApplicationConfiguration config = new IOSApplicationConfiguration();
        System.out.println("IOSLauncher:createApplication:Step2");
        app =  new IOSApplication(CrosswordParty.getInstance(this), config);
        local_app = app;
        System.out.println("IOSLauncher:createApplication:configuring ads");

        GADMobileAds.disableSDKCrashReporting();
        createRequest();
       interstitial = createAndLoadInterstitial();
        System.out.println("IOSLauncher:createApplication:end");


        GIDSignIn.getSharedInstance().setUiDelegate(new GIDSignInUIDelegateAdapter() {
            private UIViewController libgdxViewController;

            @Override
            public void willDispatch(GIDSignIn signIn, NSError error) {
                Foundation.log("willDispatch()");
            }

            @Override
            public void presentViewController(GIDSignIn signIn, UIViewController viewController) {
                Foundation.log("presentViewController()");
                libgdxViewController =  UIApplication.getSharedApplication().getKeyWindow().getRootViewController();
                 //       .presentViewController(viewController, true, null);

                UIApplication.getSharedApplication().getKeyWindow().setRootViewController(viewController);

            }

            @Override
            public void dismissViewController(GIDSignIn signIn, UIViewController viewController) {
                Foundation.log("dismissViewController()");
                //viewController.dismissViewController(true, null);
                UIApplication.getSharedApplication().getKeyWindow().setRootViewController(libgdxViewController);

            }
        });

        return app;


    }

    public static void main(String[] argv) {
       System.out.println("IOSLauncher:main:start");
        NSAutoreleasePool pool = new NSAutoreleasePool();
        UIApplication.main(argv, null, IOSLauncher.class);
        pool.close();
        System.out.println("IOSLauncher:main:end");
    }

    @Override
    public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) {
        super.didFinishLaunching(application, launchOptions);
        Foundation.log("IOSLauncher didFinishLaunching()");

          //  GIDSignIn.getSharedInstance().setAllowsSignInWithWebView(true);

            GPGManager.getSharedInstance().signIn(CLIENT_ID, true);

        return true;
    }

    private GADInterstitial createAndLoadInterstitial() {
        System.out.println("IOSLauncher:createAndLoadInterstitial:here");

        if(Global.DEV_MODE){
            //interstitial = new GADInterstitial(GGLContextMobileAds.getSharedInstance().getAdUnitIDForInterstitialTest());
             interstitial = new GADInterstitial("xxxxx");
        }
        else{
            //interstitial = new GADInterstitial(GGLContextMobileAds.getSharedInstance().getConfiguration().getInterstitialAdUnitID());
             interstitial = new GADInterstitial("yyyyy");
        }


        interstitial.setDelegate(new GADInterstitialDelegateAdapter() {
            @Override
            public void didReceiveAd(GADInterstitial ad) {
                System.out.println("IOSLauncher:createAndLoadInterstitial:received ad.");

            }

            @Override
            public void didDismissScreen(GADInterstitial ad) {
                System.out.println("IOSLauncher:createAndLoadInterstitial:closed ad");
                CrosswordParty.getInstance().setScreen(postAdScreen);
            }

            @Override
            public void didFailToReceiveAd(GADInterstitial ad, GADRequestError error) {
                System.out.println("IOSLauncher:createAndLoadInterstitial:error" + error.description());
                System.out.println("IOSLauncher:createAndLoadInterstitial:error" + error.getErrorCode());

            }
        });
        interstitial.loadRequest(request);

        return interstitial;
    }

    private GADRequest createRequest() {
        System.out.println("IOSLauncher:createRequest:here");

        request = new GADRequest();

        // To test on your devices, add their UDIDs here:
        request.setTestDevices(Arrays.asList(GADRequest.getSimulatorID()));

        return request;
    }


    @Override
    public void showOrLoadInterstital(Screen aScreen) {
        System.out.println("IOSLauncher:showOrLoadInterstital:here");
        if(postAdScreen == null){
            postAdScreen = CrosswordParty.crosswordScreen;
        }
        if (postAdScreen.getClass() == CrosswordParty.crosswordScreen.getClass()) {
            postAdScreen = CrosswordParty.scrableScreen;
        } else {
            postAdScreen = CrosswordParty.crosswordScreen;

        }
        if (interstitial.isReady()) {
            System.out.println("IOSLauncher:showOrLoadInterstital:showing add!");
            UIViewController viewController = UIApplication.getSharedApplication().getKeyWindow().getRootViewController();
            interstitial.present(viewController);
            //interstitial.present(app.getUIViewController());

        } else {
            System.out.println("IOSLauncher:showOrLoadInterstital:Interstitial not ready!");
            CrosswordParty.getInstance().setScreen(postAdScreen);
        }
        createAndLoadInterstitial();
    }


    @Override
    public boolean getSignedInGPGS() {
        System.out.println("IOSLauncher:getSignedInGPGS:is Signed in? " + GPGManager.getSharedInstance().isSignedIn());
        return GPGManager.getSharedInstance().isSignedIn();
    }

    @Override
    public void loginGPGSSilently() {
        System.out.println("IOSLauncher:loginGPGSSilently:Start");
        if(!getSignedInGPGS()){
            try {
                GPGManager.getSharedInstance().signIn(CLIENT_ID, true);
                GPGManager.getSharedInstance().setStatusDelegate(this);

            } catch (final Exception ex) {
            }
        };
    }

    @Override
    public void loginGPGS() {
        System.out.println("IOSLauncher:loginGPGS:Start");
        if(!getSignedInGPGS()){
            try {
                GPGManager.getSharedInstance().signIn(CLIENT_ID, false);
                GPGManager.getSharedInstance().setStatusDelegate(this);

            } catch (final Exception ex) {
            }
        };
    }



    @Override
    public String getGPGSName() {
        if (GPGManager.getSharedInstance().isSignedIn()) {
            return gpgplayer.getDisplayName();
        } else{
            loginGPGS();
            return null;
        }
    }

    @Override
    public void submitScoreGPGS(int score) {
        System.out.println("IOSLauncher:submitScoreGPGS:here");
        GPGScore gpgScore = new GPGScore(Global.LEADERBOARD_SCORE);
        gpgScore.setValue(score);
        GPGScoreReportCallback gpgscoreReportCallback =  new GPGScoreReportCallback(){

            @Override
            public void done(GPGScoreReport report, NSError error) {
                if (error != null) {
                    System.out.println("IOSLauncher:submitScoreGPGS:Error");
                }
                else{
                    System.out.println("IOSLauncher:submitScoreGPGS:Done");
                }
            }
        };
        gpgScore.submitScore(gpgscoreReportCallback);
    }

    @Override
    public void submitStarChallengeScoreGPGS(int starChallenge) {
        System.out.println("IOSLauncher:submitStarChallengeScoreGPGS:here");
        GPGScore gpgScore = new GPGScore(Global.LEADERBOARD_STARSTREAK);
        gpgScore.setValue(starChallenge);
        GPGScoreReportCallback gpgscoreReportCallback =  new GPGScoreReportCallback(){
            @Override
            public void done(GPGScoreReport report, NSError error) {
                if (error != null) {
                    System.out.println("IOSLauncher:submitScoreGPGS:Error");
                }
                else{
                    System.out.println("IOSLauncher:submitScoreGPGS:Done");
                }
            }
        };
        gpgScore.submitScore(gpgscoreReportCallback);
    }

    @Override
    public void submitCrosswordChallengeScoreGPGS(int crosswordChallenge) {
        System.out.println("IOSLauncher:submitCrosswordChallengeScoreGPGS:here");
        GPGScore gpgScore = new GPGScore(Global.LEADERBOARD_COMBOS);
        gpgScore.setValue(crosswordChallenge);
        GPGScoreReportCallback gpgscoreReportCallback =  new GPGScoreReportCallback(){
            @Override
            public void done(GPGScoreReport report, NSError error) {
                if (error != null) {
                    System.out.println("IOSLauncher:submitScoreGPGS:Error");
                }
                else{
                    System.out.println("IOSLauncher:submitScoreGPGS:Done");
                }
            }
        };
        gpgScore.submitScore(gpgscoreReportCallback);
    }

    @Override
    public void unlockAchievementGPGS(String achievementId) {
        System.out.println("IOSLauncher:unlockAchievementGPGS:here");
        GPGAchievement gpgachievement = new GPGAchievement(achievementId);

        GPGAchievementUnlockCallback gpgachievementUnlockCallback = new GPGAchievementUnlockCallback() {
            @Override
            public void done(boolean newlyUnlocked, NSError error) {
                if (error != null) {
                    System.out.println("IOSLauncher:unlockAchievementGPGS:Error while unlocking!");
                } else {
                    System.out.println("IOSLauncher:unlockAchievementGPGS:unlock succeeded. newlyUnlocked: " + newlyUnlocked);
                }
            }
        };
        gpgachievement.unlock(gpgachievementUnlockCallback);
    }

    @Override
    public void getAllLeaderboardsGPGS() {
        System.out.println("IOSLauncher:getAllLeaderboardsGPGS:here");
        boolean isSignedInFlag = GPGManager.getSharedInstance().isSignedIn();
        System.out.println("IOSLauncher:loginGPGS:is signed in?" + isSignedInFlag);
        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLauncherController.getSharedInstance().presentLeaderboardList();
        } else {
            loginGPGS();
        }
    }

    @Override
    public void getLeaderboardScoreGPGS() {
        System.out.println("IOSLauncher:getLeaderboardScoreGPGS:here");
        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLauncherController.getSharedInstance().presentLeaderboard(Global.LEADERBOARD_SCORE);
        } else{
            loginGPGS();
            //     loginGPGS();
        }
    }

    @Override
    public void getLeaderboardStarChallengeGPGS() {
        System.out.println("IOSLauncher:getLeaderboardStarChallengeGPGS:here");
        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLauncherController.getSharedInstance().presentLeaderboard(Global.LEADERBOARD_STARSTREAK);
        } else{
            loginGPGS();
        }
    }

    @Override
    public void getLeaderboardCrosswordChallengeGPGS() {
        System.out.println("IOSLauncher:getLeaderboardCrosswordChallengeGPGS:here");
        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLauncherController.getSharedInstance().presentLeaderboard(Global.LEADERBOARD_COMBOS);

        } else{
            loginGPGS();
        }
    }

    @Override
    public void getAchievementsGPGS() {
        System.out.println("IOSLauncher:getAchievementsGPGS:here");

        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLauncherController.getSharedInstance().presentAchievementList();

        } else{
            loginGPGS();
        }
    }



    @Override
    public void getNearbyPlayers() {
        System.out.println("IOSLauncher:getNearbyPlayers:here");
        if (GPGManager.getSharedInstance().isSignedIn()) {
            GPGLeaderboard gpgleaderboard = GPGLeaderboard.getLeaderboard(Global.LEADERBOARD_SCORE);
            gpgleaderboard.setSocial(true);
            gpgleaderboard.setPersonalWindow(true);
            gpgleaderboard.setTimeScope(GPGLeaderboardTimeScope.AllTime);


            GPGLeaderboardLoadScoresCallback gpgleaderboardLoadScoresCallback = new GPGLeaderboardLoadScoresCallback() {
                @Override
                public void done(NSArray<GPGScore> scores, NSError error) {
                    nearbyGPGSPlayers = new NearbyGPGSPlayers(gpgplayer.getPlayerId());

                    for(int i = 0;i< scores.size();i++){
                        GPGScore aScore = scores.get(i);
                        GPGPlayer aScorePlayer = aScore.getPlayer();
                        System.out.println("IOSLauncher:getNearbyPlayers:Player:" + aScorePlayer.getDisplayName() + "Score:" + aScore.getValue());
                        nearbyGPGSPlayers.addPlayer(aScorePlayer.getPlayerId(), aScorePlayer.getDisplayName(),aScore.getValue(),aScore.getFormattedRank());
                    }
                    nearbyGPGSPlayers.notify_Player();
                }
            };

            gpgleaderboard.loadScores(gpgleaderboardLoadScoresCallback);

        }
        else{
            loginGPGS();
        }


    }

    @Override
    public void sendGiftGrid(String textToShare, String subject, String URL) {
        NSArray<NSObject> items = new NSArray<>(
                new NSString(textToShare),
                new NSURL(URL));

        UIViewController viewController = UIApplication.getSharedApplication().getKeyWindow().getRootViewController();


       UIActivityViewController uiActivityViewController = new UIActivityViewController(items, null);
        uiActivityViewController.setCompletionWithItemsHandler(new VoidBlock4<String, Boolean, NSArray<NSObject>, NSError>() {
            @Override
            public void invoke(String s, Boolean aBoolean, NSArray<NSObject> nsObjects, NSError nsError) {
                GiftGridCombinations.getInstance().getSelectedCombination().setShared(true);

            }
        });
     /*   ((IOSApplication) Gdx.app).getUIViewController().presentViewController(uiActivityViewController, true, null);
*/
        viewController.presentViewController(uiActivityViewController, true, null);
    }

    @Override
    public void didFinishGamesSignIn(NSError error) {
        System.out.println("IOSLauncher:didFinishGamesSignIn:here");
        GPGPlayerGetCallback gpgplayerGetCallback = new GPGPlayerGetCallback(){

            @Override
            public void done(GPGPlayer player, NSError error) {
                gpgplayer = player;
                System.out.println("IOSLauncher:didFinishGamesSignIn:name:"+gpgplayer.getDisplayName()+":id:"+gpgplayer.getPlayerId());
                getNearbyPlayers();
            }
        };
        GPGPlayer.getLocalPlayer(gpgplayerGetCallback);


    }

    @Override
    public void didFinishGamesSignOut(NSError error) {
        System.out.println("IOSLauncher:didFinishGamesSignOut:here");

    }

    @Override
    public void didFinishGoogleAuth(NSError error) {
        System.out.println("IOSLauncher:didFinishGoogleAuth:here");
    }

    @Override
    public boolean shouldReauthenticate(NSError error) {
        System.out.println("IOSLauncher:shouldReauthenticate:here");

        return false;
    }

    @Override
    public void willReauthenticate(NSError error) {
        System.out.println("IOSLauncher:willReauthenticate:here");

    }
/*
    @Override
    public void finished(GTMOAuth2Authentication auth, NSError error) {
        System.out.println("IOSLauncher:finished:here");

    }
*/
    @Override
    public void didDisconnect(NSError error) {
        System.out.println("IOSLauncher:didDisconnect:here");

    }


/*

    @Override
    public boolean openURL(UIApplication application, NSURL url, String sourceApplication, NSPropertyList annotation) {
        System.out.println("IOSLauncher:openURL:here");
        boolean canRespond = GIDSignIn.getSharedInstance().handleURL(url, sourceApplication, annotation);
        if (canRespond) {
            return true;
        } else {
            // There might be other things you'd want to do here
            return false;
        }
    }
*/
    @Override
    public String getDateAsString(Date aDate, String format) {
        SimpleDateFormat SimpleDateFormat = new SimpleDateFormat(format) ;
        //DateTimeFormat dateFormat = DateTimeFormat.getFormat("yyyyMMddHHmmssS");

        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        SimpleDateFormat.setTimeZone(timeZone);
        Calendar cal = Calendar.getInstance(timeZone);
        cal.setTime(aDate);
        return SimpleDateFormat.format(cal.getTime()).trim();
    }

    @Override
    public Date getStringAsDate(String aDate, String format) {
        SimpleDateFormat SimpleDateFormat = new SimpleDateFormat(format) ;
        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        SimpleDateFormat.setTimeZone(timeZone);
        try {
            Date date = SimpleDateFormat.parse(aDate);
            return date;
        }
        catch(Exception e){
            return null;
        }
    }

    @Override
    public void runInBackground(Runnable toBeRun) {
        new Thread(toBeRun).start();
    }


}

最佳答案

这是 XCode 中的一个问题。 它应该只在您使用 XCode 进行调试时发生,因此如果您断开手机与 XCode 的连接并启动应用程序,您应该不会收到错误。 可能会通过转到 Target->Capabilities 并启用钥匙串(keychain)共享来解决。

该问题应在 XCode 8.2 中得到修复。

关于java - libgdx iOS 与 Android Studio with MobiDevelop/robovm-robopods 登录 "keychain error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41049549/

相关文章:

android - 从 android 代码启动 libGdx

java - 如何实现Google Play游戏服务、Intellij、libgdx

java - 需要将运行在 Linux 上的现有大型 Java Swing 应用程序迁移到 IOS(移动平台)

java - 如何将java控制台字体更改为斜体

java - Java中的instanceof模式匹配,不编译

java - 函数 <数据库名称>。 TOP 不存在

java - 在 libgdx 中渲染 Box2D 链形状

ios - 如何在iOS上覆盖UIViewController的功能?

java - iOS 的 Libgdx 项目在模拟器上通过 robovm 编译时显示 libgdx 启动?

java - spring @Cacheable 继承