Working with Apple Push Notification


What is Apple Push Notification Service

The Apple Push Notification Service is a service created by Apple Inc., it uses push technology through a constantly open IP connection to forward notifications from the servers of third party applications to the Apple devices; such notifications may include badges, sounds or custom text alerts.

As a provider, you need to communicate with the Apple Push Notification Service (APNS) to send the messages that are then pushed to the phone. This is necessary so that the device only needs to maintain 1 connection to the APNS, helping to reduce battery usage.

Basic Structure
  1. You connect to the APNS using your unique SSL certificate
  2. Cycle through the messages you want to send 
  3. Construct the payload for each message
  4. Disconnect from APNS

Device Token

Each push message must be “addressed” to a specific device. This is achieved by using a unique deviceToken generated by APNS within your iPhone application. Once this token has been retrieved, you need to store it on your server.


Implementation

Here is a sample implementation of Apple Push Notification Service through PHP

Create apns.php

<?php

// authentication
$host = "localhost";
$user = "db_username";
$pass = "db_password";
$dbname = "db_name";

// create connection with database
$con = mysql_connect($host,$user,$pass);

// check whether database connection is successful 
if (!$con) {
// if connection not successful then stop the script and show the error
die('Could not connect to database: ' . mysql_error());
} else {
// if database connection successful then select the database
mysql_select_db($dbname, $con);
}

// get the id, token from database
$result = mysql_query("SELECT id,token FROM `device_tokens` ORDER BY id");

//Setup notification message
$body = array();
$body['aps'] = array('alert' => 'This is push message');
$body['aps']['notifurl'] = 'http://www.mydomain.com';
$body['aps']['badge'] = 2;

//Setup stream (connect to Apple Push Server)
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', 'password_for_apns.pem_file');
stream_context_set_option($ctx, 'ssl', 'local_cert', 'apns_pem_certificate.pem');
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    stream_set_blocking ($fp, 0); 
// This allows fread() to return right away when there are no errors. But it can also miss errors during 
//  last  seconds of sending, as there is a delay before error is returned. Workaround is to pause briefly 
// AFTER sending last notification, and then do one more fread() to see if anything else is there.

if (!$fp) {
//ERROR
 echo "Failed to connect (stream_socket_client): $err $errstrn";

} else {

// Keep push alive (waiting for delivery) for 90 days
$apple_expiry = time() + (90 * 24 * 60 * 60); 

// Loop thru tokens from database
while($row = mysql_fetch_array($result)) {
$apple_identifier = $row["id"];
$deviceToken = $row["token"];
$payload = json_encode($body);
            
// Enhanced Notification
$msg = pack("C", 1) . pack("N", $apple_identifier) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload; 
            
// SEND PUSH
fwrite($fp, $msg);

// We can check if an error has been returned while we are sending, but we also need to 
// check once more after we are done sending in case there was a delay with error response.
checkAppleErrorResponse($fp); 
}

// Workaround to check if there were any errors during the last seconds of sending.
// Pause for half a second. 
// Note I tested this with up to a 5 minute pause, and the error message was still available to be retrieved
usleep(500000); 

checkAppleErrorResponse($fp);

echo 'Completed';

mysql_close($con);
fclose($fp);

}

// FUNCTION to check if there is an error response from Apple
// Returns TRUE if there was and FALSE if there was not
function checkAppleErrorResponse($fp) {

//byte1=always 8, byte2=StatusCode, bytes3,4,5,6=identifier(rowID). 
// Should return nothing if OK.

//NOTE: Make sure you set stream_set_blocking($fp, 0) or else fread will pause your script and wait 
// forever when there is no response to be sent.

$apple_error_response = fread($fp, 6);

if ($apple_error_response) {

// unpack the error response (first byte 'command" should always be 8)
$error_response = unpack('Ccommand/Cstatus_code/Nidentifier', $apple_error_response); 

if ($error_response['status_code'] == '0') {
$error_response['status_code'] = '0-No errors encountered';

} else if ($error_response['status_code'] == '1') {
$error_response['status_code'] = '1-Processing error';

} else if ($error_response['status_code'] == '2') {
$error_response['status_code'] = '2-Missing device token';

} else if ($error_response['status_code'] == '3') {
$error_response['status_code'] = '3-Missing topic';

} else if ($error_response['status_code'] == '4') {
$error_response['status_code'] = '4-Missing payload';

} else if ($error_response['status_code'] == '5') {
$error_response['status_code'] = '5-Invalid token size';

} else if ($error_response['status_code'] == '6') {
$error_response['status_code'] = '6-Invalid topic size';

} else if ($error_response['status_code'] == '7') {
$error_response['status_code'] = '7-Invalid payload size';

} else if ($error_response['status_code'] == '8') {
$error_response['status_code'] = '8-Invalid token';

} else if ($error_response['status_code'] == '255') {
$error_response['status_code'] = '255-None (unknown)';

} else {
$error_response['status_code'] = $error_response['status_code'].'-Not listed';

}

echo '<br><b>+ + + + + + ERROR</b> Response Command:<b>' . $error_response['command'] . '</b>&nbsp;&nbsp;&nbsp;Identifier:<b>' . $error_response['identifier'] . '</b>&nbsp;&nbsp;&nbsp;Status:<b>' . $error_response['status_code'] . '</b><br>';

echo 'Identifier is the rowID (index) in the database that caused the problem, and Apple will disconnect you from server. To continue sending Push Notifications, just start at the next rowID after this Identifier.<br>';

return true;
}
       
return false;
}

