├── 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 | 
190 |
191 | # Before XCode 9
192 |
193 | 
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 | 
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 |
--------------------------------------------------------------------------------