有时一个信号返回UserId为null

时间:2019-02-01 08:20:59

标签: android onesignal

在我的应用程序中,我通过一个信号向用户发送通知。但有时一个信号返回空的用户ID ...那个时候我遇到了向用户发送通知的问题,我该如何解决。如果有人有解决方案,请与我分享

这是我用于生成用户ID的代码

    OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
            @Override
            public void idsAvailable(String userId, String registrationId) {
                Log.d("test","key is"+notification_key);
                notification_key=userId;
            }
        });

我正在MyApplication.class中初始化这样的一个信号

OneSignal.startInit(this)
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .unsubscribeWhenNotificationsAreDisabled(true)
                .init();

3 个答案:

答案 0 :(得分:3)

当用户接受推送通知权限时,他们不会立即拥有用户ID。当用户接受推送通知权限时,SDK将发出HTTP请求以向OneSignal的服务器注册。该请求完成后,将使用用户ID更新用户订阅状态。

我建议使用OSSubscriptionStateObserver协议,以便在订阅状态更改时进行更新。您可以在那里访问用户ID。

public class MainActivity extends Activity implements OSSubscriptionObserver {
  protected void onCreate(Bundle savedInstanceState) {
    OneSignal.addSubscriptionObserver(this);
  }

  public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) {
    if (!stateChanges.getFrom().getSubscribed() &&
        stateChanges.getTo().getSubscribed()) {
         new AlertDialog.Builder(this)
             .setMessage("You've successfully subscribed to push notifications!")
             .show();
        // get player ID
        stateChanges.getTo().getUserId();
      }

      Log.i("Debug", "onOSPermissionChanged: " + stateChanges);
  }
}

答案 1 :(得分:0)

现在不推荐使用您使用的方法。

请改用getPermissionSubscriptionStateaddPermissionObserveradd SubscriptionObserver

这是一个示例-

OSPermissionSubscriptionState status = OneSignal.getPermissionSubscriptionState();
        boolean isEnabled = status.getPermissionStatus().getEnabled();
        boolean isSubscribed = status.getSubscriptionStatus().getSubscribed();
        boolean subscriptionSetting = status.getSubscriptionStatus().getUserSubscriptionSetting();

        String userID = status.getSubscriptionStatus().getUserId();

有关更多参考,请选中this

这是Github上的issue

答案 2 :(得分:0)

onOSSubscriptionChanged 的问题在于,仅在OneSignal订阅的状态更改(启用/禁用)时才被调用-顾名思义-。

因此,获取userId / playerId的更好方法是从getSubscriptionStatus的JSONObject获取它。

 private String getOneSignalUserID() {
    JSONObject subscriptionStatusJsonObject = OneSignal.getPermissionSubscriptionState().getSubscriptionStatus().toJSONObject();
    String userId = "";
    try {
        userId = subscriptionStatusJsonObject.getString("userId");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return userId;
}