从后台发送UILocationNotification

时间:2014-03-05 05:12:23

标签: ios objective-c notifications uilocalnotification socketrocket

我有一个应用,当应用在前景/活动中时,我需要发送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]];

连接仍在暂停。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

SRWebSocket对象上,尝试拨打:

[webSocket setDelegateOperationQueue:[NSOperationQueue new]];


如果不查看文档,可能会在timeZone上设置fireDateUILocalNotification进行干扰。如果您要将通知传递给presentLocalNotificationNow:,则不需要这些。

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

  1. 背景模式
  2. 下的功能标签上为目标启用远程通知
  3. 设置应用中,在通知中心设置中启用提醒或横幅。
  4. 后台提取的示例事件处理程序:

    - (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。