为什么我的应用程序没有在iOS上启动,只是显示一个加载屏幕?
我开发了一个代号为One的应用程序。在模拟器中,该应用程序可以在iPhone和Android手机上运行。现在我在手机上安装了这个应用程序。它在不同的安卓手机上工作得非常好。然后我把它安装在iPhone上。我可以安装它,但当我尝试启动应用程序时,会出现一个加载屏幕,它正在加载,其他什么都没有发生 我没有太多地更改为什么我的应用程序没有在iOS上启动,只是显示一个加载屏幕?,ios,codenameone,loading,Ios,Codenameone,Loading,我开发了一个代号为One的应用程序。在模拟器中,该应用程序可以在iPhone和Android手机上运行。现在我在手机上安装了这个应用程序。它在不同的安卓手机上工作得非常好。然后我把它安装在iPhone上。我可以安装它,但当我尝试启动应用程序时,会出现一个加载屏幕,它正在加载,其他什么都没有发生 我没有太多地更改init(Object)方法。我刚才补充说 if(Display.getInstance().canForceOrientation()){ Display.getInstance().l
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();
}
尝试对代码进行此更改,它可能会触发流程中的某个位置的调用和阻止,这应该可以解决以下问题:
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的固有限制。我猜您会遇到一个异常,它会触发一个错误对话框
,并导致此故障。我建议用try/catch()包装该区域,并将错误记录为表单
或日志
,例如:
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()
尝试对代码进行此更改,它可能会触发进程中的某个位置的调用和阻塞,这应该可以解决以下问题:
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的固有限制。我猜您会遇到一个异常,它会触发一个错误对话框
,并导致此故障。我建议用try/catch()包装该区域,并将错误记录为表单
或日志
,例如:
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()
出现问题,我想,到目前为止您是如何调试应用程序的?你看到了什么?你在init(Object)
和start()
方法中做了什么?是否在其中一个对话框中显示对话框
?如果是这样的话,那将是一个巨大的挑战problem@holex我还没有调试应用程序,今天我将调试它,因为我没有Mac@ShaiAlmog我没有在其中一个方法中显示对话框。我猜您的oauth代码在iOS上触发了一个异常。我建议注释掉代码,直到你能缩小异常的来源。我想,出了点问题,到目前为止你是如何调试你的应用程序的?你看到了什么?你在init(Object)
和start()
方法中做了什么?是否在其中一个对话框中显示对话框
?如果是这样的话,那将是一个巨大的挑战problem@holex我还没有调试应用程序,今天我将调试它,因为我没有Mac@ShaiAlmog我没有在其中一个方法中显示对话框。我猜您的oauth代码在iOS上触发了一个异常。我建议注释掉代码,直到可以缩小异常源的范围为止。我用try/catch()包装了代码,但没有发生其他事情。它没有引发异常。很抱歉,除了带有加载符号的表单有一个标题(加载)之外,发生了同样的事情。我再次查看了代码,我看到Login
类调用了Oauth2
类,其中显示了一个对话框。这在启动时是有问题的,甚至可能无法在callSerially
中工作。尝试新建议的解决方法。按钮激活后,UI将完全初始化,对话框应能正常工作。如果这样做有效,我们将尝试想出一个更好的解决方法。带有按钮的表单会出现,但单击按钮后,加载屏幕会出现,它只是加载,没有其他任何事情发生。我猜这是失败的,因为组件中的错误决定将浏览器组件放在对话框中。这段代码在我们的测试中从未达到,因为在iOS OAuth上,它通常会转到您显式禁用的本机登录。我想我们需要解决这个问题。您可以归档一个问题,并根据使用表单而不是对话框的代码创建自己的OAuth逻辑。它实际上应该比当前代码简单得多,当前代码是为旧版本的Codename One设计的。它没有引发异常。很抱歉,除了带有加载符号的表单有一个标题(加载)之外,发生了同样的事情。我再次查看了代码,我看到Login
类调用了Oauth2
类,其中显示了一个对话框。这在启动时是有问题的,甚至可能无法在callSerially
中工作。尝试新建议的解决方法。按钮激活后,UI将完全初始化,对话框应能正常工作。如果这样做有效,我们将尝试想出一个更好的解决方法。带有按钮的表单会出现,但单击按钮后,加载屏幕会出现,它只是加载,没有其他任何事情发生。我猜这是失败的,因为组件中的错误决定将浏览器组件放在对话框中。这段代码在我们的测试中从未达到,因为在iOS OAuth上,它通常会转到您显式禁用的本机登录。我想我们需要解决这个问题。您可以归档一个问题,并根据使用表单而不是对话框的代码创建自己的OAuth逻辑。它实际上应该比当前的代码简单得多,当前的代码是为旧版本的Codename One设计的。