tidev / titanium-sdk

🚀 Native iOS and Android Apps with JavaScript
https://titaniumsdk.com/
Other
2.76k stars 1.21k forks source link

fix(ios): fix duplicate application delegate allocation #14028

Closed hansemannn closed 6 months ago

hansemannn commented 6 months ago

While debugging the open scene-related bug that push registration did not fire the events properly, I noticed that during the scene integration, the main app router TiApp was instantiated twice, leading to an unpredicated behavior in the call tree.

I fixed the issue by moving out all scene-related delegates into an own class that is only called by the initial scene configuration that calls the related TiApp code via it's Scenes ObjC extension.

I would like to prompt anyone reading this PR to test it properly, as it's (again) a pretty large change to polish the scene integration.

Open Todos:

For the push-related testing, the following snippet will help:

const win = Ti.UI.createWindow({ backgroundColor: 'yellow' });

win.addEventListener('open', registerForPush);
win.open();

function registerForPush() {
    Ti.App.iOS.addEventListener('usernotificationsettings', function eventUserNotificationSettings() {
        Ti.App.iOS.removeEventListener('usernotificationsettings', eventUserNotificationSettings);

        Ti.Network.registerForPushNotifications({
            success: () => {
                console.warn('Successfully registered for push notifications!');
            },
            error: event => {
                console.error('Cannot register for push notifications!', event);
            },
            callback: event => {
                console.warn('Push arrived!');
                console.warn(event.data);
            }
        });
    });

    Ti.App.iOS.registerUserNotificationSettings({
        types: [
            Ti.App.iOS.USER_NOTIFICATION_TYPE_ALERT,
            Ti.App.iOS.USER_NOTIFICATION_TYPE_SOUND,
            Ti.App.iOS.USER_NOTIFICATION_TYPE_BADGE
        ]
    });
}