I write a blog for the first time, write bad place everyone please forgive me.
This article mainly refers to the http://blog.csdn.net/showhilllee/article/details/8631734, thanks to Showhilllee detailed explanation. Because in the process of doing some of their own understanding and change, so you write again on the push of the detailed blog.
This article is divided into four parts:
I. EXPLANATION APNS remote PUSH
Second, configure the push certificate
Third, export the certificates that are available to your server
Iv. code implementation Device registration push, get push message
Okay, now we're going to start with a formal push.
First, an old picture, Apple very early to everyone, push the flowchart.
Although iOS updates many versions, this process of pushing has never changed. The push mechanism is: the first time the device application is opened to APNs (Apple push server) registration push, and get device token devicetoken-> app will send Devicetoken to their own push server or third-party push server to save Your own server or a third-party push server sends messages and Devicetoken bundles to the Apns->apns to send messages to the device, and the device displays push messages.
Devicetoken similar UUID, after the application of the first request Devicetoken, if the application does not remove the reinstallation Devicetoken is not changed, the app is removed and then reinstalled, and then registered remote push Devicetoken will change. So each application open should go to register push and request Devicetoken, the first time there will be prompted whether to push, select Push, you will receive the callback function in Devicetoken, the first time there will be some delay, and then open the application request Devicetoken seconds back.
Apple's APNs server is dedicated to push, divided into Test address and official address, all Apple push messages to go through APNs push communicated to the device, regardless of the test or formal. In fact, the principle of push is that the device will get the Devicetoken sent to their own server to save, their own server choose to save the Devicetoken and to push the message package sent to Apns,apns automatically pushed to the specified device. Third-party push in Apple push this is just a step in the middle of their own server and APNs, their servers send messages and device identities to third-party servers, third-party push and then the device to find Devicetoken, send messages to APNs.
Second, configure the push certificate
1. Open the local keychain, the top left corner keychain Access-"certificate assistant-" request a certificate from a certification authority
User e-mail address generally fill in the developer account mailbox, select Storage to disk, save on the desktop, the name does not change.
2, (1) Open the browser, login to Apple Developer, select the top navigation bar account, login
After entering the interface, select Certificates-development click on the upper right corner plus
Select the second option for development, Apple Dev Service certificate Apple Push Notification service SSL (APNs), click Continue
Here we need to choose an app ID, we do not tell where to build, assuming already have a, click Next continue
Click Choose File to select the native generated
Click Continue, download the generated Aps_development.cer file, and save a new push folder on the desktop.
(2) The following is the APP ID new, click Identifiers->app ids-> upper right corner plus
After entering this interface, name is set to the name of your project (optional), bundle ID to match the bundle ID in the project, select Explicit AppID is for the unique certificate, Wildcard app ID is a team certificate, do push without Wildcard app ID , select Explicit AppID.
Under this page, tick push notifications
Click on continues and click Register on this screen.
The next step is to fill out the app ID in the (1) section.
(3) Download. mobileprovision File Click the plus sign in the upper right corner of provisioning profiles-all-.
Because it's a development environment, choose Development's iOS app and publish your environment to choose distribution. Next Choose Appid,cer,devices, which is the "which application, which certificate, which device" logic.
Profile name can be used casually. Download the. mobileprovision file and put it in the new push folder that you just created.
Well, at this point, the certificates are all configured.
Iii. Configuring. P12 files and. pem files required by Windows Server
The. p12 file is a verification certificate required by the server push, and if you need to push it with a third party, you should first tell me how to generate the file.
1. First, double-click Install the. cer and. mobileprovision files that were generated in the previous section.
Open the keychain and locate the. cer certificate that you just installed, click-Right-"Export" * * * * * *, pop up this window
Name casually, in order to prevent accidental not in Chinese, save to just the new push folder, click on the storage pop up this window
This is the. p12 file needs to set an access password, enter the password, simple point on 123456, verify that the input again just entered 123456, click OK.
If you use a third-party push that export. p12 file is enough.
2. If you are building a push server or windows, you will need the. pem file, and we'll convert the. cer file and the newly generated. p12 file to a. pem file, respectively.
Open the terminal, type the CD and enter the path of the push folder into the Push folder
After you can tap the CD space, locate the push folder in the Finder, and press and hold the Blue folder icon of the circle push to drag it into the terminal to display the path directly.
(1) Enter command after entering the push folder: OpenSSL x509-in aps_development.cer-inform der-out Pushchatcert1.pem
This directive means that the downloaded Aps_development.cer certificate file is generated by the. Pem file called PushChatCert1, which is the. PEM filename, but you want to indicate that this is a. cer file conversion generation.
(2) Re-enter the command: OpenSSL pkcs12-nocerts-out pushchatkey.pem-in sharepush.p12, enter the P12 password and set the PEM password, in order to facilitate the installation of the same. This directive is to generate. pem files from the. p12 file, Pushechatkey.pem's name is random, ditto, and know that this is a. p12 file.
After entering the command, you need to enter the. P12 password, enter the password to set this. pem file for easy setup and the same password as. p12 file 123456
(3) synthesize a. pem file with the two. Pem files you just generated, instructions: Cat Pushchatcert1.pem Pushchatkey.pem > Ck.pem
Synthesizing a new. Pem file is called CK, which is a casual, self-remembering on the line.
(4) Next Test These two files connect Apple Test push server
Enter the test Connection directive: Telnet gateway.sandbox.push.apple.com 2195. Control+c Broken Connection
Enter the test notification directive: Notify OpenSSL S_client-connect Gateway.sandbox.push.apple.com:2195-cert pushchatcert1.pem-key PushChatKey.pem. Enter any character to cut off the connection
OK, so the environment and the certificate are all configured. Start tapping the code below.
Four, open Xcode, create a new project, this will not say, open the APPDELEGATE.M file
(1) in
-(BOOL) Application: (UIApplication *) application didfinishlaunchingwithoptions: (Nsdictionary *) launchoptions function Enter the following code to want to APNs registration push, the first line of code means that when the app opens, the app icon in the upper right corner of the message is empty.
The reason behind judging the device system version is that the function of the push notification has changed since iOS8.0.
[[uiapplication sharedapplication] Setapplicationiconbadgenumber:0 Span style= "color: #000000;" >]; if ([[[Uidevice Currentdevice] systemversion] Floatvalue]>=8.0 | Uiusernotificationtypealert | Uiusernotificationtypebadge) Categories:nil]; [[UIApplication sharedapplication] registerforremotenotifications]; else {[[UIApplication Sharedapplication] Registerforremotenotificationtypes:uiremotenotificationtypebadge | Uiremotenotificationtypealert| uiremotenotificationtypealert]; }
-(void ) Application: (UIApplication *) application Didregisterforremotenotificationswithdevicetoken: (nsdata *) devicetoken{ Span style= "color: #008000;" >// here handle Devicetoken, save your own server for Devicetoken or bundle it with other information }
-(void ) Application: (UIApplication *) application Didreceiveremotenotification: (nsdictionary *) userinfo{ // NSLog (@ "userinfo:%@", userinfo); // NSLog (@ "received push message:%@", [[UserInfo objectforkey:@ "APS"] objectforkey:@ "alert"]); NSString *message = [nsstring stringwithformat:@ " , [[UserInfo objectforkey:@" aps ]objectforkey:@" alert ]];}
-(void) Application: (UIApplication *) app Didfailtoregisterforremotenotificationswitherror: (Nserror *) Err { @ "Error:%@", err]; NSLog (@ " Get token failed: %@", str); }
The function of Didregisterforremotenotificationswithdevicetoken is to return Devicetoken after successful registration.
Didreceiveremotenotification This function is to get to the push message callback, the parameter userInfo is the message body, the type is the word typical, through [[UserInfo objectforkey:@ "APS"] objectforkey:@ "alert") is preferable to the specific message content.
Didfailtoregisterforremotenotificationswitherror This function is useful if the registration push fails the callback, you can do some processing.
This project also wrote the push code, the following simple write a php file, when the server to Apple push communicated a push, Devicetoken just after the project was executed after the Devicetoken received.
Five, PHP code
<?PHP// ?????????? Devicetoken???????????????$deviceToken ='write here to get to the Devicetoken';//Put your private key ' s passphrase here:$passphrase ='here to write the password of the Pem file before setting';//Put your alert message here:$message ='push test: Hellow world!';////////////////////////////////////////////////////////////////////////////////$ctx=stream_context_create (); Stream_context_set_option ($ctx,'SSL','Local_cert','here Write a PEM file name that was synthesized before two PEM files'); Stream_context_set_option ($ctx,'SSL','Passphrase', $passphrase);//Open A connection to the APNS server//?????????? //$fp = stream_socket_client (? SSL://gateway.push.apple.com:2195, $err, $errstr ,//Stream_client_connect, $ctx);//????????????? AppStore??????$FP =Stream_socket_client ('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, -, stream_client_connect|stream_client_persistent, $ctx);if(!$fp) Exit ("Failed to connect: $err $errstr" . PHP_EOL); Echo'Connected to APNS' . Php_eol;//Create the payload body$body ['APS'] =Array ('Alert'=$message,'badge'=1,' Sound'='default');//Encode the payload as JSON$payload =Json_encode ($body);//Build the binary notification$msg = Chr (0) . Pack'N', +) . Pack'h*', $deviceToken). Pack'N', strlen ($payload)). $payload;//Send It to the server$result =fwrite ($fp, $msg, strlen ($msg));if(!$result) echo'Message Not delivered' . Php_eol;ElseEcho'Message successfully delivered' . Php_eol;//Close The connection to the serverfclose ($fp);?>
Save the PHP file in the previously mentioned push folder, the name is called push.php.
Open the terminal, enter the Push folder, enter the command: PHP push.php, enter the execution.
Well, finally finished, the first time to write a blog too laborious, before saving the draft before opening the draft no picture, the picture has to be re-cut, and wrote half on the browser ' dead ', or re-write ... Well, just think of a way, first cut all the pictures, and then write a blog, so fortunately. In short, the writing is not good place everyone light spray AH ~
iOS remote push, from mechanism to implementation, as detailed as possible