【问题标题】:How to show a UILocalNotification when ASINetworkQueue finishes all requests?当 ASINetworkQueue 完成所有请求时如何显示 UILocalNotification?
【发布时间】:2011-05-06 12:35:57
【问题描述】:

当 iPhone 应用程序在后台运行时,我正在使用 ASIHTTPRequest 下载多个文件。我想在队列结束时显示UILocalNotification。 在应用程序恢复之前不会调用以下委托方法:

- (void)queueFinished:(ASINetworkQueue *)aQueue
{

    NSLog(@"Queue finished");

    if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) {
        UILocalNotification* localNotification = [[UILocalNotification alloc] init];
        localNotification.alertBody = NSLocalizedString(@"All downloads completed");        
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
        [localNotification release];
    }
}

那么,我怎样才能让这个通知出现呢?

【问题讨论】:

    标签: iphone ios queue asihttprequest uilocalnotification


    【解决方案1】:

    您的委托没有被调用的原因可能是因为您的应用在后台暂停。如果您正在执行某种在用户关闭应用程序后继续进行的冗长网络进程,您可以在启动网络任务时使用-[UIApplication beginBackgroundTaskWithExpirationHandler:],以便您的应用程序继续在后台运行,直到您完成网络任务。但是,它仍然会过期,因此无法保证您有足够的时间完成。

    【讨论】:

    • 我知道当我使用[request setShouldContinueWhenAppEntersBackground:YES] 配置请求时,ASIHTTPRequest 会调用beginBackgroundTaskWithExpirationHandler。在后台下载文件也很好,但我仍然无法显示通知。
    • 不知道 ASIHTTPRequest 的那个特性。在那种情况下,我不确定为什么它不起作用......
    【解决方案2】:

    来自上一个 SO 问题 notification when program is in background iOS 4

    您确实意识到,当您的应用处于暂停状态时,您将不会收到任何通知——这在文档中是正确的。只有 3 类应用程序可以接收通知:音频应用程序(如 iPod 和类似物)、基于位置的应用程序和 voip 应用程序。如果您的应用是这些应用之一,则必须正确设置您的 plist。

    【讨论】:

    • 对不起,这个答案太笼统了,不能解决我的具体问题。我知道一般如何显示本地通知。我猜想在后台状态下不调用委托方法的原因是因为它是用performSelectorOnMainThread 调用的。
    【解决方案3】:

    使用这个:

    UILocalNotification *localNot = [[UILocalNotification alloc] init];
    localNot.alertBody = @"Your Text";
    localNot.alertAction = @"Name on the button";
    localNot.fireDate = [NSDate date];
    localNot.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] scheduleLocalNotification:localNot];
    

    你在做什么:

    • 创建本地通知
    • 添加 LN 的正文
    • 添加出现在“警报”上的按钮名称
    • 将 fireDate 设置为实际日期和时间(也许您需要将实际日期增加 1 或 2 秒 - 用于此用途:dateByAddingTimeInterval:
    • 设置声音名称(您也可以使用自定义声音...)
    • 计划/创建 LN

    【讨论】:

    • 我的问题不是如何显示本地通知。实际的问题是如何在后台运行时调用queueFinished
    • "如何显示 UILocalNotification...?"这就是我发布您的问题的原因。
    【解决方案4】:

    您的队列 maxConcurrentOperationCount 是否设置为 1?

    setShouldContinueWhenAppEntersBackground:YES 方法是根据每个请求设置的,并且由于队列中有一堆 ASIHTTPRequest,因此一次可能只执行其中一个。这意味着当您暂停应用程序时,队列中的其他项目甚至还没有启动,因此操作系统还不知道要保持该网络请求处于活动状态。

    我不确定解决方案,但我认为这就是您所看到的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多