【问题标题】:Why is my app not starting on iOS and just showing a loading screen?为什么我的应用程序没有在 iOS 上启动并且只显示加载屏幕?
【发布时间】:2019-07-13 04:51:08
【问题描述】:

我在 Codename One 中开发了一个应用程序。在模拟器中,该应用程序可在 iPhone 和 Android 手机上运行。现在我在手机上安装了该应用程序。它可以在不同的 Android 手机上完美运行。然后我将它安装在 iPhone 上。我可以安装它,但随后我尝试启动应用程序并出现一个加载屏幕,它只是在加载,没有其他任何反应。

我没有对init(Object) 方法进行太多更改。我刚刚添加 if (Display.getInstance().canForceOrientation()) { Display.getInstance().lockOrientation(true); }.

start() 方法中,我为 OAuth2 登录创建了登录类的对象,然后将必要的数据(Oauth2 URL、重定向 URI、客户端 ID、客户端密码)添加到该对象。然后我调用doLogin() 方法。我将我的代码包装在 try/catch() 中,但它并没有改变任何东西。

try {
            Login login = new Login() {
                @Override
                public boolean isNativeLoginSupported() {
                    return false;
                }

                @Override
                protected boolean validateToken(String token) {
                    return false;
                }
            };
            login.setOauth2URL(URL_LOGIN);
            login.setRedirectURI(URL_REDIRECT);
            login.setClientId(CLIENTID);
            login.setClientSecret(CLIENT_SECRET);
            login.setCallback(new LoginCallback() {
                @Override
                public void loginSuccessful() {
                    WelcomeForm.getInstance().show();
                }

                @Override
                public void loginFailed(String errorMessage) {
                }
            });
            login.doLogin();
        } catch (Throwable t) {
            Log.e(t);
            Form error = new Form("Errror", new BorderLayout());
            TextArea txt = new TextArea(t.toString());
            error.add(CENTER, txt);
            error.show();
        }

【问题讨论】:

  • 出了点问题,我猜,到目前为止你是如何调试你的应用程序的?你看到了什么?
  • 您在init(Object)start() 方法中做了什么?您是否在其中一个中显示Dialog?如果是这样,那可能是个问题
  • @holex 还没调试app,今天调试一下,因为我没有Mac
  • @ShaiAlmog 我没有在其中一种方法中显示对话框。
  • 我猜你的 oauth 代码在 iOS 上触发了异常。我建议注释掉代码,直到您可以缩小异常的来源。

标签: ios codenameone loading


【解决方案1】:

尝试对您的代码进行此更改,它可能会在进程中的某处触发调用和阻塞,这应该解决此问题:

Form loading = new Form("Login");
Button login = new Button("Login");
login.addActionListener(e ->
    try {
        Login login = new Login() {
            @Override
            public boolean isNativeLoginSupported() {
                return false;
            }

            @Override
            protected boolean validateToken(String token) {
                return false;
            }
        };
        login.setOauth2URL(URL_LOGIN);
        login.setRedirectURI(URL_REDIRECT);
        login.setClientId(CLIENTID);
        login.setClientSecret(CLIENT_SECRET);
        login.setCallback(new LoginCallback() {
            @Override
            public void loginSuccessful() {
                WelcomeForm.getInstance().show();
            }

            @Override
            public void loginFailed(String errorMessage) {
            }
        });
        login.doLogin();
    } catch (Throwable t) {
        Log.e(t);
        Form error = new Form("Errror", new BorderLayout());
        TextArea txt = new TextArea(t.toString());
        error.add(CENTER, txt);
        error.show();
    }});
loading.show();

原答案如下:

在 iOS 上没有阻止 OAuth 的固有限制。我猜您遇到了一个异常,该异常会触发错误Dialog 并导致此失败。我建议用 try/catch() 包裹该区域并将错误记录为 FormLog 例如:

try {
   // your OAuth code
} catch(Throwable t) {
   Log.e(t);
   Form error = new Form("Errror", new BorderLayout());
   TextArea txt = new TextArea(t.toString());
   error.add(CENTER, txt);
   error.show();
}

知道异常和错误消息后,您可以尝试进一步缩小问题范围。如果您有权访问日志,我们还可以看到堆栈跟踪,例如通过Log.sendLogAsync()

【讨论】:

  • 我用 try/catch() 包装了我的代码,但没有其他任何反应。它不会抛出异常。
  • 对不起,同样的事情正在发生,只是带有加载标志的表单有一个标题(加载)。
  • 我再次查看了代码,发现Login 类调用了Oauth2 类,其中显示了Dialog。这在启动时会出现问题,甚至可能无法在 callSerially 中使用。尝试新建议的解决方法。一旦按钮处于活动状态,UI 就会完全初始化,并且对话框应该可以正常工作。如果可行,我们会尝试想出更好的解决方法。
  • 出现带有按钮的表单,但点击按钮后出现加载屏幕,它只是在加载,没有其他反应。
  • 我猜这是因为组件中的错误决定将浏览器组件放在Dialog 中。在我们的测试中从未达到此代码,因为在 iOS OAuth 通常会转到您明确禁用的本机登录。我认为我们需要解决这个问题。您可以提出问题,根据使用表单而不是对话框的代码创建自己的 OAuth 逻辑。它实际上应该比为更旧版本的 Codename One 设计的当前代码简单得多。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2019-02-20
  • 2012-10-25
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多