Search code examples
iosapple-push-notificationspushkit

Pushkit token not getting in some devices iOS


I have implemented PushKit. I've followed these steps:

1.) https://stackoverflow.com/a/38184769/4970453

2.) https://stackoverflow.com/a/28562124

I am able to get didUpdatePushCredentials device token. working in --> iPhone 5s , iPhone6 Plus

didUpdatePushCredentials Not working in --> iPhone6 and iPhone7

I am using same cerificates and Build for all devices. Don't know the exact issue. If anyone have faced this kind of problem, please share work-arounds.

My code and Certificate Link

code -> https://www.dropbox.com/sh/x2615t7xn8mavs3/AADbX5nBuF5_08YNPX8wI59ga?dl=0

cer -> https://www.dropbox.com/sh/70l4htj1c46emog/AABxBalaoN1JP22dQp8-mNXGa?dl=0

 Solution -----> I have changed Bundle identifier And create New certificate with New BundleId.

Solution

  • It should work in all devices when integrated properly. there is nothing changed for any device specific.

    You can cross verify your steps.

    Swift

    import UIKit
    import PushKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate {
    
        var window: UIWindow?
    
        var isUserHasLoggedInWithApp: Bool = true
        var checkForIncomingCall: Bool = true
        var userIsHolding: Bool = true
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
    
            if #available(iOS 8.0, *){
    
    
                let viewAccept = UIMutableUserNotificationAction()
                viewAccept.identifier = "VIEW_ACCEPT"
                viewAccept.title = "Accept"
                viewAccept.activationMode = .Foreground
                viewAccept.destructive = false
                viewAccept.authenticationRequired =  false
    
                let viewDecline = UIMutableUserNotificationAction()
                viewDecline.identifier = "VIEW_DECLINE"
                viewDecline.title = "Decline"
                viewDecline.activationMode = .Background
                viewDecline.destructive = true
                viewDecline.authenticationRequired = false
    
                let INCOMINGCALL_CATEGORY = UIMutableUserNotificationCategory()
                INCOMINGCALL_CATEGORY.identifier = "INCOMINGCALL_CATEGORY"
                INCOMINGCALL_CATEGORY.setActions([viewAccept,viewDecline], forContext: .Default)
    
                if application.respondsToSelector("isRegisteredForRemoteNotifications")
                {
                    let categories = NSSet(array: [INCOMINGCALL_CATEGORY])
                    let types:UIUserNotificationType = ([.Alert, .Sound, .Badge])
    
                    let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: categories as? Set<UIUserNotificationCategory>)
    
                    application.registerUserNotificationSettings(settings)
                    application.registerForRemoteNotifications()
                }
    
            }
            else{
                let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
                application.registerForRemoteNotificationTypes(types)
            }
    
    
            self.PushKitRegistration()
    
        return true
        }
        //MARK: - PushKitRegistration
    
        func PushKitRegistration()
        {
    
            let mainQueue = dispatch_get_main_queue()
            // Create a push registry object
            if #available(iOS 8.0, *) {
    
            let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)
    
            // Set the registry's delegate to self
    
            voipRegistry.delegate = self
    
            // Set the push type to VoIP
    
            voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
    
            } else {
            // Fallback on earlier versions
            }
    
    
        }
    
    
        @available(iOS 8.0, *)
        func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
            // Register VoIP push token (a property of PKPushCredentials) with server
    
            let hexString : String = UnsafeBufferPointer<UInt8>(start: UnsafePointer(credentials.token.bytes),
            count: credentials.token.length).map { String(format: "%02x", $0) }.joinWithSeparator("")
    
            print(hexString)
    
    
        }
    
    
        @available(iOS 8.0, *)
        func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) {
    
            // Process the received push
    
            // Below process is specific to schedule local notification once pushkit payload received
    
            var arrTemp = [NSObject : AnyObject]()
            arrTemp = payload.dictionaryPayload
    
            let dict : Dictionary <String, AnyObject> = arrTemp["aps"] as! Dictionary<String, AnyObject>
    
    
            if isUserHasLoggedInWithApp // Check this flag then only proceed
            {
    
                if UIApplication.sharedApplication().applicationState == UIApplicationState.Background || UIApplication.sharedApplication().applicationState == UIApplicationState.Inactive
                {
    
                    if checkForIncomingCall // Check this flag to know incoming call or something else
                    {
    
                        var strTitle : String = dict["alertTitle"] as? String ?? ""
                        let strBody : String = dict["alertBody"] as? String ?? ""
                        strTitle = strTitle + "\n" + strBody
    
                        let notificationIncomingCall = UILocalNotification()
    
                        notificationIncomingCall.fireDate = NSDate(timeIntervalSinceNow: 1)
                        notificationIncomingCall.alertBody =  strTitle
                        notificationIncomingCall.alertAction = "Open"
                        notificationIncomingCall.soundName = "SoundFile.mp3"
                        notificationIncomingCall.category = dict["category"] as? String ?? ""
    
                        //"As per payload you receive"
                        notificationIncomingCall.userInfo = ["key1": "Value1"  ,"key2": "Value2" ]
    
    
                        UIApplication.sharedApplication().scheduleLocalNotification(notificationIncomingCall)
    
                    }
                    else
                    {
                        //  something else
                    }
    
                }
            }
    
    
        }
    
        //MARK: - Local Notification Methods
    
        func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification){
    
            // Your interactive local notification events will be called at this place
    
        }
    
    
    }
    

    Objective C

    #import <UIKit/UIKit.h>
    #import <PushKit/PushKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate,PKPushRegistryDelegate>
    {
        PKPushRegistry *pushRegistry;
    }
    
    @property (strong, nonatomic) UIWindow *window;
    
    @end
    

    #import "AppDelegate.h"
    
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
        pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
        pushRegistry.delegate = self;
        pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
    
        return YES;
    }
    
    #define PushKit Delegate Methods
    
    - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
        if([credentials.token length] == 0) {
            NSLog(@"voip token NULL");
            return;
        }
    
        NSLog(@"PushCredentials: %@", credentials.token);
    }
    
    - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type
    {
        NSLog(@"didReceiveIncomingPushWithPayload");
    }
    

    https://github.com/hasyapanchasara/PushKit_SilentPushNotification

    Updated answer

    https://drive.google.com/file/d/0B7ooURy3zGWKYW5PZE1aN2pObW8/view?usp=sharing

    Updated answer

    Below are some trouble shooting option.

    (1) Change com identifier and try again

    (2) Keep puhkit code in app delegeate

    I guess, you can change your bundle identifier and try again, it has to be work with all devices.