Search code examples
swiftcocoapodsonesignal

Swift OneSignal OSPermissionSubscriptionState setSubscription


I had updated my cocoapods and am getting errors with OneSignal.

ERROR'S

Type 'OneSignal' has no member 'setSubscription'

OneSignal.setSubscription(true)

Cannot find type 'OSPermissionSubscriptionState' in scope

let status: OSPermissionSubscriptionState = OneSignal.getPermissionSubscriptionState()

This code has compiled before running updates.

I am also getting "Type 'OneSignal' has no member 'setSubscription'

old

OneSignal.setSubscription(true)

new

OneSignal.disablePush(false)

old

func onOSSubscriptionChanged(_ stateChanges: OSSubscriptionStateChanges!) {
        if !stateChanges.from.status && stateChanges.to.subscribed {
            print("Subscribed for OneSignal push notifications!")
            // get player ID
            stateChanges.to.userId
            print(userID)
            print("************************")
        }
        print("SubscriptionStateChange: \n\(stateChanges)")
    }

new

func onOSPermissionChanged(_ stateChanges: OSPermissionStateChanges!) {
          // Example of detecting answering the permission prompt
          if stateChanges.from.status == OSNotificationPermission.notDetermined {
             if stateChanges.to.status == OSNotificationPermission.authorized {
                let deviceState = OneSignal.getDeviceState()
                let userID = deviceState?.userId
                print(userID)
                print("************************")
                print("Thanks for accepting notifications!")
             } else if stateChanges.to.status == OSNotificationPermission.denied {
                print("Notifications not accepted. You can turn them on later under your iOS settings.")
             }
          }
          // prints out all properties
          print("PermissionStateChanges: \n\(stateChanges)")
       }

You can also pull a Users OneSignal information like this

 let status: OSPermissionSubscriptionState =        OneSignal.getPermissionSubscriptionState()
  // Push Status Methods
 let hasPrompted = status.permissionStatus.hasPrompted
 print("hasPrompted: ", hasPrompted)
  let userStatus = status.permissionStatus.status
  print("userStatus: ", userStatus)
  let isSubscribed = status.subscriptionStatus.subscribed
  print("isSubscribed: ", isSubscribed)
  let userSubscriptionSetting =                      status.subscriptionStatus.userSubscriptionSetting
  print("userSubscriptionSetting: ", userSubscriptionSetting)
  if let userID = status.subscriptionStatus.userId{
  print("userID: ", userID)
}
   if let pushToken = status.subscriptionStatus.pushToken {
  print("pushToken: ", pushToken)
}
  // Email Status Methods
  if let emailPlayerId = status.emailSubscriptionStatus.emailUserId   {
  print("emailPlayerId: ", emailPlayerId)
}
  if let emailAddress = status.emailSubscriptionStatus.emailAddress   {
  print("emailAddress: ", emailAddress)
} 
 let isEmailSubscribed = status.emailSubscriptionStatus.subscribed
 print("isEmailSubscribed: ", isEmailSubscribed)

OneSignal Wrong Documentation

// START OneSignal initialization code
      let onesignalInitSettings = [kOSSettingsKeyAutoPrompt: false, kOSSettingsKeyInAppLaunchURL: false]
      
      // Replace 'YOUR_ONESIGNAL_APP_ID' with your OneSignal App ID.
      OneSignal.initWithLaunchOptions(launchOptions,
        appId: "KEY",
        handleNotificationAction: nil,
        settings: onesignalInitSettings)

      OneSignal.inFocusDisplayType = OSNotificationDisplayType.notification;
      //END OneSignal initializataion code

Solution

  • May be this will help you to get the new OneSignal use. I just updated my SDK to the 3.1.0, and I had to change some points:

    New initialization: Link1

    import UIKit
    import OneSignal
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
      
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: 
    [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      
      // Remove this method to stop OneSignal Debugging 
      OneSignal.setLogLevel(.LL_VERBOSE, visualLevel: .LL_NONE)
    
      // OneSignal initialization
      OneSignal.initWithLaunchOptions(launchOptions)
      OneSignal.setAppId("YOUR_ONESIGNAL_APP_ID")
    
      // promptForPushNotifications will show the native iOS notification permission prompt.
      // We recommend removing the following code and instead using an In-App Message to prompt for notification permission (See step 8)
      OneSignal.promptForPushNotifications(userResponse: { accepted in
        print("User accepted notifications: \(accepted)")
      })
    
       return true
    }
      
    // Remaining contents of your AppDelegate Class...
    }
    

    And in scope: Link2

    if let deviceState = OneSignal.getDeviceState() {
        let userId = deviceState.userId
        let pushToken = deviceState.pushToken
        let subscribed = deviceState.isSubscribed
     }
    

    EDIT: I think the code you pick up is from this link and just downstair, it says that the new initlialization is that:

    Replace with the following

    // OneSignal initialization
    OneSignal.initWithLaunchOptions(launchOptions)
    OneSignal.setAppId("YOUR_ONESIGNAL_APP_ID")