Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ionic framework 使用Ionic存储OneSignal ID_Ionic Framework_Ionic3_Onesignal - Fatal编程技术网

Ionic framework 使用Ionic存储OneSignal ID

Ionic framework 使用Ionic存储OneSignal ID,ionic-framework,ionic3,onesignal,Ionic Framework,Ionic3,Onesignal,我正试图找到一种“正确”的方法,使用OneSignal SDK和本机插件在Ionic v3应用程序上设置推送通知(目前我只关心iOS)。我的目标是使用插件提供的addSubscriptionObserver钩子设置一个观察者,并在用户选择通知时使用userId更新我的数据库。我相信我遇到的问题与回调运行的范围有关。我试图访问userService(注入到添加subscriptionObserver的组件中),但在回调运行时出现以下错误: 2018-04-22 09:59:53.977213-07

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

2018-04-22 09:59:53.977213-0700 WodaX[2610:692168]成功回调中出错ID:OneSignalPush492317370:TypeError:undefined不是对象(正在评估'this.userService.updateUserNesignalid')

这是我的密码:

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,以便用户能够触发对其他用户的通知。我现在可以这样做,但只有在用户接受提示时才能这样做。我需要能够在他们选择推送通知的任何时候这样做,即使是在拒绝原始提示后,也可以从设置中这样做。

因此,在使用回调方法调用函数的过程中,处理“this”时,您会遇到相当常见的陷阱。 通常情况下,如果您看到那些“未定义”类型的错误,您希望console.log“this”(console.log(this))查看“this”指向哪个范围,然后决定修复

在您的情况下,我将对handleSubscriptionChange方法使用fat arrow函数赋值:

  • 而是:handleSubscriptionChange(数据:any)=>{…}
  • do:handleSubscriptionChange=(数据:任意)=>{…}

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

尝试将私有handleSubscriptionChange(数据:any){}更改为handleSubscriptionChange=(数据:any)=>{}当调用此方法时,很可能存在“scope”问题。您的“this”不是组件作用域。尝试执行console.log(这个)来检查我是否感到尴尬,我没有想到要将它作为一个箭头函数来尝试…这就成功了。如果你回答这个问题,我会接受的。谢谢