?>

Setup Cronjob

While you want to send huge amount of push notification, then it would be better to add to crontab.

Open crontab to add a new cronjob
$ crontab -e

Add a cronjob (Assume you want to run the cron every 5 minutes)
*/5 * * * * myuser /usr/bin/php -f /absolute/path/to/apns.php fetch > /usr/local/apns/apns.log 2>&1 &

Here, the > operator used to redirect the standard output generated by the process to a suitable location, while the & operator sends the process to the background and returns the control to the calling process.

You can discard the output by sending it to /dev/null

It is also a good practice to keep track of id of the process you execute in the background. You can retrive it via the $! operator and store it in a variable for future use.

100 comments:

  1. Replies
    1. Use GCM google provides document for http push
      also u can use gcm for ios now

      Delete
  2. sf android_notify(registration id pass, your message) {

    $headers = array();
    $headers[] = 'Content-Type:application/json';
    $headers[] = 'Authorization:key=your key';

    $data = array(
    'registration_ids' => array($smRegistrationId), //array("key"),
    'data' => array("message" => $ssMessage, "collapse_key" => (string) time()),
    );

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, PUSH_NOTIFICATIONS_GCM_SERVER_POST_URL);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
    $response_raw = curl_exec($curl);
    $info = curl_getinfo($curl);

    curl_close($curl);
    $response = FALSE;
    if (isset($response_raw)) {
    $response = json_decode($response_raw);
    //print_r($response);
    }
    return true;
    }

    ReplyDelete
  3. iphone_notify(token, message, if required counter) {

    require_once sfConfig::get('sf_web_dir') . '/ApnsPHP/Autoload.php';

    $push = new ApnsPHP_Push(ApnsPHP_Abstract::ENVIRONMENT_SANDBOX, sfConfig::get('sf_web_dir') . '/ApnsPHP/apns-dev.pem'); //spoco certificate
    $push->setRootCertificationAuthority(sfConfig::get('sf_web_dir') . '/ApnsPHP/entrust_root_certification_authority.pem');

    // Connect to the Apple Push Notification Service
    $push->connect();

    // Instantiate a new Message with a single recipient
    $message = new ApnsPHP_Message($token);

    $message->setCustomIdentifier("Message-Badge-3");

    // $message->setText('You have received new offer.');
    $counter = intval($counter);
    $message->setBadge($counter);

    // Play the default sound
    $message->setSound('sound.caf');
    // Set a custom property
    $message->setCustomProperty('acme2', array('bang', 'whiz'));
    // Set another custom property
    $message->setCustomProperty('acme3', array('bing', 'bong'));
    // Set the expiry value to 30 seconds
    $message->setExpiry(30);
    // Add the message to the message queue
    $push->add($message);
    // Send all messages in the message queue
    $push->send();
    $push->disconnect();
    $aErrorQueue = $push->getErrors();

    if (!empty($aErrorQueue)) {
    //return array(false, $aErrorQueue);
    } else {
    //echo "iPhone - Success";
    }
    //return 1;
    session_unset($_SESSION[$token]);
    return true;
    }

    ReplyDelete
  4. I get this ssl error when sending 500+ messages:

    Warning: fwrite() [function.fwrite]: SSL operation failed with code 1. OpenSSL Error messages: error:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry in


    Works fine when sending just a few messages though.

    ReplyDelete
    Replies
    1. Did you find solution to this?

      Delete
    2. Add fclose($fp) after fwrite() function , update SSL package in server and restart server . Before that check push parameters in code, it works for me.

      Delete
  5. Your post of Apple push notification is really impressive.The Apple Push Notification Service is a service created by Apple Inc. Mac OS X Server uses APNs to push the server's mail, calendar and contacts services to network users.
    Thanks.
    For more information please visit here push notifications iphone

    ReplyDelete
  6. I have tried this but it is not working. I have got below error:-

    unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Connection timed out)

    could you please tell me why it is showing.

    ReplyDelete
  7. hello dudes make sure your server is https bcse it does not support http server thanks

    ReplyDelete
  8. in that ssl means secure server only support

    ReplyDelete
  9. How will the device-token - of a fresh installation of my app on a device anywhere of the world - will get into the mysql-database? Until now I hadn't realized this point. Perhaps someone could explain (for dummies ;-))

    ReplyDelete
    Replies
    1. Well your supposed to save it on your server first :) You need to make request to your server from your phone with token before you want to send notification

      Delete
  10. This comment has been removed by the author.

    ReplyDelete
  11. guys m beginner to this field so plz tell how it realy works

    ReplyDelete
  12. need code for message notification n email alterz .....

    ReplyDelete
  13. This comment has been removed by the author.

    ReplyDelete
  14. Nice One , I used it on http://iphonesoft.fr !
    thank you very much

    ReplyDelete

  15. Nice Blog , This is what I exactly Looking for , Keep sharing more blog .


    Apple iPhone Service Center Chennai, Tamil Nadu

    ReplyDelete
  16. Professionally written blogs are rare to find, however I appreciate all the points mentioned here. I also want to include some other writing skills which everyone must aware of. macbook

    ReplyDelete

  17. At this time, it seems like Word Press is the preferred blogging platform available right now. (from what I’ve read) Is that what you’re using on your blog? Great post, however, I was wondering if you could write a little more on this subject?
    Best AWS Training in Marathahalli | AWS Training in Marathahalli
    Amazon Web Services Training in Anna Nagar, Chennai |Best AWS Training in Anna Nagar, Chennai

    ReplyDelete
  18. Amazon Web Services (AWS) is the most popular and most widely used Infrastructure as a Service (IaaS) cloud in the world.AWS has four core feature buckets—Compute, Storage & Content Delivery, Databases, and Networking. At a high level, you can control all of these with extensive administrative controls accessible via a secure Web client.For more information visit aws online
    training

    ReplyDelete
  19. After reading your post I understood that last week was with full of surprises and happiness for you. Congratz! Even though the website is work related, you can update small events in your life and share your happiness with us too.

    python training Course in chennai | python training in Bangalore | Python training institute in kalyan nagar

    ReplyDelete
  20. Read all the information that i've given in above article. It'll give u the whole idea about it.
    advanced excel training in bangalore

    ReplyDelete
  21. Thanks for your great and helpful presentation I like your good service.I always appreciate your post. That is very interesting I love reading and I am always searching for informative information like this. Well written article.Thank You for Sharing with Us angular 7 training in velachery

    ReplyDelete
  22. This post is much helpful for us. This is really very massive value to all the readers and it will be the only reason for the post to get popular with great authority.
    Java J2ee Training in Chennai
    German Training Institute in Chennai
    german language coaching centres in chennai
    Java Coaching Center in Chennai
    Best Java Training in Chennai
    German Training Centers in Chennai

    ReplyDelete
  23. I am really enjoying reading your well written articles.
    It looks like you spend a lot of effort and time on your blog.
    php training in bangalore
    php course in bangalore
    Website Design Course in Bangalore
    Best Web Designing Course in Bangalore

    ReplyDelete
  24. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us. machine learning training in chennai
    machine learning certification course in chennai
    python machine learning training in chennai
    top institutes for machine learning in chennai

    ReplyDelete
  25. Outstanding blog thanks for sharing such wonderful blog with us ,after long time came across such knowlegeble blog. keep sharing such informative blog with us.

    Check out : best training insitute for machine learning
    machine learning classroom training in chennai
    machine learning with python course in chennai
    best machine learning institutes in chennai

    ReplyDelete
  26. Thanks for posting useful information.You have provided an nice article, Thank you very much for this one. And i hope this will be useful for many people.. and i am waiting for your next post keep on updating these kinds of knowledgeable things...Really it was an awesome article...very interesting to read..please sharing like this information......
    samsung mobile service center in chennai
    samsung mobile service center
    samsung mobile service chennai
    samsung mobile repair

    ReplyDelete
  27. Thanks for sharing this valuable information to our vision. You have posted a trust worthy blog keep sharing.
    iPhone Service Center in Chennai Near Me

    ReplyDelete
  28. Great useful article. Most of the information is really helpful to me. Thanks for sharing this article.
    Apple iPhone Service Center in Chennai Anna Nagar



    ReplyDelete
  29. Si el agua cae al lago, desaparecerá( phụ kiện tủ bếp ). Pero si cae a la hoja de( phụ kiện tủ áo ) loto, brillará como una joya. Caer igual pero( thùng gạo thông minh ) estar con alguien es importante.

    ReplyDelete
  30. Your info is really amazing with impressive content..Excellent blog with informative concept. Really I feel happy to see this useful blog, Thanks for sharing such a nice blog..
    If you are looking for any python Related information please visit our website Python Training In Pune page!

    ReplyDelete
  31. Snapdeal Winner List here came up with an Offer where you can win Snapdeal prize list 2020 by just playing a game & win prizes.
    Snapdeal winner name2020 also check the Snapdeal lucky draw2020

    ReplyDelete
  32. Wow it's miles genuinely extraordinary and extraordinary for that reason it's far very tons useful for me to recognize many principles and helped me lots.
    It is really explainable very well and i got greater statistics from your blog.

    click here formore info.

    ReplyDelete
  33. An outstanding share! I've just forwarded this onto a co-worker who has been doing a little homework on this. And he in fact bought me lunch due to the fact that I found it for him... lol. So allow me to reword this.... Thanks for the meal!! But yeah, thanks for spending time to discuss this issue here on your web site.

    Cloud tech

    ReplyDelete
  34. Having read this I believed it was extremely informative. I appreciate you taking the time and effort to put this information together. I once again find myself spending way too much time both reading and commenting. But so what, it was still worth it!

    ReplyDelete
  35. Its great post.Very easy to understand,got lot of information.Thanks for posting,keep updating.IT managers suggest to take Hadoop Admin Training in Bangalore because its best suited for them who have basic linux experience.

    ReplyDelete
  36. Snapdeal winner 2020 | Dear customer, you can complain here If you get to call and SMS regarding Snapdeal lucky draw, Mahindra xuv 500, lucky draw contest, contact us at to know the actual Snapdeal prize winners 2020.
    Snapdeal winner 2020
    Snapdeal lucky draw winner 2020
    Snapdeal lucky draw contest 2020
    snapdeal winner prizes 2020

    ReplyDelete
  37. Fantastic and helpful blog.
    Thanks for sharing with us,
    We are again come on your website,
    Thanks and good day,
    Please visit our site,
    buylogo

    ReplyDelete
  38. This comment has been removed by the author.

    ReplyDelete

  39. That is nice article from you , this is informative stuff . Hope more articles from you . I also want to share some information about red hat openstack training and tomcat tutorial

    ReplyDelete
  40. shopclues here thought of an Offer where you can win exceptional shopclues prize by simply playing a game and win prizes Call @7439295069
    Shopclues winner 2020
    Shopclues lucky draw winner 2020
    Shopclues lucky draw contest 2020

    ReplyDelete
  41. This comment has been removed by the author.

    ReplyDelete
  42. It's really a nice and useful piece of information about Data Science. I'm satisfied that you shared this helpful information with us.Please keep us informed like this. Thank you for sharing.

    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  43. Thanks for sharing such a good content with your blogs. I really enjoying your blog while reading. if you need any kind of information CONNECT inkjet printer support number
    inkjet brother printer customer service
    brotehr inkjet printer support

    ReplyDelete


  44. Thanks for sharing such a good content with your blogs. I really enjoying your blog while reading. if you need any kind of information CONNECT printer support number
    brother printer customer service
    brotehr printer drivers

    ReplyDelete
  45. thanks for sharing with us your great blog.As the most reputed website designers in Chennai, our work is always elegant & has a visual story to it. Our team comprises the best website designers in India.


    digital marketing agencies in chennai | best web developers and designers in chennai | best website designing companies in chennai | | Website designers in chennai | Best logo designers in chennai

    ReplyDelete
  46. Watch your favorite live sports, news, entertainment, and more. Plus, get unlimited access to the entire Roku streaming library To activate Roku code go to URL if you need help to activate Roku.
    roku com link
    Roku com link activation
    roku.com/link not working
    Enter link code
    Roku activation link

    ReplyDelete
  47. Very interesting blog Thank you for sharing such a nice and interesting blog and really very helpful article.

    Dell Boomi Training in Bangalore

    Best Dell Boomi Training Institutes in Bangalore

    ReplyDelete
  48. Really it was read so interesting. They are nice article shared. I likes your post. Are you Looking for real active followers for instagram profile, i would also suggest best website to Buy instagram followers India

    ReplyDelete
  49. Helpful post you wrote, I would appreciate for this valuable article and info.
    Buy Real Instagram Followers Paytm and Paypal If you need social media active and trusted services from any of coutnries.

    ReplyDelete
  50. Rash from Grover's Disease can be extraordinarily irritated. Natural Treatment decrease itching ordinarily start with high-power steroid creams, for example, triamcinolone or clobetasol, beside with antihistamines. Natural Remedies for Grover's Disease provides the relief from skin disorders. It helps to reducing rashes from skin that occur from Grover’s Disease.

    ReplyDelete
  51. Hello, too, INDIGITALL, it has been developed with the latest technology to guarantee maximum effectiveness and simplify the process of creating and sending Notifications with an animated image, Segmented, Geolocated and many more functions, it's great. Here you can see the simple installation for your platform
    https://docs.indigitall.com/

    ReplyDelete
  52. Really, this article is truly one of the best, information shared was valuable and resourceful Very good work thank you.
    tally training in chennai

    hadoop training in chennai

    sap training in chennai

    oracle training in chennai

    angular js training in chennai

    ReplyDelete
  53. Nice post!

    Worried About QuickBooks Error ?Get in touch with QuickBooks expert for instant solution.
    Click Here to know how to fix QuickBooks Form 941 Error

    Dial on QuickBooks Error Support Phone Number +1-855-977-7463.

    ReplyDelete
  54. Nice Blog !
    At times, while filing form 941, you may face QuickBooks Form 941 Error when the total sum of the tax amount exceeds $2500. To fix such issue, you must contact our experts via QuickBooks Support Number and get permanent ways to solve QuickBooks problems.

    ReplyDelete
  55. Very Informative and useful... Keep it up the great work. I really appreciate your post.
    Primavera Course in Chennai | primavera online training

    ReplyDelete
  56. Hello Beautiful people?
    I think you are looking perfect logo design for your company right?
    Buy a logo 5O% off. Custom Logo

    ReplyDelete
  57. Hey everyone.
    We are giving you the big best offer buy logo design for your business with 75% off I expect You will be happy with us.Logo Designer

    ReplyDelete
  58. Fantastic blog i have never ever read this type of amazing information.Mr Robot Jacket

    ReplyDelete
  59. This is awesome, thank you for the share. Also, if you are visit our website if you are looking for assistance with your nursing assignment:

    Nursing Assignment Help

    ReplyDelete
  60. wooow, amazing artcle friend, i am waiting for next articles, this is very best articles i had seen in google seo expert in dubai

    ReplyDelete
  61. Great Article. Thank you for providing such a unique and valuable information to your readers. I really appreciate your work.

    PTE Coaching in Ambala
    IELTS Institute in Ambala City
    Best IELTS Coaching in Ambala
    Spouse Visa consultants in Ambala

    ReplyDelete
  62. Fantastic blog i have never ever read this type of amazing information. 4th Hokage Cloak

    ReplyDelete
  63. I really enjoyed reading your articles. It looks like you’ve spent a lot of time and effort on your blog. bella swan jacket

    ReplyDelete
  64. That's amazing informative post, I want to add one more thing, If you want to make your web visitor to your subscriber then you should definitely check gravitec lifetime deal

    ReplyDelete
  65. Digital Marketing Institute
    IFDA is India's No 1 Digital Marketing Institute in Kalkaji and Delhi
    IFDA Offer's Wide Range of Professional Courses
    IFDA has Limited Batches

    ReplyDelete
  66. wordpress design agency in united states Need professional WordPress Web Design Services? We're experts in developing attractive mobile-friendly WordPress websites for businesses. Contact us today!

    ReplyDelete
  67. With Infycle Technologies' Oracle Training in Chennai, find the doorway to a prosperous IT profession. Become an industry-ready specialist by unlocking the potential of Oracle database management. Our extensive course ensures you're prepared for challenges in the real world by covering everything from fundamentals to advanced issues. Learn practical skills, gain market insights, and discover a promising future in Oracle technology. Give us a call at +91-7502633633 or +91-7504633633 to learn more.

    ReplyDelete