Pergunta

Existe um projeto de exemplo mostrando como usar APNS no iPhone e como configurar as coisas? Atualmente estou olhando a documentação, mas seria bom ter algum código de trabalho para escolher distante e ver como tudo funciona em conjunto?

Eu não consigo encontrar qualquer coisa usando google ou no centro da iPhone Dev.

Foi útil?

Solução

A pior parte sobre como configurar o serviço de notificação push é o provisionamento. O maior obstáculo que me deparei foi que há um certificado e uma chave no arquivo .cer que você download no site da Apple, eu escrevi um serviço do sistema em C # que enviou notificações e as conexões falhava porque eu tinha exportado o certificado e não a chave.

Não me lembro que originalmente escreveu isso, aqui está um pouco de código em python que me ajudou quando eu estava primeiro testar o serviço de notificação. Eu gosto dele porque ele é muito simples e funciona bem durante os testes.

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()

Há também um rails gem chamada apn_on_rails que parece funcionar muito bem se você está desenvolvendo uma aplicação Rails, eu só vi isso hoje e foi capaz de enviar notificações a partir do console.

No lado do iPhone você só precisa ligar para o seguinte para registrar-se para todos os tipos de notificações:

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

Para receber o dispositivo de token que você precisa para implementar os seguintes métodos de delegado:

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

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

Durante o teste você pode apenas chutar a deviceToken para o console com NSLog, em seguida, colá-lo no script python acima, na produção você vai, obviamente, precisa de configurar algum método para obter o token para seus servidores.

Além disso, na produção você vai precisar de serviços de feedback e dispositivo Remova fichas de consulta da Apple de usuários que removeu a sua aplicação.

Outras dicas

Um bom lugar para começar é Urban Airship . Você pode configurar uma conta básica gratuita que irá fazer todo o trabalho do lado do servidor de envio de notificações push para os servidores da Apple. Eles também fazem um grande trabalho de seus passos através de todos os passos necessários para obter o seu aplicativo de trabalho com o seu serviço, e tem excelente código de exemplo que mostra como registrar seu aplicativo para notificações.

Eu não tenho nenhuma outra afiliação com eles além de ser um usuário feliz de seu serviço.

Em caso de ajuda, eu escrevi uma biblioteca Python, PyAPNs, para interagir com o serviço Push Notification no lado do servidor:

http://github.com/simonwhitaker/PyAPNs

http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/

Esta me ajudou muito com tornando código do lado do fornecedor no servidor linux com PHP.

Há realmente não é muito código para escrever no lado do iPhone. Você precisa para obter o token exclusivo do iPhone ou iPod Touch e depois retransmitir que token para seu servidor. Obtendo o token requer uma chamada para UIApplication mas não há nenhuma maneira pré-definida de conseguir que o seu servidor. Um dos meus aplicativos executa um HTTP POST para um script PHP que coloca o token em um banco de dados.

Se você está curioso sobre o provisionamento e a configuração dos certificados, etc ..., você pode verificar o serviço da Apple Push Notification Guia de Programação.

Eu sei que esta é uma questão muito antiga e tem recebido muitas respostas, mas eu encontrei o tutorial de Rey Wenderlich muito útil e queria compartilhá-lo para iniciantes APNs. É muito útil e muito fácil de entender.

Eu sei que estava atrasado, mas você deve ver projeto MonoPush . Parece que será fornecer uma nova integração maneira impulso, bem como estatísticas detalhadas, incluindo as estatísticas sobre o mapa.

Procure nos fóruns no centro dev o iPhone, supostamente, há uma série de exemplos de código do lado do servidor para falar com servidor de envio da Apple.

Aqui está uma versão php5 testado de test-roteiro de jessecurry. Ele usa o ' reforçada formato de mensagem', e tenta capturar e exibir erros de maçã. Isso pode dar uma indicação quanto ao que há de errado com suas mensagens.

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

Tente o projeto NWPusher no GitHub. Ele fornece OS X e iOS para enviar notificações push manualmente, ou você pode usar a biblioteca Objective-C incluído diretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top