1

Я действительно надеюсь, что кто-то может мне помочь.Отправить токен регистрации Firebase после входа PHP в webView

У меня есть Firebase, установленный в моем приложении Android, который отображает webView моего сайта, который я создал с помощью CakePHP 3. Уведомления Firebase работают, когда я вручную добавляю токен устройства в базу данных, но то, что я нахожу трудно понять, как я могу получить регистрационный токен после входа в систему, поэтому я могу объединить его с user_id и сохранить их в базе данных.

UPDATE

код у меня есть теперь в состоянии послать маркер на мой PHP-сервер. Если я храню токен прямо в базе данных, он отлично работает, но мне нужно объединить токен с user_id при входе в систему, поэтому мне нужно сохранить токен в сеансе (см., Например, код PHP ниже), но когда я пытаюсь использовать $session->read('device_id') он пуст.

Я думаю, что это может иметь какое-то отношение к моему MainActivity webView, удаляющему текущий сеанс PHP, когда он загружает метод onCreate(), но не уверен.

Вот код для установки токена сеанса в PHP.

StoreTokenToSession (PHP)

public function index() 
{ 
    $session = $this->request->session(); 

    if(isset($_GET['device_id'])) 
    { 
     // Store in session until login 
     $session->write('device_id', $_GET['device_id']); 
    } 
} 

MainActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    webView = (WebView) findViewById(R.id.activity_main_webview); 

    webSettings = webView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 

    FirebaseMessaging.getInstance().subscribeToTopic("notifications"); 
    FirebaseInstanceId.getInstance().getToken(); 

    if (Build.VERSION.SDK_INT >= 19) { 
     webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 

    } 
    else if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19) { 
     webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 

    CookieManager cookieManager = CookieManager.getInstance(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    { 
     cookieManager.setAcceptThirdPartyCookies(webView,true); 
    } 
    else 
    { 
     cookieManager.setAcceptCookie(true); 
    } 

    webView.loadUrl("example.com"); 
} 

MyFirebaseInstanceIDService.java

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 

    private static final String TAG = "MyFirebaseIIDService"; 

    @Override 
    public void onTokenRefresh() { 

     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     Log.d(TAG, "Refreshed token: " + refreshedToken); 

     sendRegistrationToServer(refreshedToken); 
    } 

    private void sendRegistrationToServer(String token) { 

     OkHttpClient client = new OkHttpClient(); 

     Request request = new Request.Builder() 
      .url("example.com?device_id="+token) 
      .build(); 

     try { 
      Response response = client.newCall(request).execute(); 
      Log.d(TAG, String.valueOf(response)); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

Вы, кажется, имеют различные попытки здесь. Я бы отказался от усилий с веб-просмотром, это похоже на боль, чем это стоит. Но тот, что находится в 'sendRegistrationToServer()', закомментирован. Если вы включите этот код (и удалите материал webview), что произойдет? –

+0

Благодарим вас за ответ.Я знаю, что firebase getToken() называется асинхронно, поэтому мне нужно дождаться загрузки токена. Теперь вопрос в том, как загрузить приложение, а затем дождаться появления токена и после того, как токен отправит его на PHP, а затем, наконец, покажет пользователю раздел входа в систему. Я думал о splashscreen, но не знал, как реализовать его, поскольку я новичок в android – Wisd0m

+0

'onTokenRefresh()' будет вызываться, когда токен обновляется, поэтому вам не нужно его ждать. Вы, возможно, должны будете ждать запроса «OkHttpClient», так как это будет асинхронный вызов. Но я не использовал OkHttp, и вообще я не думаю, что в этом простом коде есть много чего ждать. –

ответ

0

Вам нужно хранить имя пользователя в месте, где услуга может Найди это. Допустим, вы используете Auth состояние слушателя (этот код, как правило, где-то в деятельности, где вы регистрируете пользователя):

FirebaseAuth 
    .getInstance() 
    .addAuthStateListener(new FirebaseAuth.AuthStateListener() { 
     public void onAuthStateChanged(FirebaseAuth firebaseAuth) { 
      setCurrentUser(firebaseAuth.getCurrentUser().getUid()); 
      PreferenceManager 
      .getDefaultSharedPreferences(this) 
      .edit() 
      .putString("uid", mUsername) 
      .commit(); 
     } 
    }); 

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

private void sendRegistrationToServer(String token) { 
    String uid = PreferenceManager.getDefaultSharedPreferences(this).getString("uid", null); 

    OkHttpClient client = new OkHttpClient(); 

    Request request = new Request.Builder() 
     .url("example.com?device_id="+token+"&uid="+uid) 
     .build(); 

    try { 
     Response response = client.newCall(request).execute(); 
     Log.d(TAG, String.valueOf(response)); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Так мы читаем UID, получить маркер и отправить их обоих прочь к серверу.

Здесь есть потенциальное состояние гонки: если первый токен приходит до входа пользователя, sendRegistrationToServer еще не имеет uid. Я оставлю эту часть упражнением для читателя, так как на самом деле он просто вызывает тот же код для этого второго потока.

+0

Этот код был бы идеальным, но логин и регистрация выполняются через CakePHP через webView, поэтому я не могу получить имя пользователя. Я пропустил что-то простое здесь или это сложно? Я работаю над этим в течение последних 4 дней подряд, поэтому я не могу сказать lol – Wisd0m

1

Возможно, слишком поздно, чтобы помочь вам в этом, а также, вероятно, и не лучший способ сделать это, но наше решение состояло в том, чтобы передать токен по URL-адресу в качестве base64 при вызове webview, а затем сохранить его на сеанс ... после входа в систему мы сохранили токен в сеансе зарегистрированному пользователю.

Что-то вроде этого:

String kDeviceToken = "https://hostname.com?deviceToken=%s"; 
String token = SessionManager.getInstance(getApplicationContext()).getFirebaseToken(); 
byte[] data = token.getBytes("UTF-8"); 
String base64 = Base64.encodeToString(data, Base64.DEFAULT); 
String url = String.format(kDeviceToken, base64); 
webView.loadUrl(url); 
+0

Предоставление дальнейших подробностей вашего ответа может помочь любым пользователям, которые ищут здесь свой путь от Google. Один из моих ответов, который не был принят, все равно решает меня периодически из-за нечетного продвижения. – danielcooperxyz

+0

Хорошая точка. Обновлен с некоторым примером кода. –

+0

@MatheusDardenne Что такое SessionManager? И мне нужно импортировать файлы Firebase в мой mainactivity.java? – meagler