push-уведомление iphone не работает - PullRequest
0 голосов
/ 03 февраля 2012

В моем приложении реализовано push-уведомление.

Server: php
Client: iphone

Завершить кодирование:

function pushToIphone($deviceToken, $badge){
    ini_set('display_errors','on');
    error_reporting(E_ALL);

    //$apnsHost = 'gateway.sandbox.push.apple.com';
    $apnsHost = 'gateway.push.apple.com';
    $apnsPort = 2195;
    $pem_path = dirname(__FILE__);  
    $pem_path = $pem_path .'\cert';
    $apnsCert = $pem_path.'\apns_cer.pem';

    echo $apnsCert."<br/>"; 
    $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) {
        echo "Connection Established<br/>";

        $payload = array();
        //$payload['aps'] = array('alert' => 'BiiMe finds product for you', 'badge' => $badge, 'sound' => 'default');
        //$payload = get_payload_message('BiiMe finds product for you',$badge);
        //$payload['server'] = array('serverId' => $serverId, 'name' => $serverName);
        //$payload = json_encode($payload);

        $payload = get_payload_message('BiiMe finds product for you',$badge);
        $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;

        echo $apnsMessage."<BR/>";

        $fwrite = fwrite($apns, $apnsMessage);  
        echo $fwrite." bytes written<BR/>"; 
    } else {
        echo "Connection fail<br/>";
    }

    //socket_close($apns);  
    fclose($apns);
}

function get_payload_message($message_text,$badge,$sound='default')
{
    $PAYLOAD_MAXIMUM_SIZE = 256;

    $payload['aps'] = array("alert" => "$message_text", 'badge' => $badge, 'sound' => $sound);
    $payload = json_encode($payload);

    $nJSONPayloadLen = strlen($payload);
    if($nJSONPayloadLen > $PAYLOAD_MAXIMUM_SIZE)
    {
        $nTextLen = strlen($message_text);
        if($nJSONPayloadLen - $nTextLen <= $PAYLOAD_MAXIMUM_SIZE)
        {
            $badge_count = substr($message_text, 0, $nTextLen - ($nJSONPayloadLen - $PAYLOAD_MAXIMUM_SIZE));
            $payload  = get_payload_message($message_text);
        }
    }
    return  $payload;
}

Iphone сторона, которую я добавил:

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


    NSLog(@"It comes<<<<<<<<<<<<<---------------------------------------");
    NSString *str = [NSString 
                     stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(str);
    NSString *token = [NSString stringWithFormat:deviceToken];
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:token forKey:@"deviceId"];
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSLog(@"It comes with error---------------------------->>>>>>>>>>>>>>");
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(str);    
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:str forKey:@"deviceId"];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

    for (id key in userInfo) {
        NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
    }    

}

также я использую:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    UIImageView *loading = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, 320, 460)];
    [loading setImage:[UIImage imageNamed:@"Default.png"]];
    [window addSubview:loading];
    [loading release];

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)];
    }

Это весь мой код, который использовал:

Журнал iPhone отображается при подключенном устройстве:

2012-02-03 19:51:32.872 BiiMe[7544:707] It comes<<<<<<<<<<<<<---------------------------------------
2012-02-03 19:51:32.873 BiiMe[7544:707] Device Token=<26d906c5 c273446d 5f40d2c1 73ddd3f6 869b2666 b1c7afd5 173d69b6 629def70>

все время на стороне сервера: Соединение установлено

Чего мне не хватает ..? или что я должен реализовать в своем коде:

Ваш ответ мне поможет.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

используйте этот код в didFinishLaunchingWithOption в AppDelegete

[[UIApplication sharedApplication]
     registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                         UIRemoteNotificationTypeSound |
                                         UIRemoteNotificationTypeAlert)];
2 голосов
/ 03 февраля 2012

gateway.push.apple.com используется для выпущенного приложения или приложения AdHoc. Если вы проверяете профиль разработки, вам может потребоваться изменить его на gateway.sandbox.push.apple.com

Надеюсь, это поможет.

...