0

我正在使用 APNS 在我的应用程序中接收推送通知。

问题是我在某些设备上收到了相同的通知,但不是全部。由于我已经尝试了大约 15 天来解决这个问题,但没有成功,可能会出现什么问题。设备令牌正在成功更新。因为如果不是这样,我就不会在任何设备上收到通知。但奇怪的是我在一半的设备上都得到了它。请帮忙!!

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

我这里有 3 台设备,它在其中两台上工作。iPad2:5.0.1 iPodTouch:4.3.3

它不适用于我在版本:5.1 上的另一个 iPod touch

它的显示也在所有设备中成功注册了 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];
            }
        }
}
4

3 回答 3

2

1 ) 不能保证推送通知会实际发送,即使 APNS 服务器接受了它们。

2 ) 就您的服务器而言,推送通知是一劳永逸的;在您将通知发送到 APNS 后,无法找出通知的状态。交货时间也可能有所不同,从几秒钟到半小时不等。

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

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

于 2012-06-26T19:32:48.613 回答
1
  1. 您是否在 APN 消息中将“到期”设置为 0?如果您将其设置为 0,则推送消息是“一劳永逸”,否则 Apple 可能会尝试将它们发送到指定的时间。

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

于 2012-06-29T14:48:29.280 回答
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,我不确定为什么它对某些设备运行良好。

多谢你们!!

于 2012-07-02T20:26:28.650 回答