2015-05-19 55 views
0

我正在使用Net :: SSLeay的庫(Net :: APNS :: Persistent)。該庫有助於與Apples APNS服務器進行通信。我發現如果我發送任何不良數據,例如錯誤的令牌或格式不正確的有效負載,程序會在三次嘗試後終止。它沒有顯示錯誤信息。使用perl連接蘋果APNS的問題

按我調試這個問題是從行號發生SSLeay.pm 1895年

$寫道= write_partial($ SSL,$寫,$ to_write,$$ data_ref);

我試圖捕捉,如果有任何例外,術語信號發送,但沒有運氣。如果出現網絡問題或任何類型的錯誤,我希望它應該顯示可以處理的錯誤消息/異常。但它只是無視任何事情而殺死程序。有沒有辦法來解決這個問題?我的代碼如下:

package apnsClient; 

use Net::APNS::Persistent; 
use Data::Dumper; 
use Test::Trap; 

my $cfg; 
my $apns; 

sub load { 
    my $class = shift; 
    my $self = { 
     _cfg => shift, 
    }; 

    $cfg = $self->{_cfg}; 

    bless $self, $class; 
    return $self; 
} 

sub connect { 
    my ($sandbox, $cert, $key, $pass) = $cfg->getAPNSServer(); 

    print "[x] Cert $cert Key $key \n"; 

    $apns = Net::APNS::Persistent->new({ 
     sandbox => $sandbox, 
     cert => $cert, 
     key  => $key, 
    }) or die("[-] Unable to connect to APNS server"); 
} 

sub push { 
    my ($class,$token,$payload) = @_; 

    print "[+] Sending push with token: $token and Data: \n ".Dumper($payload); 

    $apns->queue_notification(
     $token, 
     $payload 
     ); 
    print "[+] Sending apns queue \n"; 
    $apns->send_queue; 
    print "[+] Sent \n"; 
} 

sub disconnect { 
    $apns->disconnect; 
} 

1; 

回答

0

最後找出問題所在。如果提供了無效令牌,Apple服務器將丟棄一個會話,並且write_partial函數在無法寫入套接字時發送終止信號。爲防止劇本終止,我們需要使用

$SIG{'PIPE'} = 'IGNORE'; 
+0

您能提供一個完整的工作示例嗎? – user2968356