用 Ionic 存储 OneSignal ID
Storing OneSignal IDs with Ionic
我正在尝试找出 "correct" 使用 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,以便用户可以触发对其他用户的通知。我现在可以这样做,但前提是我在用户接受提示时这样做。我需要能够在他们选择推送通知的任何时候执行此操作,即使是在拒绝原始提示后从设置中进行。
因此,在使用回调方法调用函数期间,您遇到了非常常见的陷阱处理 'this'。
通常,如果您看到那些 "undefined" 类型的错误,您想要 console.log 'this' (console.log(this)) 查看 'this' 指向哪个范围,然后决定修复。
在你的例子中,我会为 handleSubscriptionChange 方法使用粗箭头函数赋值:
- 改为:handleSubscriptionChange(data:any) => {...}
- 执行:handleSubscriptionChange = (data:any) => {...}
粗箭头函数不会创建自己的 'this',在这种情况下应该可以解决您的问题。
我正在尝试找出 "correct" 使用 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,以便用户可以触发对其他用户的通知。我现在可以这样做,但前提是我在用户接受提示时这样做。我需要能够在他们选择推送通知的任何时候执行此操作,即使是在拒绝原始提示后从设置中进行。
因此,在使用回调方法调用函数期间,您遇到了非常常见的陷阱处理 'this'。 通常,如果您看到那些 "undefined" 类型的错误,您想要 console.log 'this' (console.log(this)) 查看 'this' 指向哪个范围,然后决定修复。
在你的例子中,我会为 handleSubscriptionChange 方法使用粗箭头函数赋值:
- 改为:handleSubscriptionChange(data:any) => {...}
- 执行:handleSubscriptionChange = (data:any) => {...}
粗箭头函数不会创建自己的 'this',在这种情况下应该可以解决您的问题。