2014-12-13 53 views
2

我指的是本教程。 http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 ..当它运行此代码时,它显示已成功发送,但消息未显示在设备上。我做了完整的APNS步骤,推送通知消息未出现在设备中

这里是我尝试的是,我错了?由于提前

PHP代码:

<?php 

// Put your device token here (without spaces): 
$deviceToken = 'Device Token'; 

// Put your private key's passphrase here: 
$passphrase = 'pushchat'; 

// Put your alert message here: 
$message = 'My first push notification!'; 

//////////////////////////////////////////////////////////////////////////////// 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

// Open a connection to the APNS server 
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err, 
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

if (!$fp) 
    exit("Failed to connect: $err $errstr" . PHP_EOL); 

echo 'Connected to APNS' . PHP_EOL; 

// Create the payload body 
$body['aps'] = array(
    'alert' => $message, 
    'sound' => 'default' 
); 

// Encode the payload as JSON 
$payload = json_encode($body); 

// Build the binary notification 
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) .  $payload; 

    // Send it to the server 
$result = fwrite($fp, $msg, strlen($msg)); 

if (!$result) 
    echo 'Message not delivered' . PHP_EOL; 
else 
    echo 'Message successfully delivered' . PHP_EOL; 

// Close the connection to the server 
fclose($fp); 

的iOS代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) 
    { 
    // iOS 8 Notifications 
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 

    [application registerForRemoteNotifications]; 
    } 
    else 
    { 
    // iOS < 8 Notifications 
    [application registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; 
    } 


    //other code 

    return YES; 
    } 

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
    { 
    // NSString *DeviceTokenString = [NSString stringWithFormat:@"%@",deviceToken]; 
    // NSLog(DeviceTokenString); 
    NSString *devicePushToken=[[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] ; 
    devicePushToken = [devicePushToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    NSLog(@"%@", [NSString stringWithFormat:@"%@", devicePushToken]); 
    } 

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    if (err.code == 3010) { 
     NSLog(@"Push notifications are not supported in the iOS Simulator."); 
    } else { 
     // show some alert or otherwise handle the failure to register. 
      NSLog(@"application:didFailToRegisterForRemoteNotificationsWithError: %@", err); 
    } 
} 

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
     NSLog(@"%@", userInfo); 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification" message: 
         [userInfo objectForKey:@"inAppMessage"] delegate:nil cancelButtonTitle: 
         @"OK" otherButtonTitles:nil, nil]; 
     [alert show]; 

    UIApplicationState state = [application applicationState]; 

    // If your app is running 
    if (state == UIApplicationStateActive) 
    { 

    //You need to customize your alert by yourself for this situation. For ex, 
    NSString *cancelTitle = @"Close"; 
    NSString *showTitle = @"Demo Push Notification"; 
    NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"]; 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" 
                 message:message 
                 delegate:self 
               cancelButtonTitle:cancelTitle 
               otherButtonTitles:showTitle, nil]; 
    [alertView show]; 

    } 
} 
+0

不知道关于php,但如果你真的想要简单的解决方案推动你可以使用(解析)[www.parse.com] – 2014-12-13 06:44:56

+0

okey谢谢你 – 2014-12-13 06:47:26

+0

证书可能是问题。你确定ck.pem是从你的开发证书生成的吗?尝试[this](http://stackoverflow.com/questions/21250510/generate-pem-file-used-to-setup-apple-push-notification)方法来生成PEM。 – RoHaN 2014-12-13 06:48:15

回答

11

我得到了解决,并得到推送通知。

问题在于创建pem文件的p12键。 我用在终端此命令用于将文件从P12到PEM:

“OpenSSL的PKCS12 -nocerts -out PushChatKey.pem -in PushChatKey.p12”

其去除证书 “-nocerts”所以我用下面的命令来做同样的操作:

openssl pkcs12 -in PKey.p12 -out PCKey.pem -nodes;

然后根据这个link做,它会完美的工作。

+0

真棒解决方案为此,我认为你必须对该教程给予评论,所以其他人都使用这个解决方案 – 2014-12-24 03:07:27

+0

yeap肯定今天我也给这个链接的解决方案:) – Ryuk 2014-12-24 04:09:02

+0

似乎没有为我工作 - 同样的问题。消息已发送,但未发送 – FooBar 2015-01-03 18:16:30