iOS推送所有流程(不使用第三方库)

一、配置证书AppID等各种所需文件

一、在开发者中心

1、首先需要进入开发者中心,点击进入Member Center页面,再进入Certificates,identifiers&Profiles页面,在iOS Apps这四个随便点个进去 就到这个页面了。

















2.开始配置各种文件。首先需要配置个AppID, 点击identifiers IDS会看到这里面已有的AppID,我这里新建一个ID点击右上角加号创建新的 1的红色圈子里名字随便填(建议和BundleID一样), 2里面的内容必须是要推送工程里的bundleID一样,这里之所以不选wild card AppID是因为要在这里勾选Push服务



wild card AppID是是配一组App,但是可以选开通功能少所以选择上面那个。然后一直点击继续就好了。这里会出现你刚建的AppID。
















AppID是第一个东西,接着配第二个推送证书。 点击certificates里面任意选项,点击页面的左上角加号选择Development里App Push 那一项,正式发布的话需要选Production里面的App Push一项。















一直点继续,这里选择之前配好的AppID,一直点继续
这里需要写个证书的请求文件,步骤打开钥匙串,左上角钥匙串访问->证书助理->从证书颁发机构请求证书

邮箱填写开发者账号的邮箱,常用名称可随意写但是要记住,需要要用来生成pem文件,CA电子邮件可随意,但下面必须选存储到磁盘
最后在开发者中心还需生成一个描述文件,点击。重复之前生成AppID和证书的步骤,选择之前的AppID和已有的开发证书(并不是推送证书,推送证书是通过AppID相关联,在终端还需作处理)。
这样在开发者中心一共生成三个东西,推送证书,AppID,和描述文件(开发者帐号不算)。

二、在工程里

1. 在AppDelegate.m file的"didFinishLaunchingWithOptions"方法里,添加下列代码(用于注册推送通知):
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:  
 (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];  

2. 在AppDelegate.m file里添加下列2个methods (用来handle register remote notification with device token和register error的events

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

{ //对接受到的token进行处理

	 NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]	
	stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString:@" "
	withString: @""];
    NSLog(@"%@",token);
}

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error  
{  
    NSLog(@"Failed to get token, error: %@", error);  
}  

3.到这一步运行App会在设备上看到一个popup window (该窗口只会出现一次,重装app不会再出现),问你是否同意给你发送通知,如果选择了OK,那么在"Setting > Notifications“里会有你的app在list里。而且这时你的Xcode output console会显示你的device token。

***我做的时候因为描述文件的AppID和证书的AppID不匹配导致注册推送失败收不到token。

三、在终端
打开钥匙串,点击密钥,可以看到之前在Appstore那些步骤完成后生成一个公私钥对,名字是生成证书请求文件的时候起的,导出他的跑p12
证书,需要输入两次密码,必须得记住,在服务端发送消息时需要用到,输入完密码后会需要你输入一次mac的密码允许导出p12,给这个证书起名PushDemoKey。
APNS Provider side在进行Push时候需要用到"cert + key"的文件,cert就是我们的推送证书,key就是刚才导出的私钥。

开始终端的操作:
1.在终端上到达cert和key所在的文件夹下(进入某个文件夹命令:cd XXXX),进行这个操作生成证书的pem文件
openssl x509 -in aps_development.cer -inform der -out PushDemoCert.pem
2.生刚才导出私钥p12证书对应的p12文件对应的pem文件,终端命令:
openssl pkcs12 -nocerts -out PushDemoKey.pem -in PushDemoKey.p12
3.合成1、2中生成pem文件,终端命令如下:
cat PushDemoCert.pem PushDemoKey.pem > PushDemoCK.pem

接下来检测(这个命令是检测 是否能够connect apple提供的不经加密( 即不需使用任何证书) 的APNS server ):
telnet  gateway.sandbox.push.apple.com 2195
如果看到这个

Trying 17.172.233.65...  
Connected to gateway.sandbox.push-apple.com.akadns.net.  
Escape character is '^]'.  
Press Ctrl+C to close the connection.
表示可以连接APNS 服务。
执行下列命令来测试是否能够connect apple提供的经加密( 需使用1和2生成的2个pem文件) 的APNS "sandbox“ 服务来开发
终端命令:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushDemoCert.pem -key PushDemoKey.pem
注:gateway.sandbox.push.apple.com:2195
是开发时的测试地址
执行完命令后需要输入之前设置的密码(在终端输入密码是看不到你输入的东西的好像没反应是的,在键盘上输完后,回车要是密码正确就会接下去执行)
执行完后,等待终端反应,如果在终端最下方能看到以下信息,并且能输入任意字符串就成功,错误会返回信息

SSL-Session:

    Protocol  : TLSv1

    Cipher    : AES256-SHA

    Session-ID: 

    Session-ID-ctx: 

    Master-Key: 18968F9A667641783E19D943726E3AF2DD91C77C3FDAB2AC445AA367DB8F2AC55C9BD5A209625B205744F9A42BACBBE3

    Key-Arg   : None

    Start Time: 1449196753

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

---

上面那些步骤完成后其实已经做完,但是需要测试可不可行

接下来的步骤写个简单的php服务端来进行测试

可以建个文本加入如下代码需要改一些东西代码的注释写着,改完后把文件后缀名改成php就可以了,接着在终端执行以下命令

php simplepush.php  

其中simplepush.php是自己文件的名字


//加入你自己设备的token,这个token只有苹果能得到和UDID是不一样的,在第二大步骤,在Appdelegate的

//- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken的方法里,运行设备会收到,把处理过的token放

//到这里来

$deviceToken = 'eff4f2c07724d0cae5d422e14bfe5502bd9b86f9384ee3a9a7754a765cffc920';

//把你自己的设置的密码替换进去:
$passphrase = 'dianju5678';

//你要推送的信息:
$message = '这是一个推送测试!';


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

//这里的'PushDemoCK.pem'替换成自己的CK.pem文件名

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'PushDemoCK.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);


// Open a connection to the APNS server
$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);


provider证书分为开发测试和产品两种版本,对应于两种APNs环境:
Sandbox(Development) :gateway.sandbox.push.apple.com: TCP 2195(开发的用)
Production(Distribution):gateway.push.apple.com: TCP 2195(上架用)
同 时,provision profile也对应了两个版本:Development和Distribution


这个只是研究了基本的流程,因为不是公司业务逻辑要求没做具体的单个人特定人接受推送消息等操作

遇到的问题

1:开始不知道推送怎么和工程相关连————推送证书通过AppID里面来关联,需要在AppID开通推送服务,联机调试的描述文件需要选和推送证书同一个AppID

2:有些第三方推送只需上传推送证书的p12文件,而则这需要私钥的p12文件,和推送证书————还是不太明白

3:php代码里$passphrase = 'dianju5678'这里的单引号我做的时候及时选对输入法还是会有错导致连接APNS Server 一直出错——————找了好久错误,白狗了。

4:没有深入去做,这方面的一些功能,以后有时间去做

在这记录下-------2015.12.04--------



你可能感兴趣的:(iOS推送所有流程(不使用第三方库))