有时,One signal会将UserId返回为空。

5

在我的应用程序中,我通过One Signal向用户发送通知。但有时One Signal会返回空的用户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:

OneSignal.startInit(this)
                .inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
                .unsubscribeWhenNotificationsAreDisabled(true)
                .init();
3个回答

8
当用户接受推送通知权限时,他们不会立即拥有用户ID。当用户接受推送通知权限时,SDK会向OneSignal的服务器发送HTTP请求进行注册。一旦该请求完成,用户订阅状态将更新为具有用户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);
  }
}

自Onesignal库4+版本以来,此方法有一个小调整。
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}}

2

您现在使用的方法已被弃用。

请改用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();

更多参考,请查看这里

这是Github上的问题

最初的回答

1
当我卸载并重新安装应用程序时,UserId为空,如果第二次卸载并安装,则会生成密钥,如何解决它。 - kavitha nidamanuri
1
现在一切都运行良好。我将这些代码放在登录页面里。谢谢。 - kavitha nidamanuri
@kavithanidamanuri 你说的将这些行放在登录里是什么意思?你能帮忙吗? - Tony Lip
你得到答案了吗?抱歉回复晚了@MitabShrestha - kavitha nidamanuri
1
是的,我得到了答案。谢谢。 - Tony Lip

1
问题在于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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接