2016-11-23 3 views
0

Я переношу приложение Android и iOS с Parse.com на Parse Server. Сначала я делаю эту миграцию с помощью тестового приложения, чтобы убедиться, что все в порядке. С iOS не было проблем, но с Android обновленное приложение вылетает каждый раз, когда пользователь входит в приложение.Android-переход от Parse к Parse Server сбой

Это Android код обновления:

public static void initParse(Application app) { 
    ctxt = app.getApplicationContext(); 
    Parse.enableLocalDatastore(app); 
    // Old version 
    //Parse.initialize(app, "<my app id>", "<my client key>"); 
    // New version 
    Parse.initialize(new Parse.Configuration.Builder(ctxt) 
      .applicationId("<my app id>") 
      .clientKey(null) 
      .server("https://<my new server>/parse/") 
      .build() 
    ); 
    ParseUser.enableRevocableSessionInBackground(); 
} 

Катастрофа возвращает «com.parse.ParseException: java.lang.IllegalStateException: невозможно закодировать ассоциацию с несохраненным ParseObject», и принимая во внимание что я читал в Stackoverflow, это потому, что ParseUser.getCurrentUser() возвращает значение null (несмотря на то, что пользователь вошел в систему), и методы анализа не работают.

Фактически, если я принимаю тот же код, раскомментирую старую версию Parse.initialize, прокомментирую новую версию Parse.initialize, скомпилируем и запустим приложение, оно запускается без проблем и пользователь может использовать его правильно ,

Но, если я прокомментирую старую версию Parse.initialize, раскомментируйте новую версию Parse.initialize, скомпилируйте и запустите приложение, это немедленно сработает, потому что ParseUser.getCurrentUser() возвращает значение null, а методы анализа не работают.

Что мне здесь не хватает? Должен ли я заставлять моих пользователей снова входить в систему? Это кажется мне плохим UX, и в любом случае, в iOS у меня нет проблем с новой версией, в чем разница между обеими платформами?

EDIT 1:

Следуя совету Роберт Раунтри Я изменил инициализацию к этому:

public static void initParse(Application app) { 
    ctxt = app.getApplicationContext(); 
    Parse.enableLocalDatastore(app); 
    // Old version 
    //Parse.initialize(app, "<my app id>", "<my client key>"); 
    // New version 
    Parse.initialize(new Parse.Configuration.Builder(ctxt) 
      .applicationId("<my app id>") 
      .clientKey("<my client key>") 
      .server("https://<my new server>/parse/") 
      .build() 
    ); 
    //Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG); 
    Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE); 
    ParseUser.enableRevocableSessionInBackground(); 
} 

Кроме того, я проверил, что мой Анализировать версия последний доступный, у меня есть это в моем Gradle файле:

compile 'com.parse.bolts:bolts-android:1.+' 
compile 'com.parse:parse-android:1.+' 

И результат тот же, что приложение падает с «com.parse.ParseException: Java .lang.IllegalStateException: невозможно закодировать связь с несохраненным ParseObject «первым вызовом, который я делаю для Parse. Кроме того, уникальный журнал, который я могу видеть, связанный с синтаксическим разбором, связан с маркером GCM, и больше ничего.

EDIT 2:

Я попробовал другую вещь, удалить приложение со старой инициализации и установить его с помощью новой инициализации и, как я догадался, что новая версия теперь работает.

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

Но это подсказка: нет никаких проблем с новой инициализацией, но с тем, как старый «пар» «реагирует» при открытии приложения с новым Parse Server, должно быть какое-либо несогласованность в getCurrentUser или что-то в этом роде.

+0

Проверка ParseSDK является актуальной. попробуйте с clientKey обратно в (нулевым) ... также «Parse.setLogLevel (Parse.LOG_LEVEL_DEBUG);» для дополнительной информации –

+0

Спасибо, Роберт! Я внес изменения, но результаты остались прежними. – Wonton

ответ

1

Вы можете попробовать инициализировать так:

Parse.initialize(new Parse.Configuration.Builder(this) 
         .applicationId("APP_ID") 
         .clientKey("CLIENT_KEY") 
         .server("https://SERVER_URL/parse/") // The trailing slash is important. 
         .enableLocalDataStore() 
         .build() 
       ); 

Обратите внимание на

.enableLocalDataStore() 

находится в initilization. Снимите это:

Parse.enableLocalDatastore(app); 
+1

Да! В этом была проблема !!! Могу ли я дать вам 1000 зеленых чеков? ;-) – Wonton