2009-06-27 168 views
50

是否有示例项目显示如何在iPhone上使用APNS以及如何设置内容?我目前正在查看文档,但是有一些工作代码可以分开查看它们是如何一起工作的?Apple PNS(推送通知服务)示例代码

我似乎无法找到任何使用谷歌或iPhone开发中心。

+2

请点击这里http://arashnorouzi.wordpress.com/2011/03/31/sending-apple-push-notifications-in-asp-net-part-1/它正是你正在寻找的。 – Moon 2011-07-25 11:02:58

+0

@ froh42你有没有满意的代码?我还希望逐步实施示例代码。如果您有,请将其提供给我。先谢谢你。 – 2014-10-14 11:21:42

回答

59

设置推送通知服务最糟糕的部分是配置。我遇到的主要绊脚石是从Apple网站下载的.cer文件中存在证书和密钥,我在C#中编写了一个系统服务,发出通知,并且连接保持失败,因为我导出了证书而不是关键。

我不记得最初是谁写的,这里是python中的一小段代码,当我第一次测试通知服务时,它帮了我很大的忙。我喜欢它,因为它非常简单,在测试过程中运行良好。

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应用程序,我只看到它今天能够从控制台发送通知。

在iPhone端你只需要调用以下为各类通知的登记:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; 

要接收你需要执行下面的委托方法的设备令牌:

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

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 

在测试过程中,您可以使用NSLog将deviceToken踢到控制台,然后将其粘贴到上面的python脚本中,在生产中,您显然需要设置一些方法将令牌传递到服务器。

此外,在制作过程中,您需要查询Apple的反馈服务,并从删除应用的用户中删除设备令牌。

+1

查看下面的Simon的答案 - 他将Python代码封装在一个很好的库中,您可以在这里获得:http://github.com/simonwhitaker/PyAPNs – 2011-01-21 10:01:52

+1

为了记录,只需成功运行此代码即可。 – 2013-02-08 22:51:10

+1

警告 - 此代码适用于协议的版本0。苹果现在已经达到版本2. – 2013-11-16 14:27:07

2

看看iPhone开发中心的论坛,据说有很多服务器端代码的例子可以与Apple的推送服务器进行对话。

5

真的没有太多的代码要写在iPhone端。您需要获取iPhone或iPod Touch的唯一标记,然后将该标记转发给您的服务器。获取令牌需要调用UIApplication,但没有预定义的方式将它传递给服务器。我的一个应用程序对PHP脚本执行HTTP POST,将该令牌放入数据库中。

如果您对配置和证书等的设置感到好奇,可以查看Apple推送通知服务编程指南。

+0

Ben,是的,它看起来并不复杂,我也是积极的我会解决配置问题(还没有看过,但是......)这本来是非常好的,如何设置事物的分步实例。 – froh42 2009-06-30 09:35:03

16

一个好的开始是Urban Airship。您可以设置一个免费的基本帐户,该帐户将完成将推送通知发送到Apple服务器的所有服务器端工作。他们也很好地帮助您完成使您的应用程序使用其服务所需的所有步骤,并且具有出色的示例代码,可以显示如何向应用程序注册通知。

除了成为他们的服务的快乐用户之外,我与他们没有任何联系。

3

我知道这是晚了,但你应该看到MonoPush项目。看来他们将提供一种新的推送整合方式以及详细的统计数据,包括统计数据。

4

我知道这是一个非常古老的问题,有收到了很多答案,但我发现Rey Wenderlich教程非常有用,并希望分享它的APNS初学者。这是非常有用的,很容易理解。

干杯,

阿迪亚

1

这里的jessecurry的测试脚本的测试PHP5版本。 它使用'enhanced message format',并尝试捕获并显示来自苹果的错误。这可能表明您的消息有什么问题。

// 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); 
    } 
} 
1

尝试在GitHub上的NWPusher项目。它提供了OS X和iOS应用程序来手动发送推送通知,或者您可以直接使用包含的Objective-C库。