代码之家  ›  专栏  ›  技术社区  ›  tarun14110

通知服务

  •  7
  • tarun14110  · 技术社区  · 6 年前

    我正在尝试使用FireBase接收Android通知。我已经定义了以下服务。但是服务 MyFirebaseInstanceIDService 正在首次运行应用程序。当时我甚至没有用户的数据库。我想为用户存储FireBase令牌,但首先我想在第一个活动中为用户创建一个条目,并在第二个活动中启动服务。以便存储用户的令牌。

    Android清单文件

    <service
        android:name="in.anamika.anamika.notifications.MyFirebaseMessagingService"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>
    <service android:name="in.anamika.anamika.notifications.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
    
    3 回复  |  直到 6 年前
        1
  •  5
  •   Man    6 年前

    基于我如何理解你的问题,我看到了一个以上的解决方案,如下所示:

    1. 最初,您可以将令牌保存为共享首选项,如Nainal所述。 稍后,当用户成功登录并创建数据库时,可以将其存储到表中。

    更新后的API返回 任务 您可以在其上添加OnSuccess侦听器,当您成功获取令牌时将调用该侦听器。

        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(yourActivity,  
        new OnSuccessListener<InstanceIdResult>() {                    
                    @Override
                    public void onSuccess(InstanceIdResult instanceIdResult) {
                          String deviceToken = instanceIdResult.getToken();
                          // Do whatever you want with your token now
                          // i.e. store it on SharedPreferences or DB
                          // or directly send it to server 
                    }
    });
    
    1. 时间很长,但你可以从 本体更新() OnNewtoken()。 ,将中的回调接口设置为从活动广播接收器,并通过重写回调方法获取活动中的调用。

    注:该 FireBaseInstanceID服务 相反,我们可以重写onNewtoken()以仅在FireBaseMessagingService中获取新的/更新的令牌。
    你可以查一下 this 链接。

        2
  •  3
  •   Sachin Rajput KgaboL    6 年前

    将此代码放入启动程序/主活动中:

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

    这将为您获取令牌,而不是转到下面的网站-

    https://console.firebase.google.com/project/_/notification create new notification->choose single device->paste 登录到Android Studio项目中的令牌->检查您是否收到通知

        3
  •  0
  •   Umar Hussain    6 年前

    注: 解决方案基于 FirebaseInstanceIdService 和FireBaseMessagingService类。但它将与firebase android sdk的更新一起工作

    下面是解决问题的方案:

    1. 在令牌刷新的回调中,首先检查 FirebaseUser 存在身份验证。如果存在,只需将令牌写入 FireBase数据库。同时将布尔值存储到共享首选项 如果令牌保存在数据库中,则为true,否则将其设置为false。这就解决了 问题是您没有数据库访问权限,但您正在获取令牌。

    2. 接下来,在单独的类中创建一个异步任务,该类只调用 FirebaseInstanceId.getInstance().getToken(); 触发 onTokenRefresh 服务中。

    3. 在firebase auth成功后的登录过程中,调用 上面的异步任务将强制 本体更新 回拨。现在 由于存在用户身份验证,您对数据库的写入将成功(同时 设置共享首选项 令牌发送到数据库 =真)。

    4. 现在,在启动活动时,您正在检查用户身份验证 导航到适当的活动添加检查共享pref 令牌发送到数据库 =false;再次调用异步任务。这将确保如果上面的一些步骤错过了令牌在数据库中的保存,我们可以 再次发送令牌。

    5. 最后一点,除非您强制将FCM的令牌更改为 更改或如果应用程序未安装。所以代币只能 只向数据库写入一次。

    另外,请确保在用户注销后,您的FCM令牌将过期,否则您的服务器将继续向注销用户发送通知。 firebaseInstanceID.getInstance().deleteInstanceID();