Проблемы развертывания приложения при сбое ввода-вывода ParseServer - PullRequest
0 голосов
/ 05 ноября 2019

Я достиг точки в разработке моего приложения, когда я хотел протестировать его на реальном устройстве (а не на эмуляторе). Хотя приложение еще не закончено, оно работает отлично, как и должно работать при работе на эмуляторе.

Итак, я создал APK для переноса на свое устройство и установил его. Однако все прошло хорошо, когда я нажимаю кнопку, которая запускает ParseQuery для построения массива, присоединяет его к ListView и отображает в AlertDialog, все, что я получаю (через 30-45 секунд), это тост, запрограммированный какобработчик ошибок с указанием «ошибка ввода-вывода» - это сообщение, полученное из ParseException.

Не уверен насчет требований к разрешению доступа в Интернет, касающихся ParseServers (в эмуляторе он работал нормально без разрешения доступа в Интернет), я попытался добавитьинтернет-разрешение на манифест и попытался еще раз ... это дало тот же результат.

Я пробовал отладку и выпуск сборок, а также подписанные и неподписанные APK-файлы с одинаковыми результатами. За исключением сборки без подписи, которую мой телефон не установил бы.

Я в растерянности с этим, поскольку я впервые протестировал приложение с использованием ParseServer, поэтому я спрашиваю всех вас, ребята, есть лилюбую помощь, которую вы можете оказать.

Дайте мне знать, если есть какие-то определенные сегменты кода, которые вам нужно просмотреть, и я опубликую их, но, как я уже сказал, в эмуляторе все работает нормально, поэтому я могу только предположить, что это потенциальнопроблема либо с тем, как я собираю apk, либо с развертыванием экземпляра ParseServer на AWS.

ооо, и я решил пока не использовать никакой вид аутентификации пользователя с этим приложением, поэтому я не будуНе обращайтесь к пользовательскому классу любым способом, и автоматический пользователь включен.

Запрошен код @Davi Macêdo - я не уверен, какую часть инициализации вы запрашиваете, поэтому я добавлю все области, которые, по моему мнению, связаны с настройкойРазбор для этого приложения -

.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);


}

}

адрес сервера не является общедоступным DNS, предоставленным AWS, яЭто ссылка, предоставленная файлом server.js, доступ к которому осуществляется через PuTTY после создания экземпляра. Единственный общедоступный DNS - это предоставленный для доступа к панели мониторинга ParseServer

Я использую бесплатный сервис t2.micro, предоставляемый AWS для размещения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"

Звучит для меня, поскольку это может быть проблемой у моего оператора мобильной связи !? Кто-нибудь может это подтвердить?

1 Ответ

0 голосов
/ 13 ноября 2019

В этом случае функция .getCause() оказалась неоценимой. Быстрый поиск ответа, который привел меня к этой странице - Решение № 2 здесь сработало для меня, краткий обзор ниже -

добавьте файл "network_security_config.xml" к res\ xml \ folder, содержащий -

<?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 и вуаля!

Спасибо @DaviMacédo, с вашей стороны, эта проблема меня мучает некоторое время.

Стоит отметить, что для окончательной сборки Решение №1 может быть более подходящим, так как оно включает создание сертификата безопасности. и использование безопасных протоколов https, но поскольку это все еще находится в стадии разработки, приведенное выше решение на данный момент полностью соответствует моим потребностям.

...