Я действительно надеюсь, что кто-то может мне помочь.Отправить токен регистрации 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();
}
}
}
Вы, кажется, имеют различные попытки здесь. Я бы отказался от усилий с веб-просмотром, это похоже на боль, чем это стоит. Но тот, что находится в 'sendRegistrationToServer()', закомментирован. Если вы включите этот код (и удалите материал webview), что произойдет? –
Благодарим вас за ответ.Я знаю, что firebase getToken() называется асинхронно, поэтому мне нужно дождаться загрузки токена. Теперь вопрос в том, как загрузить приложение, а затем дождаться появления токена и после того, как токен отправит его на PHP, а затем, наконец, покажет пользователю раздел входа в систему. Я думал о splashscreen, но не знал, как реализовать его, поскольку я новичок в android – Wisd0m
'onTokenRefresh()' будет вызываться, когда токен обновляется, поэтому вам не нужно его ждать. Вы, возможно, должны будете ждать запроса «OkHttpClient», так как это будет асинхронный вызов. Но я не использовал OkHttp, и вообще я не думаю, что в этом простом коде есть много чего ждать. –