我有一个应用,当应用在前景/活动中不时,我需要发送UILocationNotification
。如果我有我的代码这样做,它将不会发送,直到应用程序打开并处于活动状态。
这是我的功能:
- (void)setLocalNotificationForType:(SPKLocalNotificationType)notificationType fromUser:(NSString *)userName withMessageText:(NSString *)msgText {
UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.userInfo = @{@"handle": _convoHandle, @"room": _convoName};
notif.fireDate = [NSDate date];
notif.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
notif.soundName = UILocalNotificationDefaultSoundName;
notif.timeZone = [NSTimeZone defaultTimeZone];
if (notificationType == 1) { // message
notif.alertBody = [NSString stringWithFormat:@"@%@ said: \"%@\"", userName, msgText];
} else if (notificationType == 2) { // image
notif.alertBody = [NSString stringWithFormat:@"@%@ sent an image", userName];
} else {
return;
}
if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {
[[UIApplication sharedApplication] presentLocalNotificationNow:notif];
}
}
更新的
现在看来问题是当应用程序在后台时,与服务器的连接正在“暂停”。一旦我打开应用程序,所有数据立即进入。我正在使用SocketRocket连接到我的Node.js
Primus网络套接字服务器。这通常会发生什么吗?这是我第一次使用SocketRocket
所以我不确定。
更新的
我还为背景模式启用了Remote Notifications
,我也注册了远程通知,在设备上,我还确保启用了“横幅”和“徽章”。
更新的 我还设置了Web套接字以使用后台队列。
[webSocket setDelegateOperationQueue:[NSOperationQueue new]];
连接仍在暂停。
谢谢!
答案 0 :(得分:2)
编辑:看起来SocketRocket默认使用主调度队列,它在应用程序的主线程上运行。当应用程序背景化时,主线程上的处理停止,因此值得尝试将工作移动到后台操作队列中的后台线程。
在SRWebSocket
对象上,尝试拨打:
[webSocket setDelegateOperationQueue:[NSOperationQueue new]];
如果不查看文档,可能会在timeZone
上设置fireDate
和UILocalNotification
进行干扰。如果您要将通知传递给presentLocalNotificationNow:
,则不需要这些。
我还发现,即使你只使用本地通知,你也必须:
后台提取的示例事件处理程序:
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
UIBackgroundFetchResult result = UIBackgroundFetchResultNoData;
// ... perform a network request
if (successfulNetworkRequest) {
UILocalNotification* localNotification = [UILocalNotification new];
localNotification.alertAction = @"View";
localNotification.alertBody = @"Stuff";
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.applicationIconBadgeNumber = 1;
localNotification.userInfo = @{@"stuff": @"other stuff"};
[application presentLocalNotificationNow:localNotification];
result = UIBackgroundFetchResultNewData;
} else {
result = UIBackgroundFetchResultFailed;
}
completionHandler(result);
}
答案 1 :(得分:0)
恐怕你误解了当地的通知。我想你应该做的是将来注册一个通知,并在用户点击主页按钮后发送一段时间。但是在您的代码中,您在CURRENT TIME中注册了一个警报,并在通知上做了一些事情(抱歉,但我不知道您想在代码中做什么)。
你可以像这样改变它来理解:
- (void)setLocalNotificationForType:(SPKLocalNotificationType)notificationType fromUser:(NSString *)userName withMessageText:(NSString *)msgText {
UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.userInfo = @{@"handle": _convoHandle, @"room": _convoName};
//Set the fire time 10 seconds later
notif.fireDate = [[NSDate date] dateByAddingTimeInterval:10];
notif.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
notif.soundName = UILocalNotificationDefaultSoundName;
notif.timeZone = [NSTimeZone defaultTimeZone];
if (notificationType == 1) { // message
notif.alertBody = [NSString stringWithFormat:@"@%@ said: \"%@\"", userName, msgText];
} else if (notificationType == 2) { // image
notif.alertBody = [NSString stringWithFormat:@"@%@ sent an image", userName];
} else {
return;
}
//Register this notification
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
在您的应用代表的-applicationDidEnterBackground:
中,调用您的-setLocalNotificationForType:fromUser:withMessageText:
方法制作并注册通知。然后,在单击主页按钮后,您可以获得本地通知10。