iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification

Posted

技术标签:

【中文标题】iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification【英文标题】:iOS 8 Beta 6 - Handling a UILocalNotification when the app is in Background 【发布时间】:2014-08-14 13:35:53 【问题描述】:

我正在创建一个用于创建警报的应用程序。如果应用程序不在后台或处于非活动状态,则一切正常。但是,如果应用程序处于非活动状态(因为我按下了主页按钮或按下了锁定按钮),当通知发生时,在滑动或触摸横幅后,代码不会执行并且应用程序不会完成其操作.

我在这里和网上阅读了很多主题,但没有什么可以帮助我。文档说:

ios 中,您可以通过检查应用程序状态来确定应用程序是否由于用户点击操作按钮而启动,或者通知是否已发送到已运行的应用程序。在委托的 application:didReceiveRemoteNotification: 或 application:didReceiveLocalNotification: 方法的实现中,获取 applicationState 属性的值并对其进行评估。如果值为 UIApplicationStateInactive,则用户点击了操作按钮;如果值为 UIApplicationStateActive,则应用程序在收到通知时位于最前面。

但滑动或点击通知后似乎没有调用 application:didReceiveLocalNotification: 方法。当发生通知且应用处于非活动状态时,不会调用此方法。如果应用程序处于非活动状态,如何执行通知处理代码?

这是我的代码:

func application(application: UIApplication!, didReceiveLocalNotification notification: UILocalNotification!)


    if(UIApplication.sharedApplication().applicationState == UIApplicationState.Active)
    
        .

        println("Notification recieved and handled when inactive")

        .

    

   .
   .
   .


当我的应用程序处于后台或非活动状态或处于锁定屏幕且我的应用程序仍然“活动”时(当我的应用程序处于前台时按下锁定屏幕按钮时),所有这些代码都不会执行。在这些情况下如何处理本地通知?我如何识别应用程序是否因为发生本地通知而变得活跃?我没有找到解决这个问题的方法。

【问题讨论】:

ios8 处于保密协议之下。你可以在 Apple DevForums 中提问 此外,Apple 同意,对于 Apple 在 WWDC(Apple 全球开发者大会)上披露的有关预发布 Apple 软件和服务的技术信息,您将不受上述保密条款的约束,但以下情况除外:您不得发布屏幕截图、撰写公开评论或重新分发任何预发布的 Apple 软件或服务。 iOS 8 不再受保密协议约束。我遇到了同样的问题。你解决了吗? 是的,正如@Daij-Djan 所说,正确答案如下。 【参考方案1】:

两种情况:

1 .当您的应用程序未运行时,仅调用 applicationDidFinishLaunching。 (从未被杀或被杀)

在这种情况下,launchOptions NSDictionary 包含 UIApplicationLaunchOptionsLocalNotificationKey


2 。如果它正在运行 - 无论状态如何 - 都会调用 didReceiveLocalNotification

在这种情况下,请使用 UIApplication.sharedApplication().applicationState 查看您的应用在哪里

注意:对于 ios8,还有更多工作要做

【讨论】:

也许你不明白我的问题,是我的错,因为我的英语不好。我会尝试更好地解释:我的问题是如何在应用程序状态为“暂停”时处理本地通知。 applicationDidFinishLaunching 方法在应用程序第一次启动时调用,当它没有运行时(如你所说)。但我的情况涉及应用程序何时运行但我单击主页按钮或锁屏按钮。我希望这更清楚。 按下home键时IOS可以暂停或关闭应用 好的。我的问题是没有调用此方法。我尝试在 didReceiveLocalNotification 中使用 NSLog(...) 检查应用程序状态,但是当它被调用时,什么也没有发生。如果当我点击通知横幅时,如果我的应用程序处于后台,我已经很好地理解了,则应该调用 didReceiveLocalNotification 方法,但无事可做。我很沮丧! iOS 8 Beta 6。对不起,我应该把这个放在这个问题上。 那么你做了所有 ios8 特定的东西吗?哦,它在 NDA 下【参考方案2】:

你需要用你的用例来实现,在这里唤醒你的通知 .它会在您的应用处于后台并且有预定的本地通知时间起床时通知您的应用..

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

【讨论】:

【参考方案3】:

在 iOS 上,当应用因按下锁定按钮等原因而暂停时,您需要将通知优先级更改为“高”。 这是我之前用过的一个测试代码sn-p:

from gcm import GCM
import time
gcm = GCM('iOS Application ID issued by Google')
notification_topic = 'topic_name'
notification_text = '"ticker": "XD", "company_name": "Vulchiany Technologies", "buy_target": "89.55", "profit_sell": "89.99", "loss_sell": "89.11", "alert_time": "' + time.strftime("%b %d, %Y %I:%M %p")+'"'

for j in range(1,8):
    for i in range(1, 11):
        gcm.send_topic_message(topic=notification_topic, priority="high", notification="body": "XD: Buy Target: $89.55", "title" : "Alert", data='message': notification_text)
        time.sleep(3)
        print(notification_text)
        print('Notification sent on ', time.strftime("%b %d %Y %I:%M %p"))
    time.sleep(3600)

【讨论】:

这不能回答问题。 请澄清为什么我的回答没有回答 OP 的问题。用他自己的话说:“但我的情况涉及应用程序何时运行,但我点击主页按钮或锁屏按钮。我希望这更清楚”。我已经准确地解决了这一点,并提供了一个实际使用的示例。谢谢。 最重要的是,问题不在于 Google Cloud Messaging,而是指 iOS 8 SDK。

以上是关于iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序使用 ios 8 在前台时,调度程序 UILocalNotification 不起作用

当应用程序在 iOS 中处于后台时,openURL 不起作用

当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用

当应用程序处于后台时,iOS 处理通知和有效负载

IOS - 从UNNotificationAction触发后,当应用程序处于后台时发送http请求

当应用程序处于后台时,在 iOS appDelegate didReceiveRemoteNotification 中调用 lambda 函数