51 lines
2.9 KiB
JavaScript
51 lines
2.9 KiB
JavaScript
|
|
// Inject the APNs registration-forwarding methods into the Capacitor iOS AppDelegate.
|
||
|
|
// Run on Codemagic (macOS) from ios-patch.sh:
|
||
|
|
// node mobile/scripts/inject-push.js mobile/ios/App/App/AppDelegate.swift
|
||
|
|
//
|
||
|
|
// WHY: Capacitor 7's default AppDelegate.swift template does NOT implement
|
||
|
|
// application(_:didRegisterForRemoteNotificationsWithDeviceToken:) / ...didFailToRegister...
|
||
|
|
// so when @capacitor/push-notifications calls registerForRemoteNotifications(), iOS DOES obtain the
|
||
|
|
// APNs token but the AppDelegate never posts .capacitorDidRegisterForRemoteNotifications — so the plugin
|
||
|
|
// never delivers the token to JS. register() "succeeds", yet NEITHER the `registration` nor the
|
||
|
|
// `registrationError` event ever fires (proven via server-side push telemetry: register-called logged,
|
||
|
|
// no token, no error). These two methods forward the token / error to Capacitor. The plugin listens for
|
||
|
|
// the notifications defined in @capacitor/ios CAPNotifications.swift; `import Capacitor` (already in the
|
||
|
|
// AppDelegate) exposes the Notification.Name values.
|
||
|
|
//
|
||
|
|
// TOLERANT: exits 0 and no-ops if anything is off, so it can NEVER fail the build. Idempotent (keyed on
|
||
|
|
// the bzcPushForward marker), so re-runs never duplicate the methods.
|
||
|
|
const fs = require('fs');
|
||
|
|
const p = process.argv[2];
|
||
|
|
if (!p || !fs.existsSync(p)) { console.log(' (AppDelegate.swift not found — push forwarding patch skipped)'); process.exit(0); }
|
||
|
|
try {
|
||
|
|
let s = fs.readFileSync(p, 'utf8');
|
||
|
|
if (s.includes('bzcPushForward') || s.includes('capacitorDidRegisterForRemoteNotifications')) {
|
||
|
|
console.log(' push forwarding already patched'); process.exit(0);
|
||
|
|
}
|
||
|
|
const methods = [
|
||
|
|
'',
|
||
|
|
' // bzcPushForward: forward APNs device-token registration to Capacitor. The Capacitor 7 AppDelegate',
|
||
|
|
' // template omits these, so @capacitor/push-notifications never receives the token without them.',
|
||
|
|
' func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {',
|
||
|
|
' NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)',
|
||
|
|
' }',
|
||
|
|
'',
|
||
|
|
' func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {',
|
||
|
|
' NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)',
|
||
|
|
' }',
|
||
|
|
'',
|
||
|
|
].join('\n');
|
||
|
|
// Insert the methods just before the final closing brace of the file (which closes the AppDelegate class).
|
||
|
|
const orig = s;
|
||
|
|
s = s.replace(/\}\s*$/, methods + '}\n');
|
||
|
|
if (s !== orig && s.includes('bzcPushForward')) {
|
||
|
|
fs.writeFileSync(p, s);
|
||
|
|
console.log(' APNs registration forwarding methods injected into AppDelegate');
|
||
|
|
} else {
|
||
|
|
console.log(' (AppDelegate closing brace not matched — push forwarding patch skipped)');
|
||
|
|
}
|
||
|
|
} catch (e) {
|
||
|
|
console.log(' (push forwarding patch error, skipped: ' + (e && e.message) + ')');
|
||
|
|
}
|
||
|
|
process.exit(0);
|