iOS(iOS7 iOS6)推送教程(一步一步实现,简单易懂)

来源:互联网 发布:如何通过ip找到域名 编辑:程序博客网 时间:2024/04/29 23:40

纠结了很长时间,iOS的推送功能一直都弄不懂,也在网上看了好多大神们写的教程,现在终于弄出来了,赶快给像我一样的菜鸟们分享一下,写的有误的地方,还望大家多批评指正。

好了,废话不多说,直接开始正题:首先给大家介绍一下APNS的推送机制:

APNS的推送机制:

我们看一下苹果官方给出的对ios推送机制的解释。如下图:

从上图中我们可以看出,Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器。从中我们不难看出,苹果的推送服务可以分为三个阶段:

第一阶段:应用程序的服务器端把要发送的消息、目的设备(iPhone、iPad)的标识打包,发给APNS。

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

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

接下来说一下,APNS的详细工作流程:

APNS的详细工作流程:

下面这张图详细说明了APNS推送通知的详细工作流程:

根据上图详细说明下各数字详细说明:

1.我们自己的设备(iPhone、iPad)通过SSL连接向APNS注册自己的设备生成设备令牌(deviceToken) 

2.APNS会把生成的设备令牌(deviceToken)返回给我们的设备(iPhone、iPad)

3.应用程序接受设备令牌(deviceToken)

4.应用程序将设备令牌(deviceToken)发送给程序的push服务端程序。

完成以上流程,当应用程序的服务器有push消息要发送时,就会把对用的账号的设备令牌(device Token)和要发送的消息一起发送给APNS,而APNS再根据设备令牌(deviceToken)找到相应的设备(iPhone、iPad),并发送相应的push消息。

证书的创建

接下来我们来说最重要的部分,也就是证书的创建:

首先我们要准备一台苹果的设备,因为模拟器是不支持推送的,一台iPhone,iPad、iPod touch都可以。

一 CSR文件

首先我们要生成一个Certificate Signing Request(也就是CSR)的请求文件。在应用程序里面打开我们的钥匙串访问



点击完成后我们会在桌面上看到一个CertificateSigningRequest.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,我们会在钥匙串访问中生成一堆秘钥名称是我们刚才填写的常用名称。见下图所示:


二 下载开发证书和发布证书

由于开发证书和发布证书的创建流程基本一致,这里我们只创建开发证书。

首先我们先创建一个AppID,配置并下载SSL证书

点击右上方的“+”号新建一个AppID,如下图

Name我们在这填写“PushTest”,Bundle ID 这里我们填写“com.xianlang.PushTest”(这两项名字可以根据自己的喜好填写),接着勾选下面的“Push Notifications”选项,点击“Continue”出现:

点击“Submit”,接下来点击“Done”,这样AppID就创建好了,可是细心的朋友们会发现,当我们去点击我们刚创建的AppID时,我们发现Push Notifications一行的 “Development”和“Distribution”列上的Configurable是呈黄色的,这说明是不可用的,见下图


我们还需要去选择我们的CSR文件(大家还记得吧),我们点击“Edit”按钮

这里我们我们只创建开发证书,我们只需要选择上面一项即可,点击“Create Certificate...”按钮,接下来点击“Continue”按钮(这里就不截图给大家了),点击“Choose File...”按钮选择我们的CSR文件(也就是名字为CertificateSigningRequest.certSigningRequest的文件),我们来看一下选择过之后的截图:

点击“Generate”按钮

点击"Download"按钮下载下来放在桌面上,点击“Done”完成,我们会发现我们下载了一个名字叫“aps_development.cer”的文件,我们把它放到桌面上,然后双击打开(默认使用钥匙串打开)。

其次,我们区创建我们程序运行所需要的开发证书。

找到Certificates下面的Development项,如图


点击右上角的“+”号按钮,在出现的界面中选择 Development下的“iOS App Development”选项(这里不截图,相信大家能找到),点击“Continue”按钮,在出现的界面上继续点击“Continue”按钮,在出现的界面中点击“Choose File...”选择CSR文件,点击“Generate”按钮,在出现的界面上,点击“Done”按钮完成。

接下来,创建Provisioning Profiles 文件

同样点击右上角的“+”号按钮,在出现的界面上找到Development组下面的“iOS App Development”项选中,然后点击“Continue”按钮继续出现下面界面

选择我们所创建的App ID,点击“Continue”按钮继续,在接下来的界面上选择我们所要包含的certificates,选择后点击“Continue”按钮继续出现下面界面

选择我们所要测试用的设备(iPhone,iPad ,iPod touch),点击“Continue”按钮继续,在接下来的页面上填写Profile Name
,这里我就填写“PushTest Provision”,点击“Generate'”按钮继续,点击“Download”按钮下载下来,用xCode打开。

三 从钥匙串访问中导出秘钥

