我真的希望有人能帮助我。
我在我的 android 应用程序中设置了 Firebase,它显示了我使用 CakePHP 3 构建的网站的 webView。当我手动将设备令牌添加到数据库时,Firebase 通知确实有效,但我发现很难理解的是如何登录后我得到了注册令牌,所以我可以将它与 user_id 合并并将它们保存到数据库中。
更新
我现在拥有的代码能够将令牌发送到我的 PHP 服务器。如果我将令牌直接存储到数据库中它可以正常工作,但我需要在他们登录时将令牌与 user_id 合并,所以我需要将令牌存储在会话中(例如,请参见下面的 PHP 代码)但是当我尝试使用$session->read('device_id')它时是空的。
我认为这可能与我的 MainActivity webView 在加载 onCreate() 方法时删除当前的 PHP 会话有关,但我不确定。
这是在 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();
}
}
}