├── PushDemo ├── PushDemo.xcodeproj │ ├── xcuserdata │ │ └── bv.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── PushDemo.xcscheme │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── bv.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── project.pbxproj └── PushDemo │ ├── ViewController.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard │ └── AppDelegate.swift ├── Objective C Demo └── PushKitDemoObjectiveC │ ├── PushKitDemoObjectiveC.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ └── bv.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcuserdata │ │ └── bv.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── PushKitDemoObjectiveC.xcscheme │ └── project.pbxproj │ └── PushKitDemoObjectiveC │ ├── ViewController.h │ ├── main.m │ ├── AppDelegate.h │ ├── ViewController.m │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard │ └── AppDelegate.m ├── LICENSE └── README.md /PushDemo/PushDemo.xcodeproj/xcuserdata/bv.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /PushDemo/PushDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PushDemo/PushDemo.xcodeproj/project.xcworkspace/xcuserdata/bv.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hasyapanchasara/PushKit_SilentPushNotification/HEAD/PushDemo/PushDemo.xcodeproj/project.xcworkspace/xcuserdata/bv.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/project.xcworkspace/xcuserdata/bv.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hasyapanchasara/PushKit_SilentPushNotification/HEAD/Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/project.xcworkspace/xcuserdata/bv.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // PushKitDemoObjectiveC 4 | // 5 | // Created by Hasya.Panchasara on 23/01/17. 6 | // Copyright © 2017 Hasya. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PushKitDemoObjectiveC 4 | // 5 | // Created by Hasya.Panchasara on 23/01/17. 6 | // Copyright © 2017 Hasya. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // PushKitDemoObjectiveC 4 | // 5 | // Created by Hasya.Panchasara on 23/01/17. 6 | // Copyright © 2017 Hasya. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | { 14 | PKPushRegistry *pushRegistry; 15 | } 16 | 17 | @property (strong, nonatomic) UIWindow *window; 18 | 19 | @end 20 | 21 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // PushDemo 4 | // 5 | // Created by Hasya.Panchasra on 01/07/16. 6 | // Copyright © 2016 bv. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController{ 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | } 17 | 18 | 19 | 20 | override func didReceiveMemoryWarning() { 21 | super.didReceiveMemoryWarning() 22 | // Dispose of any resources that can be recreated. 23 | } 24 | 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /PushDemo/PushDemo.xcodeproj/xcuserdata/bv.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PushDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | A34B51E11D26A740000953AD 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // PushKitDemoObjectiveC 4 | // 5 | // Created by Hasya.Panchasara on 23/01/17. 6 | // Copyright © 2017 Hasya. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view, typically from a nib. 20 | } 21 | 22 | - (void)didReceiveMemoryWarning { 23 | [super didReceiveMemoryWarning]; 24 | // Dispose of any resources that can be recreated. 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/xcuserdata/bv.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PushKitDemoObjectiveC.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | A3BAD7F01E35FD7200CD68A9 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Hasya Panchasara 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UIBackgroundModes 26 | 27 | remote-notification 28 | voip 29 | 30 | UILaunchStoryboardName 31 | LaunchScreen 32 | UIMainStoryboardFile 33 | Main 34 | UIRequiredDeviceCapabilities 35 | 36 | armv7 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // PushKitDemoObjectiveC 4 | // 5 | // Created by Hasya.Panchasara on 23/01/17. 6 | // Copyright © 2017 Hasya. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | 20 | 21 | pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; 22 | pushRegistry.delegate = self; 23 | pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; 24 | 25 | return YES; 26 | } 27 | 28 | #define PushKit Delegate Methods 29 | 30 | - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{ 31 | if([credentials.token length] == 0) { 32 | NSLog(@"voip token NULL"); 33 | return; 34 | } 35 | 36 | NSLog(@"PushCredentials: %@", credentials.token); 37 | } 38 | 39 | - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type 40 | { 41 | NSLog(@"didReceiveIncomingPushWithPayload"); 42 | } 43 | 44 | - (void)applicationWillResignActive:(UIApplication *)application { 45 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 46 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 47 | } 48 | 49 | - (void)applicationDidEnterBackground:(UIApplication *)application { 50 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 51 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 52 | } 53 | 54 | - (void)applicationWillEnterForeground:(UIApplication *)application { 55 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 56 | } 57 | 58 | - (void)applicationDidBecomeActive:(UIApplication *)application { 59 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 60 | } 61 | 62 | - (void)applicationWillTerminate:(UIApplication *)application { 63 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 64 | } 65 | 66 | @end 67 | -------------------------------------------------------------------------------- /PushDemo/PushDemo.xcodeproj/xcuserdata/bv.xcuserdatad/xcschemes/PushDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/xcuserdata/bv.xcuserdatad/xcschemes/PushKitDemoObjectiveC.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /PushDemo/PushDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // PushDemo 4 | // 5 | // Created by Hasya.Panchasra on 01/07/16. 6 | // Copyright © 2016 bv. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import PushKit 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | var isUserHasLoggedInWithApp: Bool = true 18 | var checkForIncomingCall: Bool = true 19 | var userIsHolding: Bool = true 20 | 21 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 22 | 23 | 24 | if #available(iOS 8.0, *){ 25 | 26 | 27 | let viewAccept = UIMutableUserNotificationAction() 28 | viewAccept.identifier = "VIEW_ACCEPT" 29 | viewAccept.title = "Accept" 30 | viewAccept.activationMode = .foreground 31 | viewAccept.isDestructive = false 32 | viewAccept.isAuthenticationRequired = false 33 | 34 | let viewDecline = UIMutableUserNotificationAction() 35 | viewDecline.identifier = "VIEW_DECLINE" 36 | viewDecline.title = "Decline" 37 | viewDecline.activationMode = .background 38 | viewDecline.isDestructive = true 39 | viewDecline.isAuthenticationRequired = false 40 | 41 | let INCOMINGCALL_CATEGORY = UIMutableUserNotificationCategory() 42 | INCOMINGCALL_CATEGORY.identifier = "INCOMINGCALL_CATEGORY" 43 | INCOMINGCALL_CATEGORY.setActions([viewAccept,viewDecline], for: .default) 44 | 45 | if application.responds(to: #selector(getter: UIApplication.isRegisteredForRemoteNotifications)) 46 | { 47 | let categories = NSSet(array: [INCOMINGCALL_CATEGORY]) 48 | let types:UIUserNotificationType = ([.alert, .sound, .badge]) 49 | 50 | let settings:UIUserNotificationSettings = UIUserNotificationSettings(types: types, categories: categories as? Set) 51 | 52 | application.registerUserNotificationSettings(settings) 53 | application.registerForRemoteNotifications() 54 | } 55 | 56 | } 57 | else{ 58 | let types: UIRemoteNotificationType = [.alert, .badge, .sound] 59 | application.registerForRemoteNotifications(matching: types) 60 | } 61 | 62 | 63 | self.PushKitRegistration() 64 | 65 | return true 66 | } 67 | 68 | //MARK: - PushKitRegistration 69 | 70 | func PushKitRegistration() 71 | { 72 | 73 | let mainQueue = DispatchQueue.main 74 | // Create a push registry object 75 | if #available(iOS 8.0, *) { 76 | 77 | let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue) 78 | 79 | // Set the registry's delegate to self 80 | 81 | voipRegistry.delegate = self 82 | 83 | // Set the push type to VoIP 84 | 85 | voipRegistry.desiredPushTypes = [PKPushType.voIP] 86 | 87 | } else { 88 | // Fallback on earlier versions 89 | } 90 | 91 | 92 | } 93 | 94 | 95 | @available(iOS 8.0, *) 96 | func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, forType type: PKPushType) { 97 | // Register VoIP push token (a property of PKPushCredentials) with server 98 | 99 | print(credentials.token) 100 | 101 | // Swift 2 format 102 | // let hexString : String = UnsafeBufferPointer(start: UnsafePointer(credentials.token.bytes), 103 | // count: credentials.token.length).map { String(format: "%02x", $0) }.joinWithSeparator("") 104 | 105 | // Swift 4 format 106 | 107 | let token = credentials.token.map { String(format: "%02x", $0) }.joined() 108 | print(token) 109 | 110 | } 111 | 112 | 113 | @available(iOS 8.0, *) 114 | func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) { 115 | 116 | // Process the received push 117 | 118 | // Below process is specific to schedule local notification once pushkit payload received 119 | 120 | var arrTemp = [AnyHashable: Any]() 121 | arrTemp = payload.dictionaryPayload 122 | 123 | let dict : Dictionary = arrTemp["aps"] as! Dictionary 124 | 125 | 126 | if isUserHasLoggedInWithApp // Check this flag then only proceed 127 | { 128 | 129 | if UIApplication.shared.applicationState == UIApplicationState.background || UIApplication.shared.applicationState == UIApplicationState.inactive 130 | { 131 | 132 | if checkForIncomingCall // Check this flag to know incoming call or something else 133 | { 134 | 135 | var strTitle : String = dict["alertTitle"] as? String ?? "" 136 | let strBody : String = dict["alertBody"] as? String ?? "" 137 | strTitle = strTitle + "\n" + strBody 138 | 139 | let notificationIncomingCall = UILocalNotification() 140 | 141 | notificationIncomingCall.fireDate = Date(timeIntervalSinceNow: 1) 142 | notificationIncomingCall.alertBody = strTitle 143 | notificationIncomingCall.alertAction = "Open" 144 | notificationIncomingCall.soundName = "SoundFile.mp3" 145 | notificationIncomingCall.category = dict["category"] as? String ?? "" 146 | 147 | //"As per payload you receive" 148 | notificationIncomingCall.userInfo = ["key1": "Value1" ,"key2": "Value2" ] 149 | 150 | 151 | UIApplication.shared.scheduleLocalNotification(notificationIncomingCall) 152 | 153 | } 154 | else 155 | { 156 | // something else 157 | } 158 | 159 | } 160 | } 161 | 162 | 163 | } 164 | 165 | //MARK: - Local Notification Methods 166 | 167 | func application(_ application: UIApplication, didReceive notification: UILocalNotification){ 168 | 169 | // Your interactive local notification events will be called at this place 170 | 171 | } 172 | 173 | func applicationWillResignActive(_ application: UIApplication) { 174 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 175 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 176 | } 177 | 178 | func applicationDidEnterBackground(_ application: UIApplication) { 179 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 180 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 181 | } 182 | 183 | func applicationWillEnterForeground(_ application: UIApplication) { 184 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 185 | } 186 | 187 | func applicationDidBecomeActive(_ application: UIApplication) { 188 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 189 | } 190 | 191 | func applicationWillTerminate(_ application: UIApplication) { 192 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 193 | } 194 | 195 | 196 | } 197 | 198 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PushKit_SilentPushNotification 2 | 3 | 4 | 5 | 6 | # [ Contact Me! ](https://www.linkedin.com/in/hasyapanchasara/) 7 | 8 | PushKit_SilentPushNotification to receive VOIP call while iOS app is in background or terminated state 9 | 10 | You can also use pushkit silent push notification for other use like updating local database without opening app etc, you have keep your app in special category and take approvals from Apple. 11 | 12 | - Swift language 13 | - Objective C 14 | - Pushkit 15 | - VOIP integration 16 | - Handle VOIP based calls in background or terminate state 17 | - Local notification to schedule once pushkit payload receive 18 | - Integrate Pushkit in iOS App 19 | - Video call integration in iOS App 20 | 21 | 22 | # Pushkit integration 23 | ``` 24 | import UIKit 25 | import PushKit 26 | 27 | @UIApplicationMain 28 | class AppDelegate: UIResponder, UIApplicationDelegate,PKPushRegistryDelegate { 29 | 30 | var window: UIWindow? 31 | 32 | var isUserHasLoggedInWithApp: Bool = true 33 | var checkForIncomingCall: Bool = true 34 | var userIsHolding: Bool = true 35 | 36 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 37 | 38 | 39 | if #available(iOS 8.0, *){ 40 | 41 | 42 | let viewAccept = UIMutableUserNotificationAction() 43 | viewAccept.identifier = "VIEW_ACCEPT" 44 | viewAccept.title = "Accept" 45 | viewAccept.activationMode = .Foreground 46 | viewAccept.destructive = false 47 | viewAccept.authenticationRequired = false 48 | 49 | let viewDecline = UIMutableUserNotificationAction() 50 | viewDecline.identifier = "VIEW_DECLINE" 51 | viewDecline.title = "Decline" 52 | viewDecline.activationMode = .Background 53 | viewDecline.destructive = true 54 | viewDecline.authenticationRequired = false 55 | 56 | let INCOMINGCALL_CATEGORY = UIMutableUserNotificationCategory() 57 | INCOMINGCALL_CATEGORY.identifier = "INCOMINGCALL_CATEGORY" 58 | INCOMINGCALL_CATEGORY.setActions([viewAccept,viewDecline], forContext: .Default) 59 | 60 | if application.respondsToSelector("isRegisteredForRemoteNotifications") 61 | { 62 | let categories = NSSet(array: [INCOMINGCALL_CATEGORY]) 63 | let types:UIUserNotificationType = ([.Alert, .Sound, .Badge]) 64 | 65 | let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: categories as? Set) 66 | 67 | application.registerUserNotificationSettings(settings) 68 | application.registerForRemoteNotifications() 69 | } 70 | 71 | } 72 | else{ 73 | let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound] 74 | application.registerForRemoteNotificationTypes(types) 75 | } 76 | 77 | 78 | self.PushKitRegistration() 79 | 80 | return true 81 | } 82 | //MARK: - PushKitRegistration 83 | 84 | func PushKitRegistration() 85 | { 86 | 87 | let mainQueue = dispatch_get_main_queue() 88 | // Create a push registry object 89 | if #available(iOS 8.0, *) { 90 | 91 | let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue) 92 | 93 | // Set the registry's delegate to self 94 | 95 | voipRegistry.delegate = self 96 | 97 | // Set the push type to VoIP 98 | 99 | voipRegistry.desiredPushTypes = [PKPushTypeVoIP] 100 | 101 | } else { 102 | // Fallback on earlier versions 103 | } 104 | 105 | 106 | } 107 | 108 | 109 | @available(iOS 8.0, *) 110 | func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) { 111 | // Register VoIP push token (a property of PKPushCredentials) with server 112 | 113 | let hexString : String = UnsafeBufferPointer(start: UnsafePointer(credentials.token.bytes), 114 | count: credentials.token.length).map { String(format: "%02x", $0) }.joinWithSeparator("") 115 | 116 | print(hexString) 117 | 118 | 119 | } 120 | 121 | 122 | @available(iOS 8.0, *) 123 | func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) { 124 | 125 | // Process the received push 126 | 127 | // Below process is specific to schedule local notification once pushkit payload received 128 | 129 | var arrTemp = [NSObject : AnyObject]() 130 | arrTemp = payload.dictionaryPayload 131 | 132 | let dict : Dictionary = arrTemp["aps"] as! Dictionary 133 | 134 | 135 | if isUserHasLoggedInWithApp // Check this flag then only proceed 136 | { 137 | 138 | if UIApplication.sharedApplication().applicationState == UIApplicationState.Background || UIApplication.sharedApplication().applicationState == UIApplicationState.Inactive 139 | { 140 | 141 | if checkForIncomingCall // Check this flag to know incoming call or something else 142 | { 143 | 144 | var strTitle : String = dict["alertTitle"] as? String ?? "" 145 | let strBody : String = dict["alertBody"] as? String ?? "" 146 | strTitle = strTitle + "\n" + strBody 147 | 148 | let notificationIncomingCall = UILocalNotification() 149 | 150 | notificationIncomingCall.fireDate = NSDate(timeIntervalSinceNow: 1) 151 | notificationIncomingCall.alertBody = strTitle 152 | notificationIncomingCall.alertAction = "Open" 153 | notificationIncomingCall.soundName = "SoundFile.mp3" 154 | notificationIncomingCall.category = dict["category"] as? String ?? "" 155 | 156 | //"As per payload you receive" 157 | notificationIncomingCall.userInfo = ["key1": "Value1" ,"key2": "Value2" ] 158 | 159 | 160 | UIApplication.sharedApplication().scheduleLocalNotification(notificationIncomingCall) 161 | 162 | } 163 | else 164 | { 165 | // something else 166 | } 167 | 168 | } 169 | } 170 | 171 | 172 | } 173 | 174 | //MARK: - Local Notification Methods 175 | 176 | func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification){ 177 | 178 | // Your interactive local notification events will be called at this place 179 | 180 | } 181 | 182 | 183 | } 184 | 185 | ``` 186 | 187 | # Create certificates from developer account 188 | 189 | ![1](https://cloud.githubusercontent.com/assets/23353196/22063145/4997aeb6-dda3-11e6-9eee-5bab741840d3.png) 190 | 191 | # Before XCode 9 192 | 193 | ![2](https://cloud.githubusercontent.com/assets/23353196/22063152/4d4d79be-dda3-11e6-8081-1985fe326f44.png) 194 | 195 | # With XCode 9+ 196 | 197 | Open "Info.Plist" file as "Source Code" and add below "UIBackgroundModes" modes 198 | 199 | ``` 200 | UIBackgroundModes 201 | 202 | audio 203 | voip 204 | fetch 205 | remote-notification 206 | 207 | 208 | ``` 209 | 210 | 211 | # Use this sendSilenPush.php file 212 | ``` 213 | 1, 249 | 'alert' => $message, 250 | 'sound' => 'default', 251 | 'badge' => 0, 252 | ); 253 | 254 | 255 | 256 | // Encode the payload as JSON 257 | 258 | $payload = json_encode($body); 259 | 260 | // Build the binary notification 261 | $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 262 | 263 | // Send it to the server 264 | $result = fwrite($fp, $msg, strlen($msg)); 265 | 266 | if (!$result) 267 | echo 'Message not delivered' . PHP_EOL; 268 | else 269 | echo 'Message successfully delivered' . PHP_EOL; 270 | 271 | // Close the connection to the server 272 | fclose($fp); 273 | ``` 274 | 275 | # Use below commands to create pem file and use it in above code 276 | 277 | ``` 278 | $ openssl x509 -in aps_development.cer -inform der -out PushCert.pem 279 | 280 | // Convert .p12 to .pem. Enter your pass pharse which is the same pwd that you have given while creating the .p12 certificate. PEM pass phrase also same as .p12 cert. 281 | $ openssl pkcs12 -nocerts -out PushKey1.pem -in pushkey.p12 282 | 283 | Enter Import Password: 284 | 285 | MAC verified OK 286 | 287 | Enter PEM pass phrase: 288 | 289 | Verifying - Enter PEM pass phrase: 290 | 291 | // To remove passpharse for the key to access globally. This only solved my stream_socket_client() & certificate capath warnings. 292 | $ openssl rsa -in PushKey1.pem -out PushKey1_Rmv.pem 293 | 294 | Enter pass phrase for PushChatKey1.pem: 295 | 296 | writing RSA key 297 | 298 | // To join the two .pem file into one file: 299 | $ cat PushCert.pem PushKey1_Rmv.pem > ApnsDev.pem 300 | ``` 301 | 302 | # Debug pushkit notification in terminated state 303 | ``` 304 | - Put debug pointer on delegate methods 305 | - Go to edit scheme 306 | - Select run option then Launch -> Wait for executable to be launched 307 | - Send push kit payload from back end 308 | - Once you get payload on device 309 | - it will automatically invoke and debug pointer will invoke at delegate methods. 310 | ``` 311 | 312 | ![screen shot 2017-03-03 at 3 47 08 pm](https://cloud.githubusercontent.com/assets/23353196/24032539/9015a508-0b0e-11e7-86cf-5cec7ddbeea4.png) 313 | 314 | # Life cycle of app - when app is in terminated and push kit payload comes 315 | 316 | - First of all 317 | ``` 318 | didFinishLaunchingWithOptions // will invoke 319 | ``` 320 | - Then 321 | ``` 322 | didReceiveIncomingPushWithPayload // payload method gets invoke 323 | ``` 324 | - Then if you have local notification 325 | ``` 326 | didReceiveLocalNotification // receive local notification 327 | ``` 328 | - Then 329 | ``` 330 | handleActionWithIdentifier // handler method if you have action buttons ( local ) 331 | ``` 332 | - Then if you have remote notification 333 | ``` 334 | didReceiveRemoteNotification // receive remote notification 335 | ``` 336 | - Then 337 | ``` 338 | handleActionWithIdentifier // handler method if you have action buttons ( remote ) 339 | ``` 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | # [ Contact Me! ](https://www.linkedin.com/in/hasyapanchasara/) 348 | -------------------------------------------------------------------------------- /PushDemo/PushDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A34B51E61D26A740000953AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34B51E51D26A740000953AD /* AppDelegate.swift */; }; 11 | A34B51E81D26A740000953AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34B51E71D26A740000953AD /* ViewController.swift */; }; 12 | A34B51EB1D26A740000953AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A34B51E91D26A740000953AD /* Main.storyboard */; }; 13 | A34B51ED1D26A740000953AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A34B51EC1D26A740000953AD /* Assets.xcassets */; }; 14 | A34B51F01D26A740000953AD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A34B51EE1D26A740000953AD /* LaunchScreen.storyboard */; }; 15 | A34B51F81D26A758000953AD /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A34B51F71D26A758000953AD /* PushKit.framework */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | A34B51E21D26A740000953AD /* PushDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | A34B51E51D26A740000953AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 21 | A34B51E71D26A740000953AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 22 | A34B51EA1D26A740000953AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 23 | A34B51EC1D26A740000953AD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 24 | A34B51EF1D26A740000953AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 25 | A34B51F11D26A740000953AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 26 | A34B51F71D26A758000953AD /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; 27 | /* End PBXFileReference section */ 28 | 29 | /* Begin PBXFrameworksBuildPhase section */ 30 | A34B51DF1D26A740000953AD /* Frameworks */ = { 31 | isa = PBXFrameworksBuildPhase; 32 | buildActionMask = 2147483647; 33 | files = ( 34 | A34B51F81D26A758000953AD /* PushKit.framework in Frameworks */, 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | A34B51D91D26A740000953AD = { 42 | isa = PBXGroup; 43 | children = ( 44 | A34B51F71D26A758000953AD /* PushKit.framework */, 45 | A34B51E41D26A740000953AD /* PushDemo */, 46 | A34B51E31D26A740000953AD /* Products */, 47 | ); 48 | sourceTree = ""; 49 | }; 50 | A34B51E31D26A740000953AD /* Products */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | A34B51E21D26A740000953AD /* PushDemo.app */, 54 | ); 55 | name = Products; 56 | sourceTree = ""; 57 | }; 58 | A34B51E41D26A740000953AD /* PushDemo */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | A34B51E51D26A740000953AD /* AppDelegate.swift */, 62 | A34B51E71D26A740000953AD /* ViewController.swift */, 63 | A34B51E91D26A740000953AD /* Main.storyboard */, 64 | A34B51EC1D26A740000953AD /* Assets.xcassets */, 65 | A34B51EE1D26A740000953AD /* LaunchScreen.storyboard */, 66 | A34B51F11D26A740000953AD /* Info.plist */, 67 | ); 68 | path = PushDemo; 69 | sourceTree = ""; 70 | }; 71 | /* End PBXGroup section */ 72 | 73 | /* Begin PBXNativeTarget section */ 74 | A34B51E11D26A740000953AD /* PushDemo */ = { 75 | isa = PBXNativeTarget; 76 | buildConfigurationList = A34B51F41D26A740000953AD /* Build configuration list for PBXNativeTarget "PushDemo" */; 77 | buildPhases = ( 78 | A34B51DE1D26A740000953AD /* Sources */, 79 | A34B51DF1D26A740000953AD /* Frameworks */, 80 | A34B51E01D26A740000953AD /* Resources */, 81 | ); 82 | buildRules = ( 83 | ); 84 | dependencies = ( 85 | ); 86 | name = PushDemo; 87 | productName = PushDemo; 88 | productReference = A34B51E21D26A740000953AD /* PushDemo.app */; 89 | productType = "com.apple.product-type.application"; 90 | }; 91 | /* End PBXNativeTarget section */ 92 | 93 | /* Begin PBXProject section */ 94 | A34B51DA1D26A740000953AD /* Project object */ = { 95 | isa = PBXProject; 96 | attributes = { 97 | LastSwiftUpdateCheck = 0720; 98 | LastUpgradeCheck = 0720; 99 | ORGANIZATIONNAME = bv; 100 | TargetAttributes = { 101 | A34B51E11D26A740000953AD = { 102 | CreatedOnToolsVersion = 7.2; 103 | LastSwiftMigration = 0810; 104 | SystemCapabilities = { 105 | com.apple.BackgroundModes = { 106 | enabled = 1; 107 | }; 108 | }; 109 | }; 110 | }; 111 | }; 112 | buildConfigurationList = A34B51DD1D26A740000953AD /* Build configuration list for PBXProject "PushDemo" */; 113 | compatibilityVersion = "Xcode 3.2"; 114 | developmentRegion = English; 115 | hasScannedForEncodings = 0; 116 | knownRegions = ( 117 | en, 118 | Base, 119 | ); 120 | mainGroup = A34B51D91D26A740000953AD; 121 | productRefGroup = A34B51E31D26A740000953AD /* Products */; 122 | projectDirPath = ""; 123 | projectRoot = ""; 124 | targets = ( 125 | A34B51E11D26A740000953AD /* PushDemo */, 126 | ); 127 | }; 128 | /* End PBXProject section */ 129 | 130 | /* Begin PBXResourcesBuildPhase section */ 131 | A34B51E01D26A740000953AD /* Resources */ = { 132 | isa = PBXResourcesBuildPhase; 133 | buildActionMask = 2147483647; 134 | files = ( 135 | A34B51F01D26A740000953AD /* LaunchScreen.storyboard in Resources */, 136 | A34B51ED1D26A740000953AD /* Assets.xcassets in Resources */, 137 | A34B51EB1D26A740000953AD /* Main.storyboard in Resources */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | /* End PBXResourcesBuildPhase section */ 142 | 143 | /* Begin PBXSourcesBuildPhase section */ 144 | A34B51DE1D26A740000953AD /* Sources */ = { 145 | isa = PBXSourcesBuildPhase; 146 | buildActionMask = 2147483647; 147 | files = ( 148 | A34B51E81D26A740000953AD /* ViewController.swift in Sources */, 149 | A34B51E61D26A740000953AD /* AppDelegate.swift in Sources */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXSourcesBuildPhase section */ 154 | 155 | /* Begin PBXVariantGroup section */ 156 | A34B51E91D26A740000953AD /* Main.storyboard */ = { 157 | isa = PBXVariantGroup; 158 | children = ( 159 | A34B51EA1D26A740000953AD /* Base */, 160 | ); 161 | name = Main.storyboard; 162 | sourceTree = ""; 163 | }; 164 | A34B51EE1D26A740000953AD /* LaunchScreen.storyboard */ = { 165 | isa = PBXVariantGroup; 166 | children = ( 167 | A34B51EF1D26A740000953AD /* Base */, 168 | ); 169 | name = LaunchScreen.storyboard; 170 | sourceTree = ""; 171 | }; 172 | /* End PBXVariantGroup section */ 173 | 174 | /* Begin XCBuildConfiguration section */ 175 | A34B51F21D26A740000953AD /* Debug */ = { 176 | isa = XCBuildConfiguration; 177 | buildSettings = { 178 | ALWAYS_SEARCH_USER_PATHS = NO; 179 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 180 | CLANG_CXX_LIBRARY = "libc++"; 181 | CLANG_ENABLE_MODULES = YES; 182 | CLANG_ENABLE_OBJC_ARC = YES; 183 | CLANG_WARN_BOOL_CONVERSION = YES; 184 | CLANG_WARN_CONSTANT_CONVERSION = YES; 185 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 186 | CLANG_WARN_EMPTY_BODY = YES; 187 | CLANG_WARN_ENUM_CONVERSION = YES; 188 | CLANG_WARN_INT_CONVERSION = YES; 189 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 190 | CLANG_WARN_UNREACHABLE_CODE = YES; 191 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 192 | CODE_SIGN_IDENTITY = ""; 193 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 194 | COPY_PHASE_STRIP = NO; 195 | DEBUG_INFORMATION_FORMAT = dwarf; 196 | ENABLE_STRICT_OBJC_MSGSEND = YES; 197 | ENABLE_TESTABILITY = YES; 198 | GCC_C_LANGUAGE_STANDARD = gnu99; 199 | GCC_DYNAMIC_NO_PIC = NO; 200 | GCC_NO_COMMON_BLOCKS = YES; 201 | GCC_OPTIMIZATION_LEVEL = 0; 202 | GCC_PREPROCESSOR_DEFINITIONS = ( 203 | "DEBUG=1", 204 | "$(inherited)", 205 | ); 206 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 207 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 208 | GCC_WARN_UNDECLARED_SELECTOR = YES; 209 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 210 | GCC_WARN_UNUSED_FUNCTION = YES; 211 | GCC_WARN_UNUSED_VARIABLE = YES; 212 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 213 | MTL_ENABLE_DEBUG_INFO = YES; 214 | ONLY_ACTIVE_ARCH = YES; 215 | PROVISIONING_PROFILE = ""; 216 | SDKROOT = iphoneos; 217 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 218 | }; 219 | name = Debug; 220 | }; 221 | A34B51F31D26A740000953AD /* Release */ = { 222 | isa = XCBuildConfiguration; 223 | buildSettings = { 224 | ALWAYS_SEARCH_USER_PATHS = NO; 225 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 226 | CLANG_CXX_LIBRARY = "libc++"; 227 | CLANG_ENABLE_MODULES = YES; 228 | CLANG_ENABLE_OBJC_ARC = YES; 229 | CLANG_WARN_BOOL_CONVERSION = YES; 230 | CLANG_WARN_CONSTANT_CONVERSION = YES; 231 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 232 | CLANG_WARN_EMPTY_BODY = YES; 233 | CLANG_WARN_ENUM_CONVERSION = YES; 234 | CLANG_WARN_INT_CONVERSION = YES; 235 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 236 | CLANG_WARN_UNREACHABLE_CODE = YES; 237 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 238 | CODE_SIGN_IDENTITY = ""; 239 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 240 | COPY_PHASE_STRIP = NO; 241 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 242 | ENABLE_NS_ASSERTIONS = NO; 243 | ENABLE_STRICT_OBJC_MSGSEND = YES; 244 | GCC_C_LANGUAGE_STANDARD = gnu99; 245 | GCC_NO_COMMON_BLOCKS = YES; 246 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 247 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 248 | GCC_WARN_UNDECLARED_SELECTOR = YES; 249 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 250 | GCC_WARN_UNUSED_FUNCTION = YES; 251 | GCC_WARN_UNUSED_VARIABLE = YES; 252 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 253 | MTL_ENABLE_DEBUG_INFO = NO; 254 | PROVISIONING_PROFILE = ""; 255 | SDKROOT = iphoneos; 256 | VALIDATE_PRODUCT = YES; 257 | }; 258 | name = Release; 259 | }; 260 | A34B51F51D26A740000953AD /* Debug */ = { 261 | isa = XCBuildConfiguration; 262 | buildSettings = { 263 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 264 | CODE_SIGN_IDENTITY = ""; 265 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 266 | INFOPLIST_FILE = PushDemo/Info.plist; 267 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 268 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 269 | PRODUCT_NAME = "$(TARGET_NAME)"; 270 | PROVISIONING_PROFILE = ""; 271 | SWIFT_VERSION = 3.0; 272 | }; 273 | name = Debug; 274 | }; 275 | A34B51F61D26A740000953AD /* Release */ = { 276 | isa = XCBuildConfiguration; 277 | buildSettings = { 278 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 279 | CODE_SIGN_IDENTITY = ""; 280 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 281 | INFOPLIST_FILE = PushDemo/Info.plist; 282 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 283 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 284 | PRODUCT_NAME = "$(TARGET_NAME)"; 285 | PROVISIONING_PROFILE = ""; 286 | SWIFT_VERSION = 3.0; 287 | }; 288 | name = Release; 289 | }; 290 | /* End XCBuildConfiguration section */ 291 | 292 | /* Begin XCConfigurationList section */ 293 | A34B51DD1D26A740000953AD /* Build configuration list for PBXProject "PushDemo" */ = { 294 | isa = XCConfigurationList; 295 | buildConfigurations = ( 296 | A34B51F21D26A740000953AD /* Debug */, 297 | A34B51F31D26A740000953AD /* Release */, 298 | ); 299 | defaultConfigurationIsVisible = 0; 300 | defaultConfigurationName = Release; 301 | }; 302 | A34B51F41D26A740000953AD /* Build configuration list for PBXNativeTarget "PushDemo" */ = { 303 | isa = XCConfigurationList; 304 | buildConfigurations = ( 305 | A34B51F51D26A740000953AD /* Debug */, 306 | A34B51F61D26A740000953AD /* Release */, 307 | ); 308 | defaultConfigurationIsVisible = 0; 309 | defaultConfigurationName = Release; 310 | }; 311 | /* End XCConfigurationList section */ 312 | }; 313 | rootObject = A34B51DA1D26A740000953AD /* Project object */; 314 | } 315 | -------------------------------------------------------------------------------- /Objective C Demo/PushKitDemoObjectiveC/PushKitDemoObjectiveC.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A3BAD7F61E35FD7300CD68A9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BAD7F51E35FD7300CD68A9 /* main.m */; }; 11 | A3BAD7F91E35FD7300CD68A9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BAD7F81E35FD7300CD68A9 /* AppDelegate.m */; }; 12 | A3BAD7FC1E35FD7300CD68A9 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A3BAD7FB1E35FD7300CD68A9 /* ViewController.m */; }; 13 | A3BAD7FF1E35FD7300CD68A9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A3BAD7FD1E35FD7300CD68A9 /* Main.storyboard */; }; 14 | A3BAD8011E35FD7300CD68A9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A3BAD8001E35FD7300CD68A9 /* Assets.xcassets */; }; 15 | A3BAD8041E35FD7300CD68A9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A3BAD8021E35FD7300CD68A9 /* LaunchScreen.storyboard */; }; 16 | A3BAD80C1E35FD9700CD68A9 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3BAD80B1E35FD9700CD68A9 /* PushKit.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | A3BAD7F11E35FD7300CD68A9 /* PushKitDemoObjectiveC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushKitDemoObjectiveC.app; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | A3BAD7F51E35FD7300CD68A9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 22 | A3BAD7F71E35FD7300CD68A9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 23 | A3BAD7F81E35FD7300CD68A9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 24 | A3BAD7FA1E35FD7300CD68A9 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 25 | A3BAD7FB1E35FD7300CD68A9 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 26 | A3BAD7FE1E35FD7300CD68A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 27 | A3BAD8001E35FD7300CD68A9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28 | A3BAD8031E35FD7300CD68A9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 29 | A3BAD8051E35FD7300CD68A9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | A3BAD80B1E35FD9700CD68A9 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; 31 | /* End PBXFileReference section */ 32 | 33 | /* Begin PBXFrameworksBuildPhase section */ 34 | A3BAD7EE1E35FD7200CD68A9 /* Frameworks */ = { 35 | isa = PBXFrameworksBuildPhase; 36 | buildActionMask = 2147483647; 37 | files = ( 38 | A3BAD80C1E35FD9700CD68A9 /* PushKit.framework in Frameworks */, 39 | ); 40 | runOnlyForDeploymentPostprocessing = 0; 41 | }; 42 | /* End PBXFrameworksBuildPhase section */ 43 | 44 | /* Begin PBXGroup section */ 45 | A3BAD7E81E35FD7200CD68A9 = { 46 | isa = PBXGroup; 47 | children = ( 48 | A3BAD80B1E35FD9700CD68A9 /* PushKit.framework */, 49 | A3BAD7F31E35FD7300CD68A9 /* PushKitDemoObjectiveC */, 50 | A3BAD7F21E35FD7300CD68A9 /* Products */, 51 | ); 52 | sourceTree = ""; 53 | }; 54 | A3BAD7F21E35FD7300CD68A9 /* Products */ = { 55 | isa = PBXGroup; 56 | children = ( 57 | A3BAD7F11E35FD7300CD68A9 /* PushKitDemoObjectiveC.app */, 58 | ); 59 | name = Products; 60 | sourceTree = ""; 61 | }; 62 | A3BAD7F31E35FD7300CD68A9 /* PushKitDemoObjectiveC */ = { 63 | isa = PBXGroup; 64 | children = ( 65 | A3BAD7F71E35FD7300CD68A9 /* AppDelegate.h */, 66 | A3BAD7F81E35FD7300CD68A9 /* AppDelegate.m */, 67 | A3BAD7FA1E35FD7300CD68A9 /* ViewController.h */, 68 | A3BAD7FB1E35FD7300CD68A9 /* ViewController.m */, 69 | A3BAD7FD1E35FD7300CD68A9 /* Main.storyboard */, 70 | A3BAD8001E35FD7300CD68A9 /* Assets.xcassets */, 71 | A3BAD8021E35FD7300CD68A9 /* LaunchScreen.storyboard */, 72 | A3BAD8051E35FD7300CD68A9 /* Info.plist */, 73 | A3BAD7F41E35FD7300CD68A9 /* Supporting Files */, 74 | ); 75 | path = PushKitDemoObjectiveC; 76 | sourceTree = ""; 77 | }; 78 | A3BAD7F41E35FD7300CD68A9 /* Supporting Files */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | A3BAD7F51E35FD7300CD68A9 /* main.m */, 82 | ); 83 | name = "Supporting Files"; 84 | sourceTree = ""; 85 | }; 86 | /* End PBXGroup section */ 87 | 88 | /* Begin PBXNativeTarget section */ 89 | A3BAD7F01E35FD7200CD68A9 /* PushKitDemoObjectiveC */ = { 90 | isa = PBXNativeTarget; 91 | buildConfigurationList = A3BAD8081E35FD7300CD68A9 /* Build configuration list for PBXNativeTarget "PushKitDemoObjectiveC" */; 92 | buildPhases = ( 93 | A3BAD7ED1E35FD7200CD68A9 /* Sources */, 94 | A3BAD7EE1E35FD7200CD68A9 /* Frameworks */, 95 | A3BAD7EF1E35FD7200CD68A9 /* Resources */, 96 | ); 97 | buildRules = ( 98 | ); 99 | dependencies = ( 100 | ); 101 | name = PushKitDemoObjectiveC; 102 | productName = PushKitDemoObjectiveC; 103 | productReference = A3BAD7F11E35FD7300CD68A9 /* PushKitDemoObjectiveC.app */; 104 | productType = "com.apple.product-type.application"; 105 | }; 106 | /* End PBXNativeTarget section */ 107 | 108 | /* Begin PBXProject section */ 109 | A3BAD7E91E35FD7200CD68A9 /* Project object */ = { 110 | isa = PBXProject; 111 | attributes = { 112 | LastUpgradeCheck = 0720; 113 | ORGANIZATIONNAME = Hasya; 114 | TargetAttributes = { 115 | A3BAD7F01E35FD7200CD68A9 = { 116 | CreatedOnToolsVersion = 7.2; 117 | }; 118 | }; 119 | }; 120 | buildConfigurationList = A3BAD7EC1E35FD7200CD68A9 /* Build configuration list for PBXProject "PushKitDemoObjectiveC" */; 121 | compatibilityVersion = "Xcode 3.2"; 122 | developmentRegion = English; 123 | hasScannedForEncodings = 0; 124 | knownRegions = ( 125 | en, 126 | Base, 127 | ); 128 | mainGroup = A3BAD7E81E35FD7200CD68A9; 129 | productRefGroup = A3BAD7F21E35FD7300CD68A9 /* Products */; 130 | projectDirPath = ""; 131 | projectRoot = ""; 132 | targets = ( 133 | A3BAD7F01E35FD7200CD68A9 /* PushKitDemoObjectiveC */, 134 | ); 135 | }; 136 | /* End PBXProject section */ 137 | 138 | /* Begin PBXResourcesBuildPhase section */ 139 | A3BAD7EF1E35FD7200CD68A9 /* Resources */ = { 140 | isa = PBXResourcesBuildPhase; 141 | buildActionMask = 2147483647; 142 | files = ( 143 | A3BAD8041E35FD7300CD68A9 /* LaunchScreen.storyboard in Resources */, 144 | A3BAD8011E35FD7300CD68A9 /* Assets.xcassets in Resources */, 145 | A3BAD7FF1E35FD7300CD68A9 /* Main.storyboard in Resources */, 146 | ); 147 | runOnlyForDeploymentPostprocessing = 0; 148 | }; 149 | /* End PBXResourcesBuildPhase section */ 150 | 151 | /* Begin PBXSourcesBuildPhase section */ 152 | A3BAD7ED1E35FD7200CD68A9 /* Sources */ = { 153 | isa = PBXSourcesBuildPhase; 154 | buildActionMask = 2147483647; 155 | files = ( 156 | A3BAD7FC1E35FD7300CD68A9 /* ViewController.m in Sources */, 157 | A3BAD7F91E35FD7300CD68A9 /* AppDelegate.m in Sources */, 158 | A3BAD7F61E35FD7300CD68A9 /* main.m in Sources */, 159 | ); 160 | runOnlyForDeploymentPostprocessing = 0; 161 | }; 162 | /* End PBXSourcesBuildPhase section */ 163 | 164 | /* Begin PBXVariantGroup section */ 165 | A3BAD7FD1E35FD7300CD68A9 /* Main.storyboard */ = { 166 | isa = PBXVariantGroup; 167 | children = ( 168 | A3BAD7FE1E35FD7300CD68A9 /* Base */, 169 | ); 170 | name = Main.storyboard; 171 | sourceTree = ""; 172 | }; 173 | A3BAD8021E35FD7300CD68A9 /* LaunchScreen.storyboard */ = { 174 | isa = PBXVariantGroup; 175 | children = ( 176 | A3BAD8031E35FD7300CD68A9 /* Base */, 177 | ); 178 | name = LaunchScreen.storyboard; 179 | sourceTree = ""; 180 | }; 181 | /* End PBXVariantGroup section */ 182 | 183 | /* Begin XCBuildConfiguration section */ 184 | A3BAD8061E35FD7300CD68A9 /* Debug */ = { 185 | isa = XCBuildConfiguration; 186 | buildSettings = { 187 | ALWAYS_SEARCH_USER_PATHS = NO; 188 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 189 | CLANG_CXX_LIBRARY = "libc++"; 190 | CLANG_ENABLE_MODULES = YES; 191 | CLANG_ENABLE_OBJC_ARC = YES; 192 | CLANG_WARN_BOOL_CONVERSION = YES; 193 | CLANG_WARN_CONSTANT_CONVERSION = YES; 194 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 195 | CLANG_WARN_EMPTY_BODY = YES; 196 | CLANG_WARN_ENUM_CONVERSION = YES; 197 | CLANG_WARN_INT_CONVERSION = YES; 198 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 199 | CLANG_WARN_UNREACHABLE_CODE = YES; 200 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 201 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 202 | COPY_PHASE_STRIP = NO; 203 | DEBUG_INFORMATION_FORMAT = dwarf; 204 | ENABLE_STRICT_OBJC_MSGSEND = YES; 205 | ENABLE_TESTABILITY = YES; 206 | GCC_C_LANGUAGE_STANDARD = gnu99; 207 | GCC_DYNAMIC_NO_PIC = NO; 208 | GCC_NO_COMMON_BLOCKS = YES; 209 | GCC_OPTIMIZATION_LEVEL = 0; 210 | GCC_PREPROCESSOR_DEFINITIONS = ( 211 | "DEBUG=1", 212 | "$(inherited)", 213 | ); 214 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 215 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 216 | GCC_WARN_UNDECLARED_SELECTOR = YES; 217 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 218 | GCC_WARN_UNUSED_FUNCTION = YES; 219 | GCC_WARN_UNUSED_VARIABLE = YES; 220 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 221 | MTL_ENABLE_DEBUG_INFO = YES; 222 | ONLY_ACTIVE_ARCH = YES; 223 | SDKROOT = iphoneos; 224 | }; 225 | name = Debug; 226 | }; 227 | A3BAD8071E35FD7300CD68A9 /* Release */ = { 228 | isa = XCBuildConfiguration; 229 | buildSettings = { 230 | ALWAYS_SEARCH_USER_PATHS = NO; 231 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 232 | CLANG_CXX_LIBRARY = "libc++"; 233 | CLANG_ENABLE_MODULES = YES; 234 | CLANG_ENABLE_OBJC_ARC = YES; 235 | CLANG_WARN_BOOL_CONVERSION = YES; 236 | CLANG_WARN_CONSTANT_CONVERSION = YES; 237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 238 | CLANG_WARN_EMPTY_BODY = YES; 239 | CLANG_WARN_ENUM_CONVERSION = YES; 240 | CLANG_WARN_INT_CONVERSION = YES; 241 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 242 | CLANG_WARN_UNREACHABLE_CODE = YES; 243 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 244 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 245 | COPY_PHASE_STRIP = NO; 246 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 247 | ENABLE_NS_ASSERTIONS = NO; 248 | ENABLE_STRICT_OBJC_MSGSEND = YES; 249 | GCC_C_LANGUAGE_STANDARD = gnu99; 250 | GCC_NO_COMMON_BLOCKS = YES; 251 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 252 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 253 | GCC_WARN_UNDECLARED_SELECTOR = YES; 254 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 255 | GCC_WARN_UNUSED_FUNCTION = YES; 256 | GCC_WARN_UNUSED_VARIABLE = YES; 257 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 258 | MTL_ENABLE_DEBUG_INFO = NO; 259 | SDKROOT = iphoneos; 260 | VALIDATE_PRODUCT = YES; 261 | }; 262 | name = Release; 263 | }; 264 | A3BAD8091E35FD7300CD68A9 /* Debug */ = { 265 | isa = XCBuildConfiguration; 266 | buildSettings = { 267 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 268 | INFOPLIST_FILE = PushKitDemoObjectiveC/Info.plist; 269 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 270 | PRODUCT_BUNDLE_IDENTIFIER = com.HP.PushKitDemoObjectiveC; 271 | PRODUCT_NAME = "$(TARGET_NAME)"; 272 | }; 273 | name = Debug; 274 | }; 275 | A3BAD80A1E35FD7300CD68A9 /* Release */ = { 276 | isa = XCBuildConfiguration; 277 | buildSettings = { 278 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 279 | INFOPLIST_FILE = PushKitDemoObjectiveC/Info.plist; 280 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 281 | PRODUCT_BUNDLE_IDENTIFIER = com.HP.PushKitDemoObjectiveC; 282 | PRODUCT_NAME = "$(TARGET_NAME)"; 283 | }; 284 | name = Release; 285 | }; 286 | /* End XCBuildConfiguration section */ 287 | 288 | /* Begin XCConfigurationList section */ 289 | A3BAD7EC1E35FD7200CD68A9 /* Build configuration list for PBXProject "PushKitDemoObjectiveC" */ = { 290 | isa = XCConfigurationList; 291 | buildConfigurations = ( 292 | A3BAD8061E35FD7300CD68A9 /* Debug */, 293 | A3BAD8071E35FD7300CD68A9 /* Release */, 294 | ); 295 | defaultConfigurationIsVisible = 0; 296 | defaultConfigurationName = Release; 297 | }; 298 | A3BAD8081E35FD7300CD68A9 /* Build configuration list for PBXNativeTarget "PushKitDemoObjectiveC" */ = { 299 | isa = XCConfigurationList; 300 | buildConfigurations = ( 301 | A3BAD8091E35FD7300CD68A9 /* Debug */, 302 | A3BAD80A1E35FD7300CD68A9 /* Release */, 303 | ); 304 | defaultConfigurationIsVisible = 0; 305 | }; 306 | /* End XCConfigurationList section */ 307 | }; 308 | rootObject = A3BAD7E91E35FD7200CD68A9 /* Project object */; 309 | } 310 | --------------------------------------------------------------------------------