Search code examples
ioslibgdxgoogle-signinrobovmmobivm

Login google by RoboVM/RoboPod


Anyone here has used roboPod of roboVM for google sign in.i'm appreciate if you concern my post and answer to me. I don't know how to using this library and i've ever knew programming ios

https://github.com/robovm/robovm-robopods/tree/master/google-signin


Solution

  • Use RoboPods for Google SignIn by MobiVM's RoboVM Fork

    1. Follow install instruction
    2. Get an OAuth client ID & URL scheme for your project from here
    3. Add your URL scheme inside info.plist.xml

      <key>CFBundleURLTypes</key>
       <array>
       <dict>
       <key>CFBundleTypeRole</key>
          <string>Editor</string>
          <key>CFBundleURLName</key>
          <string>com.googleusercontent.apps.1234567890-qweasdzxcqweasdzxc321456</string>
          <key>CFBundleURLSchemes</key>
          <array>
             <string>com.googleusercontent.apps.1234567890-qweasdzxcqweasdzxc321456</string>
           </array>
       </dict>
       <dict>
              <key>CFBundleTypeRole</key>
              <string>Editor</string>
              <key>${bundle.id}</key>
              <string>${bundle.id}</string>
              <key>CFBundleURLSchemes</key>
              <array>
                  <string>${bundle.id}</string>
              </array>
      </dict>
      </array>
      
    4. Inside iOS module

      GIDSignIn.getSharedInstance().setUiDelegate(new GIDSignInUIDelegateAdapter() {
              private UIViewController libgdxViewController;
      
              @Override
              public void willDispatch(GIDSignIn signIn, NSError error) {
      
              }
      
              @Override
              public void presentViewController(GIDSignIn signIn, UIViewController viewController) {
      
                  libgdxViewController =  UIApplication.getSharedApplication().getKeyWindow().getRootViewController();
                  libgdxViewController.presentViewController(viewController, true, null);
                  UIApplication.getSharedApplication().getKeyWindow().setRootViewController(viewController);
              }
      
              @Override
              public void dismissViewController(GIDSignIn signIn, UIViewController viewController) {
                  viewController.dismissViewController(true, null);
              }
          });
      

      Set Sign-In callback :

      GIDSignIn.getSharedInstance().setDelegate(GIDSignInDelegate v);
      

      SignIn

      GIDSignIn.getSharedInstance().setClientID(OAUTHCLIENTID); // set OAuth client ID
      GIDSignIn.getSharedInstance().signIn();
      

      Override openURL method inside IOSLauncher class:

      @Override
      public boolean openURL(UIApplication application, NSURL url, String sourceApplication, NSObject annotation) {
           boolean canRespond = GIDSignIn.getSharedInstance().handleURL(url, sourceApplication, (NSPropertyList)annotation);
           if (canRespond) {
              return true;
           } else {
              return false;
           }
      }
      

    Use interfacing to access platform specific APIs.

    EDIT Test Code:

    Inside core module :

    1. SignInServiceApi.java

      public interface SignInServiceApi {
          void signIn();
          void signOut();
      }
      
    2. MyGDXTest.java

      public class MyGDXTest extends ApplicationAdapter {
      
         private SignInServiceApi signInServiceApi;
      
          private Stage stage;
          private Label name;
          private Label emailId;
          private Skin skin;
      
          public Main(SignInServiceApi signInServiceApi){
              this.signInServiceApi=signInServiceApi;
          }
      
          @Override
          public void create () {
      
             stage=new Stage(new StretchViewport(400f,640f));
             skin = new Skin(Gdx.files.internal("skin/uiskin.json"));
      
             Table root = new Table();
             root.setFillParent(true);
             stage.addActor(root);
      
             root.defaults().pad(10f);
      
             name=new Label("Name :", skin);
             emailId=new Label("Email :", skin);
      
             TextButton signIn=new TextButton("Sign In", skin);
             signIn.addListener(new ClickListener(){
              @Override
              public void clicked(InputEvent event, float x, float y) {
                  signInServiceApi.signIn();
                  super.clicked(event, x, y);
              }
            });
      
             TextButton disconnect=new TextButton("Sign Out", skin);
          disconnect.addListener(new ClickListener(){
              @Override
              public void clicked(InputEvent event, float x, float y) {
                  signInServiceApi.signOut();
                  super.clicked(event, x, y);
              }
          });
      
          root.add(name).row();
          root.add(emailId).row();
          root.add(signIn).width(150).height(50f).row();
          root.add(disconnect).width(150).height(50f);
      
          Gdx.input.setInputProcessor(stage);
      }
      
         public void updateData(String name,String emilId){
             this.name.setText("Name : "+name.toUpperCase());
             this.emailId.setText("Email : "+emilId.toUpperCase());
         }
      
         @Override
         public void render () {
            Gdx.gl.glClearColor(1, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
      
            stage.act();
            stage.draw();
         }
      
         @Override
         public void dispose () {
            stage.dispose();
            skin.dispose();
         }
      
         @Override
         public void resize(int width, int height) {
             stage.getViewport().update(width,height);
         }
      }
      

    Inside ios module :

    1. IOSLauncher.java

      public class IOSLauncher extends IOSApplication.Delegate implements GIDSignInDelegate {
      
        private MyGDXTest main;
      
        @Override
        protected IOSApplication createApplication() {
      
          IOSApplicationConfiguration config = new IOSApplicationConfiguration();
          return  new IOSApplication(main=new MyGDXTest(new IOSSignIn(this)), config);
        }
      
        public static void main(String[] argv) {
            NSAutoreleasePool pool = new NSAutoreleasePool();
            UIApplication.main(argv, null, IOSLauncher.class);
            pool.close();
        } 
      
      @Override
      public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options) {
          return GIDSignIn.getSharedInstance().handleURL(url,options.getSourceApplication(),(NSPropertyList)options.getAnnotation());
      }
      
      
      @Override
      public void didSignIn(GIDSignIn signIn, GIDGoogleUser user, NSError error) {
      
          if (error==null){
              GIDProfileData gidProfileData=user.getProfile();
              main.updateData(gidProfileData.getName(),gidProfileData.getEmail());
          }
      
          Gdx.app.log("GIDSignInDelegate:didSignIn", "Error is "+error);
      }
      
        @Override
        public void didDisconnect(GIDSignIn signIn, GIDGoogleUser user, NSError error) {
            if (user==null) {
                main.updateData("", "");
            }
            Gdx.app.log("GIDSignInDelegate:didDisconnect", "Error is "+error);
          }
      }
      
    2. IOSSignIn // ios implementation class of SignInServiceApi

      public class IOSSignIn implements SignInServiceApi {
      
         private final static String CLIENT_ID = "1111-xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com";
      
         public IOSSignIn(IOSLauncher app){
      
             GIDSignIn.getSharedInstance().setDelegate(app);
      
             GIDSignIn.getSharedInstance().setUiDelegate(new GIDSignInUIDelegateAdapter() {
      
                @Override
                public void willDispatch(GIDSignIn signIn, NSError error) { }
      
                @Override
                public void presentViewController(GIDSignIn signIn, UIViewController viewController) {
                   UIViewController libgdxViewController =  UIApplication.getSharedApplication().getKeyWindow().getRootViewController();
                  libgdxViewController.presentViewController(viewController, true, null);
                }
      
                @Override
                public void dismissViewController(GIDSignIn signIn, UIViewController viewController) {
                  viewController.dismissViewController(true, null);
                }
          });
         }
      
         @Override
         public void signIn() {
             GIDSignIn.getSharedInstance().setClientID(CLIENT_ID);
             GIDSignIn.getSharedInstance().signIn();
         }
      
        @Override
        public void signOut() {
            GIDSignIn.getSharedInstance().signOut();
            GIDSignIn.getSharedInstance().disconnect();
         }
      }
      

    I've tested again with my another google account, working fine for me on my iPhone.