无法在所有设备上获得推送通知

时间:2012-06-26 17:17:26

标签: ios objective-c apple-push-notifications

我正在使用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];
            }
        }
}

3 个答案:

答案 0 :(得分:2)

1) 即使APNS服务器接受推送通知,也无法保证实际推送推送通知。

2) 就您的服务器而言,推送通知是即发即弃的;在将通知发送到APNS后,无法确定通知的状态。交货时间也可能有所不同,从几秒到半小时。

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

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

答案 1 :(得分:1)

  1. 您是否在APN消息中将“到期日期”设置为0?如果您将其设置为0,则推送消息会一劳永逸地忘记,否则Apple可能会尝试将其发送到指定的时间。

  2. 要检查的另一件事可能是绝对确定您的开发测试运行中没有设备ID最终会出现在设备ID列表中,您实际上是要在生产中发送推送消息。一个有故障的设备ID和Apple将停止SSL连接,不再处理任何APN消息。

答案 2 :(得分: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某些设备我不知道为什么因为它对某些人来说效果很好。

谢谢你们!