• PHP实现IOS消息推送

    2017-09-08 20:08:34
    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下:       iOS消息推送的工作机制可以简单的用下图来概括:   Provider是指某个...

    原文地址:http://zxs19861202.iteye.com/blog/1532460


    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下:

     

     

     

    iOS消息推送的工作机制可以简单的用下图来概括:


     

    Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。

     

    上图可以分为三个阶段:

    第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 

    第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。 

    第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

     

    从上图我们可以看到:

    1、应用程序注册消息推送。

    2、iOS从APNS Server获取device token,应用程序接收device token。

    3、应用程序将device token发送给PUSH服务端程序。

    4、服务端程序向APNS服务发送消息。

    5、APNS服务将消息发送给iPhone应用程序。

     

    无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。

     

    下面我介绍一下几种用到的证书。

     

    一、CSR文件

     

    1、生成Certificate Signing Request(CSR)


     

    2、填写你的邮箱和常用名称,并选择保存到硬盘。


     

    点击继续:


     

    这样就在本地生成了一个Push.certSigningRequest文件。

     

    二、p12文件

     

    1、导出密钥。



     

    2、输入你的密码。

     

     

    这样就生成了一个Push.p12文件。

     

    三、SSL certificate文件

     

    1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:


     

    2、点击右侧的Configure:


     

    3、点击Development Push SSL Certificate一行后的Configure:

     

     

    4、点击Continue:


     

    5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:


     

    6、点击Continue:


     

     

    7、点击Download,并将文件命名为aps_developer_identity.cer。

     

    8、点击Done,你会发现状态变成了Enabled:


     

     

    到现在为止,我们已经生成了三个文件:

    1、Push.certSigningRequest

    2、Push.p12

    3、aps_developer_identity.cer

     

    双击aps_developer_dientity.cer 注册到你的钥匙串中,这样你的钥匙串中就会有


    二、准备profile证书,因为推送消息只能再真机上测试,所以要建一个profile证书



    点击"new profile"为上面新建的APP ID建个profile ,成功之后下载*_Dev_Profile.mobileprovision

    双击将其加入到xcode 的Provisioning Profiles 中,这里有一点要注意,再将这个加入xcode之前如果之前已经加入过一定要把之前加入的删掉,如果有多个的话会出错。

     

    三、工程代码

    到这里证书已经准备完毕,接下来,我们在xcode中新建一个测试工程,注意设置工程的Bundle Identifier必须与上面建的APP ID 里的相同


    在didFinishLaunchingWithOptions 中加入一下代码

     

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    {

     

    [self.window makeKeyAndVisible];

        [[UIApplication sharedApplicationregisterForRemoteNotificationTypesUIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];

        return YES;

     

    }

     

     

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {


        NSLog(@"regisger success:%@", pToken);

        

        //注册成功,deviceToken保存到应用服务器数据库中

        

    }


     

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

        // 处理推送消息

        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"通知" message:@"我的信息" delegate:selfcancelButtonTitle:@"取消" otherButtonTitles:nilnil];

        [alert show];

        [alert release];

    NSLog(@"%@", userInfo);

    }


    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

        NSLog(@"Regist fail%@",error); 

        

      

    }

     

    到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone 的deviceToken,

     

    My token is:

    <740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>

     

    四、在应用服务器采用php的方式将消息推送给APNS,

    1、php连接APNS也是需要证书的,还记得我们上面获得的几个证书吗?打开终端,对上面的证书做如下处理,

    cd  进入证书所在目录

     

    把.cer文件转换成.pem文件:

    $ openssl x509 -in aps_developer_identity.cer -inform der

    -out PushChatCert.pem

    把私钥Push.p12文件转换成.pem文件:

    $ openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12

    Enter Import Password:

    MAC verified OK

    Enter PEM pass phrase:

    Verifying – Enter PEM pass phrase:

    你首先需要为.p12文件输入passphrase密码短语,这样OpenSSL可以读它。然后你需要键入一个新的密码短语来加密PEM文件。还是使用”pushchat”来作为PEM的密码短语。你需要选择一些更安全的密码短语。

    注意:如果你没有键入一个PEM passphrase,OpenSSL将不会返回一个错误信息,但是产生的.pem文件里面将不会含有私钥。

    最后。把私钥和证书整合到一个.pem文件里:

    $ cat PushChatCert.pem PushChatKey.pem > ck.pem

    为了测试证书是否工作,执行下面的命令

    $ telnet gateway.sandbox.push.apple.com 2195

    Trying 17.172.232.226…

    Connected to gateway.sandbox.push-apple.com.akadns.net.

    Escape character is ‘^]’.

    它将尝试发送一个规则的,不加密的连接到APNS服务。如果你看到上面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C 关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口。

    然后再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:

    $ openssl s_client -connect gateway.sandbox.push.apple.com:2195

    -cert PushChatCert.pem -key PushChatKey.pem

    Enter pass phrase for PushChatKey.pem:

    你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果在建立连接时有问题,OpenSSL将会给你一个错误消息,

    ck.pem文件就是我们需要得到php连接APNS 的文件,将ck.pem和push.php放入同一目录上传到服务器,push.php的代码如下:

     

    <?php


    // 这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格

    $deviceToken = '740f4707bebcf74f 9b7c25d4 8e3358945f6aa01da5ddb387462c7eaf 61bb78ad';


    // Put your private key's passphrase here:

    $passphrase = 'abc123456';


    // Put your alert message here:

    $message = 'My first push test!';


    ////////////////////////////////////////////////////////////////////////////////


    $ctx = stream_context_create();

    stream_context_set_option($ctx, 'ssl''local_cert''ck.pem');

    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, 60, //STREAM_CLIENT_CONNECT, $ctx);

    //这个是沙盒测试地址,发布到appstore后记得修改哦

    $fp = stream_socket_client(

    'ssl://gateway.sandbox.push.apple.com:2195', $err,

    $errstr, 60, 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,

    'sound' => 'default'

    );


    // Encode the payload as JSON

    $payload = json_encode($body);


    // Build the binary notification

    $msg = chr(0. pack('n'32. 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;

    else

    echo 'Message successfully delivered' . PHP_EOL;


    // Close the connection to the server

    fclose($fp);

    ?>


    接下来我们访问http://localhost/push/push.php


    iphone就会接收到一条推送消息了,如果有问题的话就检查上面的操作步骤,特别是加红的部分

     

    另外去除标记的方法为,在viewDidApper中加入

    int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;

        if(badge > 0)

        {

            badge--;

            [UIApplication sharedApplication].applicationIconBadgeNumber = badge;

        }

     

     

     

    给一个参考地址:http://article.ityran.com/archives/194

    展开全文
  • 上篇介绍了第三方“个推”推送消息到安卓客户端,本篇介绍IOS推送机制: IOS推送主要依赖于苹果的推送服务器(APNS),具体的推送过程可以分为以下三步: &lt;1&gt;我们的后端服务器发送苹果客户端...

    上篇介绍了第三方“个推”推送消息到安卓客户端,本篇介绍IOS的推送机制:

    IOS的推送主要依赖于苹果的推送服务器(APNS),具体的推送过程可以分为以下三步:

    <1>我们的后端服务器发送苹果客户端设备号和推送内容到APNS

    <2>APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

    <3> iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

    我们的客户端与苹果服务器之间和我们自己的服务器与苹果服务器之间都需要证书来进行链接。具体的证书的制作过程博主根据以下这篇博文操作,此处贴出原文链接:https://blog.csdn.net/showhilllee/article/details/8631734

    有了证书之后,具体的代码如下:

    public function sendIphoneNotice($token, $msg, $badge = 1, $production = TRUE){
                    
    	if(empty($token) || empty($msg)) return FALSE;
    
    	$pass    = "123456";
    	$pem_dir = "/var/www/webim/php-webim/notice/ck.pem";
    	$ssl_url = $production ? 'ssl://gateway.push.apple.com:2195' : 'ssl://gateway.sandbox.push.apple.com:2195';
    	//声音
    	$sound = 'Duck.wav';
    
    	$body['aps'] =[
    		'alert' => $msg,
    		'sound' => $sound,
    	    ];
    	if($badge > 0)
    	    $body['aps']['badge'] = $badge;
    
    	$payload = json_encode($body);
    
    	//ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址  
    	$ctx = stream_context_create();
    	stream_context_set_option($ctx, 'ssl', 'local_cert', $pem_dir);
    	stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
    	$fp = stream_socket_client($ssl_url, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    
    	if (!$fp) {
    	    print "Failed to connect $err $errstr\n";
    	    return FALSE;
    	}
    
    	// send message  
    	$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $token)) . pack("n",strlen($payload)) . $payload;
    	fwrite($fp, $msg);
    	fclose($fp);
    
    	return TRUE;
    
    }

    $token为设备号,$msg为消息内容

     

    展开全文
  • iOS推送&PHP后台

    2015-11-13 16:30:06
    iOS远程推送PHP最后台服务器进行推送推送机制: 1,PHP后台把要发送的消息、目的iPhone的标识打包,发给APNS(apple 推送服务器)。 2,APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的...

    转载自http://www.iashes.com/2015-11-942.html

    iOS远程推送,PHP最后台服务器进行推送。

    推送机制:

    1,PHP后台把要发送的消息、目的iPhone的标识打包,发给APNS(apple 推送服务器)。

    2,APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

    3,iPhone把发来的消息传递给相应的应用程序, 程序收到通知。

    流程:

    1,首先创建一个对应的APPID (Registering an App ID),这个和自己项目的Bundle Identifier要相符,不然推送会连接出错。对应了之后,选择服务的时候要勾选PUSH这个,标示这个项目要用到推送。

    id

    push

    2,创建开发者的开发证书,证书有开发证书和发布证书,(主要以开发为例,因为开发和发布的证书和配置文件是一样的)。创建的时候注意两点,第一点是选择开发者的推送通知服务,如图:

    cer

    第二点注意的是要选择自己刚刚创建的有push的那个appid,如图:

    id2

     

    然后上传自己从电脑里边导出的certSigningRequest文件,最后下载这个证书,双击进行安装。

    然后会发现自己电脑钥匙串的证书里边多了一个证书,如图:

    A7248EE5-9C47-42EA-806E-BE439F9D3A7A

     

    这个就是接下来自己推送用到的证书,最后创建配置文件:

    创建配置文件选择刚刚自己创建的appid,然后选择证书,select all就行,最后选择设备,也就是测试的手机或者touch等,也选择all,创建成功之后双击进行安装。这样就装到自己xcode里边了。

    配置后台流程:

    1,首先将自己刚刚下载安装的cer证书在钥匙串里边找到,然后右键,导出证书:

    046390C4-F3AF-4F21-A083-F179B50E8BB8

    导出之后输入一个密码,记住这个密码,后边用,导出之后是一个p12文件,保存起来,最好和刚刚下载的cer这个文件保存在一个文件夹下。

    然后打开终端,将cer文件和p12文件分别转换成pem文件: aps_development\ \(8\).cer是下载的证书文件。DevelopPushP12.p12是从钥匙串导出的p12证书。

    openssl x509 -in aps_development\ \(8\).cer -inform der -out pushDeveCerTopem.pem

    openssl pkcs12 -nocerts -out pushDeveP12Topem.pem -in DevelopPushP12.p12

    第二次会出现输入密码的界面,就是刚自己导入时候设置的密码,然后会让输入四个字符的新的pem的密码,记住就行了。

    然后会看见有两个pem的文件,然后将两个pem文件合并成一个pem文件,也就是将刚刚生成的两个pem合并了:

    cat pushDeveCerTopem.pem pushDeveP12Topem.pem > sum.pem

    接下来可以测试一下苹果的ssl服务的,也就是APNS的测试服务器:

    openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert pushDeveCerTopem.pem -key pushDeveP12Topem.pem

    如果出现图中的字样,那么说明配置成功了:

    40B0D9D8-8345-4582-9FBF-3F74FD3AC6CA

    然后进入xcode,记住自己的Bundle Identifier必须和刚刚申请的appid里边的Bundle Identifier匹配,然后选择xcode中这个项目是接收通知的:

    4D6F4269-BCB0-434A-BAF5-B22016971379

    然后appdelegate里边:

    服务器:

    将刚刚合成的pem文件和自己要运行的php文件放在同一个文件夹下,服务器代码:

    然后真机选择在code sign里边选择自己的配置文件,证书不用选择,xcode会自动匹配:

    846E6EE0-425E-401A-9E43-B951CD38CAA5

    运行自己的app,然后打开终端,进入自己后台服务器的文件夹,运行php文件:

    php push.php

    如果运行上边服务器的代码,出现Connection OK的字样,说明后台没问题,然后再看看前台时候收到通知。

    我这边是接收到了:

    IMG_0304

    最后看看要注意的几点:

    1,每次的设备号获取之后不能自己在后台手动输入,而是获取之后通过http请求,将设备号发送给服务器,然后让服务器来推,所以项目中获取设备号之后:

    2,小红点问题和跳转问题。当用户进入界面之后,用户离开后台之后小红点的处理。 跳转到指定页面的处理,服务器传来数据,通过客户端判断进行操作,不一一列举。

    3,ios 的推送消息有256个字符长度限制;超出范围不能发送 ,且失败。

    4,PHP运行的服务器如果没有开通sll模块,不管是apache,还是iis,都要开启这三个模块:

    mod_include
    mod_cgi
    mod_expires

    5,php文件在终端中打开,别再浏览器中打开,因为ssl模块不属于服务器的http模块,不开启服务也能推送,这是我试验过的。

     6,服务器可以通过不同的身份推送不同的消息给客户端,取决于服务器要什么参数和客户端传什么参数。

    7,ios8的注册方法可以这么判断:

    8,didFinishLaunchingWithOptions里边的配置应该有点多,不是这么写的应该是,改天改改。ios8步骤就是注册设置,然后注册,这么个流程。

    9,推送就是实时通讯。



    展开全文
  • phpios的本地推送

    2016-04-26 16:33:40
    手机推送信息类 @author:wtt */ class Push{ private $deviceToken; private $message; function __construct($deviceToken,$message){ $this->deviceToken = $deviceToken; $this->message = $message;
    <?php
    /**
    手机推送信息类
    @author:wtt
    */
    class Push{
    	private $deviceToken;
    	private $message;
    	function __construct($deviceToken,$message){ 
    		$this->deviceToken = $deviceToken; 
    		$this->message = $message; 
    	}
    	public function push(){
    		//ck.pem通关密码  
    		$pass = '123456';     
    		//消息内容    
    		$sound = 'Duck.wav';  
    		//建设的通知有效载荷(即通知包含的一些信息)  
    		$body = array();  
    		$body['aps'] = array('alert' => $this->message);  
    		static $badge=1;
    		$body['aps']['badge'] = /* $badge +=  */1;  
    		if ($sound)  
    		  $body['aps']['sound'] = $sound;  
    		//把数组数据转换为json数据  
    		$payload = json_encode($body);  
    		//echo strlen($payload),"\r\n";   
    		//下边的写法就是死写法了,一般不需要修改,  
    		//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址  
    		$ctx = stream_context_create();  
    		stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');    
    		stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);  
    		$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
    		if (!$fp) {  
    			//print "Failed to connect {$err} {$errstr}\n";  
    			return;  
    		}  
    		else {  
    		  // print "Connection OK\n<br/>";  
    		}  
    		// send message  
    		$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $this->deviceToken)) . pack("n",strlen($payload)) . $payload;  
    		//print "Sending message :" . $payload . "\n";    
    		fwrite($fp, $msg, strlen($msg));
    		fclose($fp);
      	}
    } 

    要注意的地方:

                1、deviceToken   ios给的手机token

                2、pass   ios给的证书的密码

                3、ck.pem    ios给的证书,先放到指定的文件夹里,调用的地址要写对。

    在项目中我遇到了一个问题是每次程序压后台的时候,总是会推送两条,但是其实只是发送了一条,找了很久的问题一直以为代码错了,后来才发现是ios配的证书有问题,如果出现同样的问题可以重新配一次证书试试。

    展开全文
  • 今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:...

    好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适

    第一部分

    首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。

    Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。

    接下来再看一张解释图:


    根据上图的逻辑我来给大家解释一下:

    1.你的IOS应用需要去注册APNS消息推送功能。

    2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)

    3.将应用收到的device Token传给你本地的Push服务器。

    4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服

    5.APNS再将消息推送给目的iphone


    第二部分

    1.从证书颁发机构颁发证书

    打开你mac的钥匙串访问: 然后点击钥匙串访问


    随后它会弹出一个窗口用户电子邮件信息就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选

    项,点击继续,显示如下:



    点击存储,文件名为:CertificateSigningRequest.certSigningRequest 随后将他放在一个文件夹中我们取名push吧!


    第三部分

    访问苹果开发者网址:https://developer.apple.com/


    选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。

    点击红色所选部分内容进行下一步的操作。


    选择Certificates选项,设置证书,如图所示先解释一下:

     


    Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则是用来发布产品使用的,名称很陌生是不是,之

    前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人理解吧(字面上解释就是产品么)。两个选项生

    成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:选择Development选项:



    点击上面的加号选项,



    选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue



    这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue



    这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成:


    点击下载,得到aps_development .cer,保存到push文件中去。


    第四部分

    新建一个AppID,选择网页上的AppIDs,然后点击右上角的 “加号



    App的取名只要按照苹果要求的就可以了



    然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。



    接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。


    最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。


    第五部分:生成Provisioning Profiles

    这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。


    创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号


    会进入选择何种配置概要文件的界面:



    我们现在时测试,所以选择“IOS App Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及

    “Ad hoc”,你可以根据下面的描述选择你发布所需的选项。点击Continue进入下一步。


    选择你上一步创建的AppID,点击Continue 进行下一步


    选择你的开发者账号,Continue进行下一步


    在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加

    进去也是非常简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查

    看到)以及name( 可以随便取,自己看的懂就行)然后Register一下,照着流程走到最后一步就完成了。

    好咱们继续回到上面的Provisioning Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,



    输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下

    载按钮让你下载这个文件,我们把它下载下来放在Push文件夹中。


    第六部分

    好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)

    首先双击我们生成的 “aps_development .cer” 文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名



    我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。

    然后右击导出,会弹出如下所示的图。



    将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123

    现在push文件夹中应该有几个文件“aps_development .cer” ,"push.p12",“CertificateSigningRequest.certSigningRequest”以及

    刚才下下来的配置概要文件。


    接下来我们打开终端将他们生成.pem文件

    1.把aps_development .cer文件生成.pcm文件,cd到push文件夹下



    2.把push.p12文件生成为.pem文件


    上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。

    这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。


    3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,



    在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了


    接下来就要测试一下啦,是不是很激动~

    为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox.push.apple.com 2195”来检测一下,如果显示下图则表示成功了。



    然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器

    在终端输入如下命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

    需要输入密码(abc123 我们刚才所设置的)。

    然后他会返回一系列的数据,这里我就粘贴一部分啦:


    CONNECTED(00000003)

    depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C

    verify error:num=20:unable to get local issuer certificate

    verify return:0

    ---

    Certificate chain

    。。。。。(省略)

    。。。。。(省略)

    。。。。。(省略)

        Start Time: 1416389389

        Timeout   : 300 (sec)

        Verify return code: 0 (ok)

    ---

    测试就到这里啦。。。


    第七部分

    1.建立推送项目

    //
    //  AppDelegate.m
    //  TestPushNotifiy
    //
    //  Created by silicon on 14-10-30.
    //  Copyright (c) 2014年 silicon. All rights reserved.
    //
    
    #import "AppDelegate.h"
    
    @implementation AppDelegate
    @synthesize mainView = _mainView;
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }
        
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        
        self.mainView = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        self.window.rootViewController = self.mainView;
        return YES;
    }
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }
    
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application
    {
        // 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.
        // 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.
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        // 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. 
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        // 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.
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        // 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.
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application
    {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    
    @end
    

    在appdelegate.m中加入以上代码,

    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }

    由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。

    函数:

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }


    会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }

    这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }

    当注册失败时,触发此函数。



    2.PHP服务端

    将simplepush.php这个推送脚本也放在push文件夹中

    <?php
    
    // ??????????deviceToken???????????????
    $deviceToken = 'c95f661371b085e2517b4c12cc76293522775e5fd9bb1dea17dd80fe85583b41';
    
    // Put your private key's passphrase here:
    $passphrase = 'abc123';
    
    // Put your alert message here:
    $message = 'My first push test!';
    
    ////////////////////////////////////////////////////////////////////////////////
    
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    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, 60, //STREAM_CLIENT_CONNECT, $ctx);
    //?????????????appstore??????
    $fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, 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,
    'sound' => 'default'
    );
    
    // Encode the payload as JSON
    $payload = json_encode($body);
    
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . 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;
    else
    echo 'Message successfully delivered' . PHP_EOL;
    
    // Close the connection to the server
    fclose($fp);
    ?>

    deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码。

    此刻就是见证奇迹的时候了,使用终端进入到push文件夹,在终端输入 php simplepush.php



    若显示以上提示则表示推送成功了。附上一张成功图。



    推送就到这边吧!

    感谢这篇博客的指导:http://blog.csdn.net/showhilllee/article/details/8631734


    simplepush.php以及XCode工程我会上传到我的资源里去,大家可以去那边下载。有什么不明白的地方大家可以留言或者私信我,我会第一之间回复的~



    大家可以关注我的微信公众号与我互动,相关问题也可以直接用公众号联系我:












    展开全文
  • ios 推送丢失问题

    2014-09-24 10:35:29
    在采用app推送后,一度为了追求最大的推送消息量,而将ios推送的一次推送值设为500条,在使用一段时间,发现ios测试机接受到的推送消息时断时续。 例如: 服务端每天08:00 至 13:00 推送给每台装了app的ios...
  • PHP iOS推送通知[关闭]

    2019-11-20 09:24:12
    <p>I would create a web application that sends push-notifications to my iPhone when a person filled in a form. How can I send that notification through PHP to my iPhone? </div>
  • iOS开发生成PHP推送的pem证书
  •  准备好推送证书aps_development.cer及其p12文件aps_development.p12 开始:  假设p12文件密码是:123456    终端操作:进入到存放cer与p12文件的文件夹    1.利用aps_development.cer文件生成.pem文件  ...
  • 1.- 在开发者中心下载推送证书,起个简单的名字 “pushDisCer.cer”,2.- 从钥匙串里选中推送证书,生成P12文件。输入文件的密码。 3.- 打开终端,进入文件所在目录. 把.cer文件生成.pem文件。输入代码openssl x...
  • PHP实现IOS推送

    2019-06-14 13:04:34
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 为什么phpios推送的服务器的时候,后台运行的时候会推送两条信息?但是手机关掉屏幕推送的时候就正常了~ 就只有后台运行的时候是两条?? 怎么改呢? 下面是代码 ``` /** 手机推送信息类 @author:wtt */ class ...
  • PHP代码发送IOS推送消息 PUSH IOS NOTIFICATION
  • iOS 推送证书的制作

    2014-12-15 17:19:52
    关于iOS推送证书的P12文件,并不是直接从KeyChain导出来的证书文件,而是需要经过openSSL工具制作的。(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,需要的证书是不同的,先说一下.Net框架开发的Server...
  • 以前写了一篇文章:iOS消息推送机制的实现,这篇文章中生成的是p12文件,但是php是用的pem文件,生成的方法和p12文件有些不同。   一、CSR文件   1、生成Certificate Signing Request(CSR) ...
  • 首先我们看一下苹果官方给出的对ios推送机制的解释。如下图   Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。 上图可以分为三个阶段: 第一阶段...
  • 推送消息是许多 IOS 应用都具备的功能,之前我们已经做了 IOS 推送消息的准备工作 -- 搭建 APNS 环境 ,到这里证书已经准备完毕, 在应用服务器采用php 的方式将消息推送给...
  • 打开钥匙串,选择需要生成的推送证书;分别将certificate和private key导出得到对应的.p12文件,证书->apns-dev-cert.p12,秘钥->apns-dev-key.p12;将apns-dev-cert.p12和apns-dev-key.p12文件对应转化为apns-dev-...
  • iOS推送证书转p12文件

    2020-05-06 13:58:33
    为了实现iOS推送,需要给服务器制作p12文件。创建证书的过程,就不写了,可以去网上自己查一下有很多。 我们就从证书下载安装到本地开始,进行描述。 1、下载cer文件aps_development.cer,安装到本地 2、导出p12...
1 2 3 4 5 ... 20
收藏数 7,465
精华内容 2,986
热门标签