2012-06-26 56 views
0

我正在使用APNS在我的应用程序中接收推送通知。无法在所有设备上获取推送通知

问题是我在某些设备上获得相同的通知,但不是全部。这个问题会出现在这里,因为我一直试图解决这个问题大约15天而没有成功。设备令牌正在更新成功。因为如果没有,我不会在任何设备上收到通知。但奇怪的是,我正在使用一半的设备。请帮忙!!

这里是注册和接收通知的代码。我没有任何代码服务器端。但正如我所说,通知正在一些设备上工作。在Android上,他们也在工作。

我有3个设备在这里与我和它的两个工作。 iPad2的:5.0.1 的iPodTouch:4.3.3

它没有其他的iPod touch,我对工作的版本:5.1

而且其显示注册成功APNS中的所有设备。但不发送一些通知。问题是什么?有什么我失踪了吗?

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken 
{ 

    deviceToken = [devToken retain]; 

    NSLog(@"Registered for APNS %@", deviceToken); 

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; 

    NSMutableString *dev = [[NSMutableString alloc] init]; 

    NSRange r; 
    r.length = 1; 
    unsigned char c; 

    for (int i = 0; i < [deviceToken length]; i++) 
    { 
     r.location = i; 
     [deviceToken getBytes:&c range:r]; 

     if (c < 10) { 
      [dev appendFormat:@"0%x", c]; 
     } 
     else { 
      [dev appendFormat:@"%x", c]; 
     } 

    } 

    [ud setObject:dev forKey:@"DeviceToken"]; 
    [ud synchronize]; 

} 

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

    NSLog(@"Failed to register %@", [error localizedDescription]); 

    deviceToken = nil; 

} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
for(int i=0;i<[viewControllers count];i++) 
     { 
      if([[viewControllers objectAtIndex:i] isKindOfClass:[Confirmation class]]) 
      { 
       Confirmation *map = (Confirmation*)[[self.navigationController viewControllers] objectAtIndex:i]; 
       [map setFinalInfo]; 
       [self.navigationController popToViewController:[[self.navigationController viewControllers] objectAtIndex:i] animated:YES]; 
      } 
     } 
} 
+0

打算发布代码?如果没有显示你在做什么,不要期望有太多的帮助。 –

+0

此外,您应该发布您的设备,并没有得到通知。有什么区别? – Dustin

+0

好的..你需要什么代码? APNS注册码? –

回答

1

我更换了下面的代码:

deviceToken = [devToken retain]; 

    NSLog(@"Registered for APNS %@", deviceToken); 

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; 

    NSMutableString *dev = [[NSMutableString alloc] init]; 

    NSRange r; 
    r.length = 1; 
    unsigned char c; 

    for (int i = 0; i < [deviceToken length]; i++) 
    { 
     r.location = i; 
     [deviceToken getBytes:&c range:r]; 

     if (c < 10) { 
      [dev appendFormat:@"0%x", c]; 
     } 
     else { 
      [dev appendFormat:@"%x", c]; 
     } 

    } 

    [ud setObject:dev forKey:@"DeviceToken"]; 
    [ud synchronize]; 

通过这样的:

[devToken retain]; 
    NSLog(@"~~~~devToken=%@",devToken); 
    NSString *dt = [[devToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
    dt = [dt stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    //    //DeviceToken = dt; 
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
    [def setObject:dt forKey:@"DeviceToken"]; 
    [def synchronize]; 

及其工作现在罚款!

问题是它没有正确地更新设备toekn的一些设备,我不知道为什么,因为它为一些运行良好。

谢谢你们!

2

1)没有保证推送通知将实际交付,即使APNS服务器接纳了他们。

2)就您的服务器而言,推送通知是“火再忘”在将通知发送给APNS后,无法找到通知的状态。交货时间也可能不同,从几秒到半小时不等。

3)此外,用户的iPhone可能无法始终接收推送通知。他们可能在位于WiFi网络上,因为所需的端口被阻止,所以不允许连接到APNS。或者电话可能被关闭。

4)APNS会尝试当它重新联机,提供它为该设备接收的最后通知,但它只会尝试在有限的时间。一旦超时,推送通知将永远丢失!

1
  1. 您是否将APN消息中的“过期”设置为0?如果您将其设置为0,则推送消息将一次又一次地尝试,否则Apple可能会尝试将其传送至指定的时间。

  2. 要检查的另一件事可能是绝对确定没有设备ID从您的开发测试运行最终在设备ID的列表中您实际上将要在生产中发送推送消息。一个错误的设备ID和Apple将停止SSL连接并且不处理更多的APN消息。

相关问题