我正在使用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 :(得分:2)
1) 即使APNS服务器接受推送通知,也无法保证实际推送推送通知。
2) 就您的服务器而言,推送通知是即发即弃的;在将通知发送到APNS后,无法确定通知的状态。交货时间也可能有所不同,从几秒到半小时。
3)此外,用户的iPhone可能无法始终接收推送通知。他们可以
4) APNS将尝试在重新联机时提供该设备收到的最后通知,但它只会在有限的时间内尝试。一旦超时,推送通知将永远丢失!
答案 1 :(得分:1)
您是否在APN消息中将“到期日期”设置为0?如果您将其设置为0,则推送消息会一劳永逸地忘记,否则Apple可能会尝试将其发送到指定的时间。
要检查的另一件事可能是绝对确定您的开发测试运行中没有设备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某些设备我不知道为什么因为它对某些人来说效果很好。
谢谢你们!