2017-06-21 55 views
0

我试图从自己的PHP服务器发送到应用程序的远程通知。在ios上的远程通知

下面的代码在AppDelefate.m:

#import "AppDelegate.h" 
#import <UserNotifications/UserNotifications.h> 
@interface AppDelegate() 

@end 



@implementation AppDelegate 

#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
    [self registerForRemoteNotifications]; 
    return YES; 
} 

- (void)registerForRemoteNotifications { 
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 
     center.delegate = self; 
     [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){ 
      if(!error){ 
       [[UIApplication sharedApplication] registerForRemoteNotifications]; 
      } 
     }]; 
} 

//Called when a notification is delivered to a foreground app. 
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 
    NSLog(@"User Info : %@",notification.request.content.userInfo); 
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge); 
} 

//Called to let your app know which action was selected by the user for a given notification. 
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{ 
    NSLog(@"User Info : %@",response.notification.request.content.userInfo); 
    completionHandler(); 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    NSLog(@"%@", userInfo); 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
    NSLog(@"%@", userInfo); 
    completionHandler(UIBackgroundFetchResultNewData); 
} 

- (void)applicationDidFinishLaunching:(UIApplication *)app { 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
} 

// Handle remote notification registration. 
- (void)application:(UIApplication *)app 
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
    NSString *token = [[devToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    NSLog(@"content---%@", token); 
} 

- (void)application:(UIApplication *)app 
didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSLog(@"Remote notification support is unavailable due to error: %@", err); 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
} 


- (void)applicationDidEnterBackground:(UIApplication *)application { 
} 


- (void)applicationWillEnterForeground:(UIApplication *)application { 
} 


- (void)applicationDidBecomeActive:(UIApplication *)application { 
} 


- (void)applicationWillTerminate:(UIApplication *)application { 
} 

@end 

当我运行的应用程序,它要求通知特权,之后接受。控制台打印以下令牌:

content---13eeb8d33de4f0ba55f520469f9b0970e973faa6904a38428b2193b04ac3782b 

所以我用这个令牌我的PHP服务器进行测试:

<?php 
// Put your device token here (without spaces): 
$deviceToken = '13eeb8d33de4f0ba55f520469f9b0970e973faa6904a38428b2193b04ac3782b'; 

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

// Put your alert message here: 
$message = 'Test push.'; 


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

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

echo "<p>Open Connection</p>"; 
if(!$apns) 
{ 
    echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstr . "</p>"; 
    return; 
} 
else 
{ 
    echo "<p>Connected</p>";  

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

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

    echo "<p>Message: "; 
    print_r($payload); 
    echo "</p>"; 

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

    // Send it to the server 
    $result = fwrite($apns, $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($apns); 
} 

?> 

当我运行这个PHP代码,它打印以下内容:

resource(2) of type (stream-context) 
Open Connection 

Connected 

Message: {"aps":{"title":"Test title","alert":"Test push.","sound":"default","badge":1}} 

Message successfully delivered 

但是我的应用程序收不到任何东西。请帮我找到我的代码中缺少的内容。谢谢。

+0

这是因为对于一个设备的设备令牌不是一个常数。它改变。所以你必须设法得到最新的工作 –

回答

0

请确认,您已在服务器防火墙中打开2195端口。通过2195端口发送Apple推送通知。所以它应该打开。

+0

是的,我发现端口没有打开。但它是一个租用服务器,我仍然在想如何打开这个端口。无论如何,感谢您的回答 – user3195152

0

我认为你在使用​​环境,但是在你的PHP脚本中你的套接字客户端是生产环境,使用​​进行下面的开发。

沙盒

ssl://gateway.sandbox.push.apple.com:2195' 


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

生产

ssl://gateway.push.apple.com:2195' 

// Open a connection to the APNS server 
$apns = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); // production 
+0

感谢您的提醒 – user3195152