Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apple PNS (push notification services) sample code

Is there a sample project showing how to use APNS on the IPhone and how to set up things? I'm currently looking at the documentation but it would be nice to have some working code to pick apart and see how it all works together?

I can't seem to find anything using google or in the iphone dev center.

like image 538
froh42 Avatar asked Jun 27 '09 11:06

froh42


People also ask

Does Apple send push notifications?

Remote Notifications Communicate with Apple Push Notification service (APNs) and receive a unique device token that identifies your app. Use basic macOS command-line tools to send push notifications to Apple Push Notification service (APNs).

How do I set up Apple push notifications?

Setting up Push Notifications in iOS. Go back to the iOS project you created earlier and select the main target. Under the Signing & Capabilities tab, click on the + Capability button, then select Push Notifications. This will enable your app to receive push notifications from OneSignal.


2 Answers

The worst part about setting up the push notification service is the provisioning. The major stumbling block that I came across was that there is a certificate and a key in the .cer file you download from Apple's site, I wrote a system service in C# that sent out notifications and the connections kept failing because I had exported the certificate and not the key.

I don't recall who originally wrote this, here is a little bit of code in python that helped me out when I was first testing the notification service. I like it because it is very simple and works well during testing.

import socket, ssl, json, struct  # device token returned when the iPhone application # registers to receive alerts  deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'   thePayLoad = {      'aps': {           'alert':'Oh no! Server\'s Down!',           'sound':'k1DiveAlarm.caf',           'badge':42,           },      'test_data': { 'foo': 'bar' },      }  # Certificate issued by apple and converted to .pem format with openSSL # Per Apple's Push Notification Guide (end of chapter 3), first export the cert in p12 format # openssl pkcs12 -in cert.p12 -out cert.pem -nodes  #   when prompted "Enter Import Password:" hit return # theCertfile = 'cert.pem' #  theHost = ( 'gateway.sandbox.push.apple.com', 2195 )  #  data = json.dumps( thePayLoad )  # Clear out spaces in the device token and convert to hex deviceToken = deviceToken.replace(' ','') byteToken = bytes.fromhex( deviceToken ) # Python 3 # byteToken = deviceToken.decode('hex') # Python 2  theFormat = '!BH32sH%ds' % len(data) theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data )  # Create our connection using the certfile saved locally ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile ) ssl_sock.connect( theHost )  # Write out our data ssl_sock.write( theNotification )  # Close the connection -- apple would prefer that we keep # a connection open and push data as needed. ssl_sock.close() 

There's also a rails gem called apn_on_rails that seems to work pretty well if you're developing a rails application, I just saw it today and was able to send out notifications from the console.

On the iPhone side you'll just need to call the following to register for all types of notifications:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; 

To receive the device token you'll need to implement the following delegate methods:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

During testing you can just kick the deviceToken to the console with NSLog, then paste it into the python script above, in production you'll obviously need to set up some method to get the token to your servers.

Also, in production you'll need to query Apple's feedback service and remove device tokens from users who removed your app.

like image 191
jessecurry Avatar answered Sep 30 '22 20:09

jessecurry


A good place to start is Urban Airship. You can set up a free basic account that will do all of the server-side work of sending push notifications to Apple's servers. They also do a great job of walking you through all of the steps needed to get your application working with their service, and have excellent sample code that shows how to register your application for notifications.

I have no other affiliation with them other than being a happy user of their service.

like image 23
Scott K. Avatar answered Sep 30 '22 18:09

Scott K.