苹果PNS(推送通知服务)示例代码
有没有一个示例项目展示如何在iPhone上使用APNS以及如何设置东西? 我目前正在查看文档,但是有一些工作代码可以分开查看它们是如何一起工作的呢?
我似乎无法find任何使用谷歌或在iPhone开发中心。
build立推送通知服务最糟糕的部分是提供。 我遇到的主要绊脚石是,从苹果网站下载的.cer文件中有一个证书和一个密钥,我用C#编写了一个系统服务,发出通知,连接失败,因为我导出了证书而不是关键。
我不记得最初是谁写的,这是python中的一小段代码,当我第一次testing通知服务时,它帮了我很大的忙。 我喜欢它,因为它非常简单,在testing过程中运行良好。
import socket, ssl, json, struct # device token returned when the iPhone application # registers to receive alerts deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX' thePayLoad = { 'aps': { 'alert':'Oh no! Server\'s Down!', 'sound':'k1DiveAlarm.caf', 'badge':42, }, 'test_data': { 'foo': 'bar' }, } # Certificate issued by apple and converted to .pem format with openSSL # Per Apple's Push Notification Guide (end of chapter 3), first export the cert in p12 format # openssl pkcs12 -in cert.p12 -out cert.pem -nodes # when prompted "Enter Import Password:" hit return # theCertfile = 'cert.pem' # theHost = ( 'gateway.sandbox.push.apple.com', 2195 ) # data = json.dumps( thePayLoad ) # Clear out spaces in the device token and convert to hex deviceToken = deviceToken.replace(' ','') byteToken = bytes.fromhex( deviceToken ) # Python 3 # byteToken = deviceToken.decode('hex') # Python 2 theFormat = '!BH32sH%ds' % len(data) theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data ) # Create our connection using the certfile saved locally ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile ) ssl_sock.connect( theHost ) # Write out our data ssl_sock.write( theNotification ) # Close the connection -- apple would prefer that we keep # a connection open and push data as needed. ssl_sock.close()
还有一个名为apn_on_rails的rails gem,如果你正在开发一个rails应用程序,它似乎工作的很好,我今天看到它,并且能够从控制台发出通知。
在iPhone端,您只需调用以下方式注册所有types的通知:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
要接收设备令牌,您需要实现以下委托方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
在testing过程中,您可以用NSLog将deviceToken踢到控制台,然后将其粘贴到上面的python脚本中,在生产中,您显然需要设置一些方法将令牌传递到您的服务器。
而且,在制作过程中,您需要查询Apple的反馈服务,并从已删除应用的用户中删除设备令牌。
一个好地方是城市飞艇 。 你可以build立一个免费的基本账户,完成向苹果服务器发送推送通知的所有服务器端工作。 他们也做了很好的工作,帮助您完成使您的应用程序使用他们的服务所需的所有步骤,并具有出色的示例代码,显示如何注册您的应用程序的通知。
除了成为他们服务的快乐用户之外,我与他们没有任何联系。
如果有帮助,我已经写了一个Python库PyAPNs来与服务器端的Push Notification Service进行交互:
这一点帮助我用PHP在Linux服务器上制作提供者端代码。
在iPhone上真的没有太多的代码可写。 您需要获取iPhone或iPod Touch的唯一标记,然后将该标记转发给您的服务器。 获取令牌需要调用UIApplication,但是没有预定义的方式将它传递给服务器。 我的其中一个应用程序对PHP脚本执行HTTP POST,将该令牌放入数据库中。
如果您对configuration和证书设置等感到好奇,您可以查看Apple推送通知服务编程指南。
我知道这是一个非常古老的问题,并已收到很多答案,但我发现Rey Wenderlich的教程非常有用,并希望分享它为APNS初学者。这是非常有用的,很容易理解。
干杯,
阿迪亚
我知道这是迟到,但你应该看到MonoPush项目。 看来他们会提供一个新的推送整合方式以及详细的统计数据,包括地图统计。
看看iPhone开发中心的论坛,应该有很多服务器端代码的例子来跟苹果的推送服务器交谈。
这是jessecurry的testing脚本的经过testing的php5版本。 它使用“ 增强的消息格式 ”,并试图捕捉和显示来自苹果的错误。 这可能会显示你的信息有什么问题。
// Settings $deviceToken = 'xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx'; $apnsCert = 'apns-dev.pem'; $apnsHost = 'gateway.sandbox.push.apple.com'; $apnsPort = 2195; // Prepare payload $payload = array( 'aps' => array( 'alert' => 'Hi, this is an alert!', 'badge' => 8 ) ); $payload = json_encode($payload); print($payload . "\n"); // Connect to Apple Push Notification server $streamContext = stream_context_create(); stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); if (!$apns) { die('Error creating ssl socket'); } // Don't block on reading from the socket stream_set_blocking ($apns, 0); // Send payload in enhanced message format ( http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1 ) $apnsMessage = // Command "1" chr(1) // Identifier "88" . pack('N', 88) // Expiry "tomorrow" . pack('N', time() + 86400) // Token length . chr(0) . chr(32) // Device token . pack('H*', str_replace(' ', '', $deviceToken)) // Payload length . chr(0) . chr(strlen($payload)) // Actual payload . $payload . $payload; fwrite($apns, $apnsMessage); // Pause for half a second to check if there were any errors during the last seconds of sending. usleep(500000); checkAppleErrorResponse($apns); // Close connection -- apple would prefer that we keep // a connection open and push data as needed. fclose($apns); function checkAppleErrorResponse($apns) { $responseBinary = fread($apns, 6); if ($responseBinary !== false && strlen($responseBinary) == 6) { print( "\n" .'Error message recieved from Apple.'."\n" .'For the meaning, refer to: "Provider Communication with Apple Push Notification Service"'."\n" ); $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary); var_dump($response); } }
尝试GitHub上的NWPusher项目。 它提供了OS X和iOS应用程序来手动发送推送通知,或者您可以直接使用包含的Objective-C库。