【问题标题】:Storing OneSignal IDs with Ionic使用 Ionic 存储 OneSignal ID
【发布时间】:2018-04-23 16:30:10
【问题描述】:

我正在尝试找出使用 OneSignal SDK 和本机插件在 Ionic v3 应用程序上设置推送通知的“正确”方法(目前我只关心 iOS)。我的目标是使用插件提供的 addSubscriptionObserver 挂钩设置观察者,并在用户选择接收通知时使用 userId 更新我的数据库。我相信我遇到的问题与回调运行的范围有关。我正在尝试访问 userService(注入到添加了 subscriptionObserver 的组件中),但是当回调运行时出现以下错误:

2018-04-22 09:59:53.977213-0700 WodaX[2610:692168] Error in Success callbackId: OneSignalPush492317370 : TypeError: undefined is not an object (evaluating 'this.userService.updateUserOneSignalId')

这是我的代码:

initializeApp() {
    this.platform.ready().then(() => {
        this.statusBar.styleDefault();
        this.statusBar.overlaysWebView(false);
        this.keyboard.disableScroll(false);
        this.splashScreen.hide();
        // OneSignal Code start:
        // Enable to debug issues:
        //window["plugins"].OneSignal.setLogLevel({logLevel: 4, visualLevel: 4});

        let notificationOpenedCallback = function(jsonData) {
            console.log('notificationOpenedCallback: ' + JSON.stringify(jsonData));
        };

        let iosSettings = {};
        iosSettings["kOSSettingsKeyAutoPrompt"] = false;
        window["plugins"].OneSignal
            .startInit("[MY_ONE_SIGNAL_APP_ID]")
            .handleNotificationOpened(notificationOpenedCallback)
            .inFocusDisplaying(window["plugins"].OneSignal.OSInFocusDisplayOption.Notification)
            .iOSSettings(iosSettings)
            .endInit();
        window["plugins"].OneSignal.addPermissionObserver(this.handlePermissionChange);
        window["plugins"].OneSignal.addSubscriptionObserver(this.handleSubscriptionChange);
    });
}

openPage(page) {
    this.nav.setRoot(page.component);
}

private handleSubscriptionChange(data: any) {
  console.log(data)
    if (data.to.userSubscriptionSetting && data.to.userId) {
    let userUuid = "testId"
        this.userService.updateUserOneSignalId(userUuid, data.to.userId).subscribe((res) => {
    console.log(res);
        }, (err) => {
    console.log(err);
        });
    }
}

对 userService 方法的相同调用在不同组件的 getIds 回调中起作用,所以我猜这与 addSubscriptionObserver 方法如何注册回调有关。

这里是操作插件代码:

OneSignal.prototype.addSubscriptionObserver = function(callback) {
  OneSignal._subscriptionObserverList.push(callback);
  var subscriptionCallBackProcessor = function(state) {
    OneSignal._processFunctionList(OneSignal._subscriptionObserverList, state);
  };
  cordova.exec(subscriptionCallBackProcessor, function(){}, "OneSignalPush", "addSubscriptionObserver", []);
}

感谢任何可能成功设置此功能的人提供的见解。目标是能够存储单独的 OneSignal Id,以便用户可以向其他用户触发通知。我现在可以这样做,但前提是我在用户接受提示时才这样做。我需要能够在他们选择推送通知的任何时候执行此操作,即使是在拒绝原始提示后的设置中也是如此。

【问题讨论】:

  • 尝试将私有 handleSubscriptionChange(data:any) {} 更改为 handleSubscriptionChange = (data:any) => { }
  • 当此方法被称为您的“this”不是您的组件范围时,您最有可能遇到“范围”问题。尝试执行 console.log(this) 来检查
  • 我很尴尬,我没想过将它作为箭头函数来尝试......这成功了。如果您将此作为答案,我会接受。谢谢!

标签: ionic-framework ionic3 onesignal


【解决方案1】:

因此,在使用回调方法调用函数期间,您遇到了处理“this”的常见陷阱。 通常,如果您看到那些“未定义”类型的错误,您希望 console.log 'this' (console.log(this)) 以查看 'this' 指向的范围,然后决定修复。

在你的情况下,我会为 handleSubscriptionChange 方法使用胖箭头函数分配:

  • 改为:handleSubscriptionChange(data:any) => {...}
  • 做:handleSubscriptionChange = (data:any) => {...}

胖箭头函数不会创建自己的“this”,在这种情况下应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    相关资源
    最近更新 更多