Ionic OneSignal 推送通知在启动时崩溃 IOS 14+ 设备
Ionic OneSignal Push notifications crashing IOS 14+ devices on boot
我在 IOS 上声称在 OneSignalPush.m 的第 194 行的应用程序一直存在问题。我正在创建具有推送通知功能的 Ionic 4 应用程序。这似乎在较旧的 IOS 设备上完美运行,但较新的设备 (IOS 14+) 似乎会崩溃。
崩溃回溯中的最后 10 项是:
Last Exception Backtrace:
0 CoreFoundation 0x1af14a5ac __exceptionPreprocess + 220 (NSException.m:199)
1 libobjc.A.dylib 0x1c323842c objc_exception_throw + 60 (objc-exception.mm:565)
2 CoreFoundation 0x1af054a2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 144 (NSObject.m:146)
3 CoreFoundation 0x1af14d130 ___forwarding___ + 1444 (NSForwarding.m:3597)
4 CoreFoundation 0x1af14f420 _CF_forwarding_prep_0 + 96
5 School Bozza 0x1042d7620 -[OneSignalPush init:] + 676 (OneSignalPush.m:194)
6 School Bozza 0x10432c68c 0x1042bc000 + 460428
7 School Bozza 0x1042c7a90 -[CDVWKWebViewEngine handleCordovaMessage:] + 180 (CDVWKWebViewEngine.m:616)
8 School Bozza 0x1042c794c -[CDVWKWebViewEngine userContentController:didReceiveScriptMessage:] + 124 (CDVWKWebViewEngine.m:602)
9 School Bozza 0x1042c8c14 -[CDVWKWeakScriptMessageHandler userContentController:didReceiveScriptMessage:] + 100 (CDVWKWebViewEngine.m:822)
10 WebKit 0x1bb3bd4c4 ScriptMessageHandlerDelegate::didPostMessage(WebKit::WebPageProxy&, WebKit::FrameInfoData&&, API::ContentWorld&, WebCore::SerializedScriptValue&) + 232 (WKUserContentController.mm:148)
第 5 行给出了我认为的罪魁祸首。
我已经尝试过的事情:
- Podfile 的旧版本
- 删除并重新添加 ios 平台
- 删除和添加 cordova 插件
- 不同版本的cordova插件
- 添加一个 'setTimeout' 以稍微延迟初始化
似乎没有任何效果。我正在平台内的 app.component.ts 中初始化。像这样的准备功能:
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
setTimeout(() => {
this.oneSignalInit();
this.uId.get().then((uuid: any) => {});
}, 1000);
});
}
然后我是 运行 这样的 init:
oneSignalInit() {
try {
// set onesignal id
const oldId = localStorage.getItem('onesignal_id');
if (oldId && oldId.length > 0) {
console.log('We have already registered with one signal');
} else {
if (this.platform.is('ios')) {
this.oneSignal.addTrigger("prompt_ios", "true");
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, '');
} else {
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, environment.FIREBASE_SENDERID);
}
// notification configuration
this.oneSignal.inFocusDisplaying(this.oneSignal.OSInFocusDisplayOption.Notification);
this.oneSignal.setSubscription(true);
this.oneSignal.enableVibrate(true);
this.oneSignal.enableSound(true);
try {
// get unique id from onesignal and register with device
this.oneSignal.getIds().then((usersIds: any) => {
console.log('Registered with onesignal');
localStorage.setItem('onesignal_id', usersIds.userId);
}).catch((err: any) => {
console.log(err, 'one');
});
} catch (e) {
console.log(e);
}
}
this.oneSignal.endInit();
} catch (e) {
console.log(e, 'try');
this.oneSignal.endInit();
}
}
如果有人能提供帮助,那就太好了,我什至无法想象问题是什么,其他人似乎没有遇到同样的问题,所以我所做的一定是愚蠢的事情。
好的,所以我发现了问题,所以在我的应用程序初始化中我使用了:
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, ' ');
但问题实际上是一个空字符串,这意味着应用程序没有成功导入变量:“environment.ONESIGNAL_APP_ID”。
我通过在实际的“OneSignalPush.m”文件中简单地硬编码应用程序 ID 来解决这个问题...这不是一个好习惯,但它可以防止应用程序崩溃。
我在 IOS 上声称在 OneSignalPush.m 的第 194 行的应用程序一直存在问题。我正在创建具有推送通知功能的 Ionic 4 应用程序。这似乎在较旧的 IOS 设备上完美运行,但较新的设备 (IOS 14+) 似乎会崩溃。
崩溃回溯中的最后 10 项是:
Last Exception Backtrace:
0 CoreFoundation 0x1af14a5ac __exceptionPreprocess + 220 (NSException.m:199)
1 libobjc.A.dylib 0x1c323842c objc_exception_throw + 60 (objc-exception.mm:565)
2 CoreFoundation 0x1af054a2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 144 (NSObject.m:146)
3 CoreFoundation 0x1af14d130 ___forwarding___ + 1444 (NSForwarding.m:3597)
4 CoreFoundation 0x1af14f420 _CF_forwarding_prep_0 + 96
5 School Bozza 0x1042d7620 -[OneSignalPush init:] + 676 (OneSignalPush.m:194)
6 School Bozza 0x10432c68c 0x1042bc000 + 460428
7 School Bozza 0x1042c7a90 -[CDVWKWebViewEngine handleCordovaMessage:] + 180 (CDVWKWebViewEngine.m:616)
8 School Bozza 0x1042c794c -[CDVWKWebViewEngine userContentController:didReceiveScriptMessage:] + 124 (CDVWKWebViewEngine.m:602)
9 School Bozza 0x1042c8c14 -[CDVWKWeakScriptMessageHandler userContentController:didReceiveScriptMessage:] + 100 (CDVWKWebViewEngine.m:822)
10 WebKit 0x1bb3bd4c4 ScriptMessageHandlerDelegate::didPostMessage(WebKit::WebPageProxy&, WebKit::FrameInfoData&&, API::ContentWorld&, WebCore::SerializedScriptValue&) + 232 (WKUserContentController.mm:148)
第 5 行给出了我认为的罪魁祸首。
我已经尝试过的事情:
- Podfile 的旧版本
- 删除并重新添加 ios 平台
- 删除和添加 cordova 插件
- 不同版本的cordova插件
- 添加一个 'setTimeout' 以稍微延迟初始化
似乎没有任何效果。我正在平台内的 app.component.ts 中初始化。像这样的准备功能:
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
setTimeout(() => {
this.oneSignalInit();
this.uId.get().then((uuid: any) => {});
}, 1000);
});
}
然后我是 运行 这样的 init:
oneSignalInit() {
try {
// set onesignal id
const oldId = localStorage.getItem('onesignal_id');
if (oldId && oldId.length > 0) {
console.log('We have already registered with one signal');
} else {
if (this.platform.is('ios')) {
this.oneSignal.addTrigger("prompt_ios", "true");
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, '');
} else {
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, environment.FIREBASE_SENDERID);
}
// notification configuration
this.oneSignal.inFocusDisplaying(this.oneSignal.OSInFocusDisplayOption.Notification);
this.oneSignal.setSubscription(true);
this.oneSignal.enableVibrate(true);
this.oneSignal.enableSound(true);
try {
// get unique id from onesignal and register with device
this.oneSignal.getIds().then((usersIds: any) => {
console.log('Registered with onesignal');
localStorage.setItem('onesignal_id', usersIds.userId);
}).catch((err: any) => {
console.log(err, 'one');
});
} catch (e) {
console.log(e);
}
}
this.oneSignal.endInit();
} catch (e) {
console.log(e, 'try');
this.oneSignal.endInit();
}
}
如果有人能提供帮助,那就太好了,我什至无法想象问题是什么,其他人似乎没有遇到同样的问题,所以我所做的一定是愚蠢的事情。
好的,所以我发现了问题,所以在我的应用程序初始化中我使用了:
this.oneSignal.startInit(environment.ONESIGNAL_APP_ID, ' ');
但问题实际上是一个空字符串,这意味着应用程序没有成功导入变量:“environment.ONESIGNAL_APP_ID”。
我通过在实际的“OneSignalPush.m”文件中简单地硬编码应用程序 ID 来解决这个问题...这不是一个好习惯,但它可以防止应用程序崩溃。