最近做的项目涉及到Push,关于Push的配置网上的资料很多了,按照资料一步步做就可以了,这篇文章记录的是用来测Push的一个小项目叫Pushmebaby,git上可以很容易地找到这个项目,不过这个项目用起来还是有一些坑的,下面我就讲讲我遇到的那些坑,希望可以避免。
PushMeBaby下载下来是这样的:
(https://img-blog.youkuaiyun.com/20150720143138640)
导入你项目的.cer文件,ApplicationDelegate.m文件中deviceToken改成你需要接受消息的设备的DeviceToken,
self.certificate = [[NSBundle mainBundle] pathForResource:@"apns" ofType:@"cer"];改成你cer文件的名字。
坑一,你代码中可能拿不到.cer文件,那是你导入的不对,通过在项目上右击选择add File是肯定可以拿到文件的,这个是小坑,像我这样的菜鸟才会踩;
坑二,你通过git下面下下来的代码所有的配置都是针对developer版本的,如果你是要测distribution版本,需要在代码中改两个配置
// result = MakeServerConnection(“gateway.sandbox.push.apple.com”, 2195, &socket, &peer);NSLog(@”MakeServerConnection(): %d”, result);
result = MakeServerConnection("gateway.push.apple.com", 2195, &socket, &peer);
// result = SSLSetPeerDomainName(context, "gateway.sandbox.push.apple.com", 30); NSLog(@"SSLSetPeerDomainName(): %d", result);
result = SSLSetPeerDomainName(context, "gateway.push.apple.com", 22);
NSLog(@"SSLSetPeerDomainName(): %d", result);
加注释符的是sandbox版本也就是developer版本,不加注释符的是distribution版本,总共改两个地方。
坑三,也就是困扰我时间最长的,连接成功,log打出来应该是都返回0,如下:
2015-07-20 15:02:05.588 PushMeBaby[1416:165461] MakeServerConnection(): 0
2015-07-20 15:02:05.589 PushMeBaby[1416:165461] SSLNewContext(): 0
2015-07-20 15:02:05.589 PushMeBaby[1416:165461] SSLSetIOFuncs(): 0
2015-07-20 15:02:05.590 PushMeBaby[1416:165461] SSLSetConnection(): 0
2015-07-20 15:02:05.590 PushMeBaby[1416:165461] SSLSetPeerDomainName(): 0
2015-07-20 15:02:05.590 PushMeBaby[1416:165461] SecKeychainOpen(): 0
2015-07-20 15:02:05.599 PushMeBaby[1416:165461] SecIdentityCreateWithCertificate(): 0
2015-07-20 15:02:05.599 PushMeBaby[1416:165461] SSLSetCertificate(): 0
可是SecIdentityCreateWithCertificate(): 0这部拿到的identity一直为nil,返回报错为SecIdentityCreateWithCertificate(): -25300,这个多半是因为证书不是你这太电脑申请的,.cer文件别人传你以后,你直接双击,没有生成私钥,你可以打开你的keychain,装的证书左边没有一个可以点开的小三角,就说明有问题
解决方法是跟申请证书的人要私钥,.p12文件,然后在keychain-钥匙串-登录中导入这个.p12文件,不会导入的请自行google。导入以后证书中就有小三角了,再运行pushmebaby,能收到push消息了。
以上就是我运用PushMeBaby遇到的三个坑,其他问题大家留言补充哈。