当应用程序未连接到 xcode 时,iOS 8 静默推送通知不会触发 didReceiveRemoteNotification 方法
Posted
技术标签:
【中文标题】当应用程序未连接到 xcode 时,iOS 8 静默推送通知不会触发 didReceiveRemoteNotification 方法【英文标题】:iOS 8 Silent Push Notification doesn't fire didReceiveRemoteNotification method when application not connected to xcode 【发布时间】:2014-12-24 19:18:40 【问题描述】:我看到太多关于如果设备未连接到 xcode 时静默推送通知不起作用的问题,但我找不到真正的答案。 我正在使用 Silent APN 在后台启动一个进程,然后触发本地推送通知
服务器发送此信息:
"_metadata" =
bagde = 1;
pushText = "semeone has sent you a message!!";
sender = "semeone";
;
aps =
"content-available" = 1;
;
而 _metadata 是触发本地通知的自定义信息,我没有在 aps 中包含徽章、pushText.. 因为我是静默推送通知。
客户端应该在 didReceiveRemoteNotification 中获取信息,
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
if(application.applicationState != UIApplicationStateActive )
if([userInfo[@"aps"][@"content-available"] intValue]== 1) //it's the silent notification
//start a background task
UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
NSLog(@"Background task to start a process ");
];
//end completionHandler regarding to fetchCompletionHandler
completionHandler(UIBackgroundFetchResultNewData);
// doing my process...... and fire a local notification
if(preLoadPNTask)
NSLog(@"End Background task ");
[[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask];
preLoadPNTask = 0;
return;
else
NSLog(@"didReceiveRemoteNotification it's NOT the silent notification ");
completionHandler(UIBackgroundFetchResultNoData);
return;
else
if(preLoadPNTask)
NSLog(@"End Background task ");
[[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask];
preLoadPNTask = 0;
completionHandler(UIBackgroundFetchResultNewData);
当设备连接到 xcode 时它工作得很好,但是当它没有连接时,didReceiveRemoteNotification 不会启动:(
有什么想法吗?
提前谢谢你!!
【问题讨论】:
收到通知后你在执行什么任务? 我将 ID 和发件人添加到 NSMutableDictionary,然后我将数据发送到 Worklight [[WL sharedInstance] sendActionToJS:@"silentNotification" withData:dictionary];然后我释放本地通知 localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 徽章; localNotif.alertBody = textAlert; localNotif.userInfo = userInfoData; [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; [localNotif 发布]; 怎么知道是否调用了didReceiveRemoteNotification方法? 我和你@jan遇到了同样的情况。到现在都解决不了。 (ios 8.1.2) 我已经在 iOS 7 和 iOS 8 设备上进行了测试。我在 iOS 8 设备上遇到了同样的问题,但不知道发生了什么。在我的 iOS 7 设备上,一切正常——接收到静默通知(有或没有 xcode)。在我的 iOS 8 设备上,根本没有收到静默通知(没有 Xcode)。不过,它可以 100% 使用 Xcode。如果你们中的任何人找到解决方案,请告诉我。 【参考方案1】:我最终得到的是一根 USB 电缆,显然每次我插入 iphone 设备时都会出现一些问题,说“此配件可能不受支持”但它继续正常工作,所以我换了一个新的,但这并不能解决我的问题,但是可以成为其中的一部分。所以我查看了代码,我做了一些更改,在收到 2 个以上的静默推送通知 preLoadPNTask (UIBackgroundTaskIdentifier) 创建了很多次之后,所以我在它开始之前添加了一个验证,
if(!preLoadPNTask)
//start a background task
UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
NSLog(@"Background task to start a process ");
];
希望对你有帮助 问候
【讨论】:
还要记得在3分钟前关闭preLoadPNTask(BackgroundTask),否则应用会崩溃【参考方案2】:在 ios 8 中,您需要执行以下步骤来触发 didReceiveRemoteNotification: 方法
-
选择项目目标转到功能选项卡
选择“背景模式”打开。
它将在您的项目 info.plist 中添加一个键(必需的后台模式)
在这些修改之后,当您收到苹果推送通知并且应用程序已经在后台时,didReceiveRemoteNotification 将被触发。
【讨论】:
【参考方案3】:可能是因为在 iOS 8 下您必须以不同的方式请求推送通知。试试这个:
-(void) registerForPushNotifications
UIApplication* application=[UIApplication sharedApplication] ;
// Register for Push Notitications, if running iOS 8
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)])
UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
else
// Register for Push Notifications before iOS 8
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
【讨论】:
以上是关于当应用程序未连接到 xcode 时,iOS 8 静默推送通知不会触发 didReceiveRemoteNotification 方法的主要内容,如果未能解决你的问题,请参考以下文章
didReceiveRemoteNotification:当应用程序处于后台并且未连接到Xcode时未调用fetchCompletionHandler
Flutter 应用程序:IOS 模拟器未连接到 Android Studio
Crashlytics - 当应用程序在未连接到 android studio 时崩溃时无法获取崩溃报告