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