有时一个信号 returns UserId 为 null

sometimes One signal returns UserId as null

在我的应用程序中,我通过一个 signal.but 有时一个信号 returns 空用户 ID 向用户发送通知...那时我面临向 [=20= 发送通知的问题] 我能解决吗。如果有人有解决办法,请与我分享

这是我生成用户 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();

您使用的方法现已弃用。

改用 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

当用户接受推送通知权限时,他们不会立即拥有用户 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().isSubscribed() &&
        stateChanges.getTo().isSubscribed()) {
         new AlertDialog.Builder(this)
             .setMessage("You've successfully subscribed to push notifications!")
             .show();
        // get player ID
        stateChanges.getTo().getUserId();
      }
   
      Log.i("Debug", "onOSPermissionChanged: " + stateChanges);
  }
}

From Onesignal library 4+ version there is a small tweak to this method.

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", "onOSSubscriptionChanged: " + stateChanges);
  }
}

/*
Example Logcat entry - User disabling notifications then returning to your app.
onOSSubscriptionChanged:
{"from":{"pushToken":"APA91bG9cmZ262s5gJhr8jvbg1q7aiviEC6lcOCgAQliEzHKO3eOdX5cm7IQqMSWfy8Od7Ol3jSjFfvCfeO2UYUpanJCURJ8RdhgEuV8grYxOCwPNJr5GoqcWTQOaL9u-qE2PQcFlv4K","userSubscriptionSetting":true,"subscribed":false},
 "to":  {"userId":"22712a53-9b5c-4eab-a828-f18f81167fef","pushToken":"APA91bG9cmZ262s5gJhr8jvbg1q7aiviEC6lcOCgAQliEzHKO3eOdX5cm7IQqMSWfy8Od7Ol3jSjFfvCfeO2UYUpanJCURJ8RdhgEuV8grYxOCwPNJr5GoqcWTQOaL9u-qE2PQcFlv4K","userSubscriptionSetting":true,"subscribed":true}}

onOSSubscriptionChanged 的问题在于,只有当 OneSignal 订阅的状态发生变化时才会调用它(Enabled/Disabled)- 正如名称所说 -.

因此,获取 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;
}