Access Capacitor bridge from iOS App Delegate

@max thank you so much! This is how it worked! I’m so happy! I couldn’t use the window event but instead added a getStatus() to call from my javascript code.

Here is the full plugin:

import Capacitor

extension Notification.Name {
    static let onOneSignalOptin = Notification.Name("onOneSignalOptin")
}

@objc(OneSignalPlugin)

public class OneSignalPlugin: CAPPlugin {
    var notificationsEnabled: Bool = false
    var oneSignalId: String = "undefined"
    
    /**
     * Add event listener for NotificationCenter
     *
     * @see AppDelegate.swift
     */
    public override func load() {
        print("Init OneSignalPlugin")
        NotificationCenter.default.addObserver(self, selector: #selector(optin(_:)), name: .onOneSignalOptin, object: nil)
    }
    
    /**
     * Executes on "onOneSignalOptin" event.
     * Set oneSignalId so you can call getStatus() in your javascript code.
     *
     * e.g.: await window.Capacitor.Plugins.OneSignalPlugin.getStatus()
     */
    @objc func optin(_ notification:Notification) {
        print("OneSignalPlugin: optin")
        
        let oneSignalId = notification.userInfo?["oneSignalId"] ?? "undefined"
        let notificationsEnabled = notification.userInfo?["notificationsEnabled"] ?? false
        
        self.oneSignalId = oneSignalId as! String
        self.notificationsEnabled = notificationsEnabled as! Bool
    }
    
    @objc func getStatus(_ call: CAPPluginCall) {
        call.resolve([
            "notificationsEnabled": self.notificationsEnabled,
            "oneSignalId": self.oneSignalId
        ])
    }
}

and in AppDelegate:

...

OneSignal.promptForPushNotifications(userResponse: { accepted in
    print("User accepted notifications: \(accepted)")
    
    let oneSignalId = OneSignal.getPermissionSubscriptionState()?.subscriptionStatus.userId ?? "undefined"
    
    NotificationCenter.default.post(name: .onOneSignalOptin, object: nil, userInfo: [
        "notificationsEnabled": accepted,
        "oneSignalId": oneSignalId
    ])
  })
  
...

Also thanks to @pitahausen. Unfortunately I’m not using ionic framework, so I don’t have any .ts file. Otherwise I’m sure your solution would have worked.

Best regards
Nick

2 Likes