打开钥匙串访问,找到我们的专用秘钥(专用秘钥的名称就是我们在最开始生成CSR请求的时候填写的常用名)

右键单击,选择“导出。。”

点击“存储”按钮,输入密码,这里我输入“123”点击“好”按钮,出现让你输入你电脑的登录密码,输入密码后,点击“允许”按钮,在桌面上我们看到一个名为Push.p12的文件。

好了,到这里,我们桌面上一共生成了三个文件。一个是CSR请求文件,一个是aps_development .cer的SSL证书文件,还有一个刚才生成的Push.p12秘钥文件。接下来我们就要对这些文件进行处理

四 处理证书

打开我们的电脑终端,cd到桌面(cd desktop)

第一步: 把.cer的SSL证书转换为.pem文件,执行命令:

openssl x509 -in aps_development.cer -inform der -out PushTestCert.pem

在桌面上会生成一个PushTestCert.pem文件

第二步:把私钥Push.p12文件转化为.pem文件:

openssl pkcs12 -nocerts -out PushTestKey.pem -in Push.p12

这里需要我们输入密码,这个密码也就是我们导出p12文件时的密码,也就是我们上面设置的123。然后,需要我们对生成的pem文件设置一个密语,这里我们用123456,防止混乱(当然你也可以设置成别的更有意义的密语),这里的密语是要告诉我们服务器的。这样,桌面上会生成一个PushTestKey.pem的文件。

第三步:对生成的这两个pem文件再生成一个pem文件,来把证书和私钥整合到一个文件里:

cat PushTestCert.pem PushTestKey.pem > PushTest.pem

在桌面上,我们发现了一个PushTest.pem的文件,这样,我们的文件就制作完了。下面进入测试阶段

接下来的两个测试命令是在网上搜的,哈哈

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

telnet gateway.sandbox.push.apple.com 2195

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

 

下面我们要使用我们生成的SSL证书和私钥来设置一个安全的链接去链接苹果服务器:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushTestCert.pem -key PushTestKey.pem

执行完这一句命令后需要我们输入密语

Enter pass phrase for PushTestKey.pem:

我们输入123456按回车

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

 当你在最后的时候你看到这样说明你已经成功了:

CONNECTED(00000003)

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

verify error:num=20:unable to get local issuercertificate

verify return:0

---

Certificate chain

 0s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMSEngineering/CN=gateway.sandbox.push.apple.com

  i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated byreference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C

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

   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.netCertification Authority (2048)

---

Server certificate

-----BEGIN CERTIFICATE-----

MIIFGzCCBAOgAwIBAgIETBz90jANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC

……省略……

fMGbLqkGn8YogdPqe5T1

-----END CERTIFICATE-----

subject=/C=US/ST=California/L=Cupertino/O=AppleInc./OU=iTMS Engineering/CN=gateway.sandbox.push.apple.com

issuer=/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa isincorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust CertificationAuthority - L1C

---

No client certificate CA names sent

---

SSL handshake has read 2731 bytes and written 2165 bytes

---

New, TLSv1/SSLv3, Cipher is AES256-SHA

Server public key is 2048 bit

Secure Renegotiation IS supported

Compression: NONE

Expansion: NONE

SSL-Session:

    Protocol  : TLSv1

    Cipher    : AES256-SHA

    Session-ID:

    Session-ID-ctx:

    Master-Key:C7A47EED5E1F5……省略……369D4

    Key-Arg   : None

    Start Time:1361862882

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

---

五,项目测试

新建一个项目工程,在AppDelegate里面

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
   

  //推送的形式:标记,声音,提示

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


    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}


- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //注册成功得到deviceToken
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    NSLog(@"-----%@---", token);
}

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

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    // userInfo 就是push消息的Payload
    
    // 处理推送消息
    NSLog(@"userinfo:%@",userInfo);
    
    NSLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
}


六,测试推送

下面我们把php服务器代码和生成的PushTest.pem文件放在统一文件夹下面(这里我们还是统一放在桌面上)。

打开php服务器端的代码,把deviceToken改成我们现在要进行测试的i设备的deviceToken,密语改成我们设置的123456

最后打开终端执行命令:

php pushTest.php

回车,如果收到推送消息就说明我们成功了,哈哈

下面看一下效果


到这里,我们的推送就做完了!!!

六、APNS地址

测试地址:gateway.sandbox.push.apple.com:2195
发布地址: gateway.push.apple.com:2195

测试的地址用的是沙盒,发布地址是不同的。发布软件的时候记得改过来


当然,做的过程中也看了不少大牛的帖子,在这里推荐给大家

1,http://blog.csdn.net/showhilllee/article/details/8631734

2,http://www.iteye.com/topic/1130630

php服务器代码pushTest.php: http://download.csdn.net/detail/zcb1918/7514565



0 0
原创粉丝点击