0

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 Web 套接字服务器。这是通常发生的事情吗?这是我第一次使用SocketRocket所以我不确定。

更新: 我还启用Remote Notifications了后台模式,我还注册了远程通知,并且在设备上,我还确保启用了“横幅”和“徽章”。

更新: 我还设置了 Web 套接字以使用后台队列。

[webSocket setDelegateOperationQueue:[NSOperationQueue new]];

连接仍在暂停。

谢谢!

4

2 回答 2

2

编辑:看起来 SocketRocket 默认使用主调度队列,它在应用程序的主线程上运行。当应用程序处于后台时,主线程上的处理停止,因此值得尝试将工作移动到后台操作队列中的后台线程。

在您的SRWebSocket对象上,尝试调用:

[webSocket setDelegateOperationQueue:[NSOperationQueue new]];


如果不检查文档,可能设置timeZonefireDateonUILocalNotification会干扰。如果您要将通知传递给presentLocalNotificationNow:.

我还发现,即使您只使用本地通知,您也必须:

  1. 在后台模式下的功能选项卡上为您的目标启用远程通知
  2. 在“设置”应用程序的“通知中心”设置中启用警报或横幅。

后台获取的示例事件处理程序:

- (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);
}
于 2014-03-05T05:16:39.873 回答
0

恐怕您对本地通知有误解。我想你应该做的是在未来注册一个通知,并在用户点击主页按钮后发送它。但是在您的代码中,您在当前时间注册了一个警报并在通知上做了一些事情(抱歉,我不知道您想在代码中做什么)。

您可以像这样更改它以使其有意义:

- (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 秒收到本地通知。

于 2014-03-05T05:26:52.233 回答