C++连接apns向苹果手机的应用推送消息

yangyu19910407 2014-04-01 08:22:28
int initializeSSL()
{
char host[] = "gateway.sandbox.push.apple.com";
char token[] = "adc97f91 fbd886bd cd052c3b 89c9bf95 1b5be2eb b31bdd56 16d3165c 9d0569c4";
char payload[]= "{\"aps\":{\"alert\":\"kkkkkkk\",\"badge\":1,\"sound\":\"default\"},}";
char password[] = "123456";
int port = 2195;

int err;
SSL_library_init();
SSL_load_error_strings();
m_pmeth = SSLv23_method();
m_pctx = SSL_CTX_new(m_pmeth);
if( !m_pctx )
{
cout<<"Could not get SSL Context"<<endl;
return false;
}

if(SSL_CTX_load_verify_locations(m_pctx, NULL, CERTPATH) <= 0)
{
cout<<"Failed to set CA location"<<endl;
ERR_print_errors_fp(stderr);
return false;
}

if(SSL_CTX_use_certificate_file(m_pctx,CERTFILE,SSL_FILETYPE_PEM) <= 0)
{
cout<<"Cannot use Certificate File"<<endl;
ERR_print_errors_fp(stderr);
return false;
}

SSL_CTX_set_default_passwd_cb_userdata(m_pctx,password);

if (SSL_CTX_use_PrivateKey_file(m_pctx, CERTFILE, SSL_FILETYPE_PEM) <= 0)
{
cout<<"Cannot use Private Key"<<endl;
ERR_print_errors_fp(stderr);
return false;
}

if (!SSL_CTX_check_private_key(m_pctx))
{
cout<<"Private key does not match the certificate public key"<<endl;
return false;
}

m_sockfd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_sockfd == -1)
{
cout<<"Could not get Socket"<<endl;
return false;
}

memset (&m_server_addr, '\0', sizeof(m_server_addr));
m_server_addr.sin_family = AF_INET;
m_server_addr.sin_port = htons(port);
m_phost_info = gethostbyname(host);
if(m_phost_info)
{
struct in_addr *address = (struct in_addr*)m_phost_info->h_addr_list[0];
m_server_addr.sin_addr.s_addr = inet_addr(inet_ntoa(*address));

}
else
{
cout<<"Could not resolve hostname = "<<host<<endl;
return false;
}

err = connect(m_sockfd, (struct sockaddr*)&m_server_addr, sizeof(m_server_addr));
if(err == -1)
{
cout<<"Could not connect"<<endl;
return false;
}

m_pssl = SSL_new(m_pctx);
if(!m_pssl)
{
cout<<"Could not get SSL Socket"<<endl;
return false;
}

SSL_set_fd(m_pssl, m_sockfd);

err = SSL_connect(m_pssl);
if(err == -1)
{
cout<<"Could not connect to SSL Server"<<endl;
return false;
}
int ret = pushMessage(token, payload);
cout<<"push ret["<<ret<<"]"<<endl;
}

int pushMessage(const char * token, const char * payload)

char tokenBytes[32];
char message[293];
unsigned long msgLength;

token2Bytes( token, tokenBytes );
unsigned char command = 0;
unsigned short payloadLength = strlen( payload );
char * pointer = message;
unsigned short networkTokenLength = htons( (unsigned short)32 );
unsigned short networkPayloadLength = htons( (unsigned short)payloadLength );
memcpy(pointer, &command, sizeof(unsigned char));
pointer += sizeof(unsigned char);
memcpy(pointer, &networkTokenLength, sizeof(unsigned short));
pointer += sizeof(unsigned short);
memcpy(pointer, tokenBytes, sizeof(tokenBytes));
pointer += 32;
memcpy(pointer, &networkPayloadLength, sizeof(unsigned short));
pointer += sizeof(unsigned short);
memcpy(pointer, payload, payloadLength);
pointer += payloadLength;
msgLength = pointer - message;
return SSL_write( m_pssl, message, (int)msgLength );


以上代码是部分C++去连接APNS然后推送消息到指定device token设备上,程序运行时SSL_connect()能成功,而且SSL_write()也能成功。运行结果为:push ret[93];但手机应用端就是收不到,求救!
...全文
1139 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nhs0311 2015-08-08
  • 打赏
  • 举报
回复
贴主: 我开发也遇到这个问题了。 但是我用开发证书没有问题, 用发布证书和你效果一样, 困扰好久了, 希望解决!
stinkingstone 2014-11-21
  • 打赏
  • 举报
回复
楼上的,能否把你的相关代码贴出来,供参考一下,谢谢, token2Bytes( token, tokenBytes );有代码吗?

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