ParseServer 的应用程序部署问题 i/o 失败
App deployment issues with ParseServer i/o failure
我在我的应用程序开发中遇到了一个问题,我想在实际设备(而不是模拟器)上对其进行测试。虽然该应用程序尚未完成,但它在模拟器上 运行 时可以正常运行。
所以我构建了一个 APK 以传输到我的设备并安装它。然而,这一切都很顺利,当我按下一个运行 ParseQuery 的按钮来构建一个数组,将它附加到一个 ListView 并显示在一个 AlertDialog 中时,我收到的(30-45 秒后)是一个编程为错误处理程序说明 'i/o failure' - 这是从 ParseException 中检索到的消息。
不确定有关 ParseServers 的互联网权限要求(它在没有互联网许可的情况下在模拟器中运行良好),我尝试将互联网权限添加到清单中并再次尝试...这产生了相同的结果。
我尝试过调试和发布版本,以及签名和未签名的 APK,结果都相同。除了我的 phone 不会安装的未签名版本之外。
我对此一头雾水,因为这是我第一次使用 ParseServer 测试应用程序,所以我想问问你们这些好人是否可以提供任何帮助。
让我知道您是否需要查看任何特定的代码段,我会 post 它们,但正如我所说,它在模拟器中运行良好,所以我只能假设它可能是一个问题无论是我构建 apk 的方式,还是在 AWS 上部署 ParseServer 实例的方式。
哦..而且我已经选择不对这个应用程序使用任何类型的用户身份验证,所以我不会以任何方式访问用户 class 并且自动用户已启用。
代码请求@Davi Macêdo - 我不确定你请求的是初始化的哪一部分,所以我将添加我认为涉及为此应用程序设置 Parse 的所有区域 -
.StarterApplication -
package com.app.letsplaydarts;
import android.app.Application;
import com.parse.Parse;
import com.parse.ParseACL;
import com.parse.ParseUser;
public class StarterApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Enable Local Datastore.
Parse.enableLocalDatastore(this);
// Add your initialization code here
Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
.applicationId("9da08bc83....62b73e6ea")
.clientKey("a04b8e7866a9....67fc3dbebfbd")
.server("http://ipaddress/parse/")
.build()
);
ParseUser.enableAutomaticUser();
ParseACL defaultACL = new ParseACL();
defaultACL.setPublicReadAccess(true);
defaultACL.setPublicWriteAccess(true);
ParseACL.setDefaultACL(defaultACL, true);
}
}
服务器地址不是AWS提供的publicDNS,是参考
由创建实例后通过 PuTTY 访问的 server.js 文件提供
提供的唯一 public DNS 是用于访问 ParseServer 仪表板的 DNS
我正在使用 AWS 提供的 t2.micro 免费服务来托管 Bitnami ParseServer
相关项目Gradle部分-
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
相关模块 Gradle 部分 -
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.parse.bolts:bolts-tasks:1.4.0'
implementation 'com.parse:parse-android:1.17.3'
}
PuTTY 控制台结果 运行 curl http://ip/parse/ -v
bitnami@ip-:~$ curl http://ip/parse/ -v
* Trying ip...
* TCP_NODELAY set
* Connected to ip (ip) port 80 (#0)
> GET /parse/ HTTP/1.1
> Host: ip
> User-Agent: curl/7.53.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< Date: Tue, 12 Nov 2019 13:24:03 GMT
< Server: Apache
< X-Frame-Options: SAMEORIGIN
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
< Access-Control-Allow-Headers: X-Parse-Master-Key, X-Parse-REST-API-Key, X-Parse-Javascript-Key, X-Parse-Application-Id, X-Parse-Client-Version, X-Parse-Session-Token, X-Requested-With, X-Parse-Revocable-Session, Content-Type, Pragma, Cache-Control
< Access-Control-Expose-Headers: X-Parse-Job-Status-Id, X-Parse-Push-Status-Id
< Content-Length: 24
< Cache-Control: s-maxage=10
<
* Connection #0 to host ip left intact
{"error":"unauthorized"}bitnami@ip:~$
我已经设法从 ParseException 中检索到一些额外的信息,如下 -
.getMessage() returns "I/o failure"
.getCode() returns "100" - Listed as a 'client-only' error
// ConnectionFailed 100 The connection to the Parse servers failed.
.getCause() returns "java.net.UnknownServiceException: CLEARTEXT communication to [ipaddress] not permitted by network security policy"
我觉得这可能是我的移动 phone 网络提供商的问题!?谁能证实这一点?
在这种情况下,.getCause()
功能被证明是无价的。快速搜索一下给出的回复,我找到了 this page - 这里的解决方案 #2 对我有用,下面是一个快速概述 -
将文件 "network_security_config.xml" 添加到包含 -
的 res\xml\ 文件夹
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">your domain or ip address</domain>
</domain-config>
</network-security-config>
然后将以下行添加到 AndroidManifest.xml -
android:networkSecurityConfig="@xml/network_security_config"
重建 APK 瞧!
谢谢@Davi Macêdo 的意见,这个问题困扰了我一段时间。
值得注意的是,对于最终构建,解决方案 #1 可能更合适,因为它涉及创建安全证书和使用安全 https 协议,但由于这仍在开发中,因此上述解决方案目前完全符合我的需求。
我在我的应用程序开发中遇到了一个问题,我想在实际设备(而不是模拟器)上对其进行测试。虽然该应用程序尚未完成,但它在模拟器上 运行 时可以正常运行。
所以我构建了一个 APK 以传输到我的设备并安装它。然而,这一切都很顺利,当我按下一个运行 ParseQuery 的按钮来构建一个数组,将它附加到一个 ListView 并显示在一个 AlertDialog 中时,我收到的(30-45 秒后)是一个编程为错误处理程序说明 'i/o failure' - 这是从 ParseException 中检索到的消息。
不确定有关 ParseServers 的互联网权限要求(它在没有互联网许可的情况下在模拟器中运行良好),我尝试将互联网权限添加到清单中并再次尝试...这产生了相同的结果。
我尝试过调试和发布版本,以及签名和未签名的 APK,结果都相同。除了我的 phone 不会安装的未签名版本之外。
我对此一头雾水,因为这是我第一次使用 ParseServer 测试应用程序,所以我想问问你们这些好人是否可以提供任何帮助。
让我知道您是否需要查看任何特定的代码段,我会 post 它们,但正如我所说,它在模拟器中运行良好,所以我只能假设它可能是一个问题无论是我构建 apk 的方式,还是在 AWS 上部署 ParseServer 实例的方式。
哦..而且我已经选择不对这个应用程序使用任何类型的用户身份验证,所以我不会以任何方式访问用户 class 并且自动用户已启用。
代码请求@Davi Macêdo - 我不确定你请求的是初始化的哪一部分,所以我将添加我认为涉及为此应用程序设置 Parse 的所有区域 -
.StarterApplication -
package com.app.letsplaydarts;
import android.app.Application;
import com.parse.Parse;
import com.parse.ParseACL;
import com.parse.ParseUser;
public class StarterApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Enable Local Datastore.
Parse.enableLocalDatastore(this);
// Add your initialization code here
Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
.applicationId("9da08bc83....62b73e6ea")
.clientKey("a04b8e7866a9....67fc3dbebfbd")
.server("http://ipaddress/parse/")
.build()
);
ParseUser.enableAutomaticUser();
ParseACL defaultACL = new ParseACL();
defaultACL.setPublicReadAccess(true);
defaultACL.setPublicWriteAccess(true);
ParseACL.setDefaultACL(defaultACL, true);
}
}
服务器地址不是AWS提供的publicDNS,是参考 由创建实例后通过 PuTTY 访问的 server.js 文件提供 提供的唯一 public DNS 是用于访问 ParseServer 仪表板的 DNS
我正在使用 AWS 提供的 t2.micro 免费服务来托管 Bitnami ParseServer
相关项目Gradle部分-
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
mavenCentral()
}
}
相关模块 Gradle 部分 -
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.parse.bolts:bolts-tasks:1.4.0'
implementation 'com.parse:parse-android:1.17.3'
}
PuTTY 控制台结果 运行 curl http://ip/parse/ -v
bitnami@ip-:~$ curl http://ip/parse/ -v
* Trying ip...
* TCP_NODELAY set
* Connected to ip (ip) port 80 (#0)
> GET /parse/ HTTP/1.1
> Host: ip
> User-Agent: curl/7.53.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< Date: Tue, 12 Nov 2019 13:24:03 GMT
< Server: Apache
< X-Frame-Options: SAMEORIGIN
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
< Access-Control-Allow-Headers: X-Parse-Master-Key, X-Parse-REST-API-Key, X-Parse-Javascript-Key, X-Parse-Application-Id, X-Parse-Client-Version, X-Parse-Session-Token, X-Requested-With, X-Parse-Revocable-Session, Content-Type, Pragma, Cache-Control
< Access-Control-Expose-Headers: X-Parse-Job-Status-Id, X-Parse-Push-Status-Id
< Content-Length: 24
< Cache-Control: s-maxage=10
<
* Connection #0 to host ip left intact
{"error":"unauthorized"}bitnami@ip:~$
我已经设法从 ParseException 中检索到一些额外的信息,如下 -
.getMessage() returns "I/o failure"
.getCode() returns "100" - Listed as a 'client-only' error
// ConnectionFailed 100 The connection to the Parse servers failed.
.getCause() returns "java.net.UnknownServiceException: CLEARTEXT communication to [ipaddress] not permitted by network security policy"
我觉得这可能是我的移动 phone 网络提供商的问题!?谁能证实这一点?
在这种情况下,.getCause()
功能被证明是无价的。快速搜索一下给出的回复,我找到了 this page - 这里的解决方案 #2 对我有用,下面是一个快速概述 -
将文件 "network_security_config.xml" 添加到包含 -
的 res\xml\ 文件夹<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">your domain or ip address</domain>
</domain-config>
</network-security-config>
然后将以下行添加到 AndroidManifest.xml -
android:networkSecurityConfig="@xml/network_security_config"
重建 APK 瞧!
谢谢@Davi Macêdo 的意见,这个问题困扰了我一段时间。
值得注意的是,对于最终构建,解决方案 #1 可能更合适,因为它涉及创建安全证书和使用安全 https 协议,但由于这仍在开发中,因此上述解决方案目前完全符合我的需求。