【问题标题】:UILocalNotification doesn't stop the sound when the application is brought to foreground by sliding on the alert当应用程序通过在警报上滑动进入前台时,UILocalNotification 不会停止声音
【发布时间】:2014-01-14 19:40:48
【问题描述】:

当我的应用程序在后台收到网络消息时,它会创建一个带有声音的 UILocalNotification 并调用 presentLocalNotificationNow。

    UILocalNotification* localNotif = [[UILocalNotification alloc] init];
    localNotif.alertBody = [NSString stringWithFormat:@"%@: \r%@ \r%@", NSLocalizedString(@"XXXXXXXXXXX", nil), XXXXX, XXXXXXXXXXX];
    localNotif.alertAction = NSLocalizedString(@"View", nil);

    localNotif.soundName = [NSString stringWithFormat:@"%@.%@", XXXXTONE_LONGVERSION_FILENAME, XXXXTONE_FILENAME_EXT];
    [[UIApplication sharedInstance] presentLocalNotificationNow:localNotif];
    [localNotif release];

此警报按预期以声音显示。但在某些情况下我无法停止声音。

1) 当屏幕锁定并显示此本地通知警报时:

  • 如果用户通过滑动警报解锁屏幕,声音不会停止。
  • 如果用户通过滑动“滑动解锁”解锁屏幕,它会停止声音。

2) 当应用程序在后台没有屏幕锁定时,当应用程序进入前台时,警报声音正常停止。

当应用在 didReceiveLocalNotification 和 applicationDidBecomeActive 中进入前台时,我确实取消了计划的本地通知。

    application.applicationIconBadgeNumber = 0;
    [application cancelAllLocalNotifications];

【问题讨论】:

  • 这里离题了,与你的问题无关,但是当你的应用程序在后台时,你是如何让你的应用程序接收网络消息的?它是仅在应用程序在后台运行的最初几分钟内收到的网络消息吗?
  • 这是一个 'voip' 应用程序
  • 我注意到问题总是发生在 Touch ID 上(例如在 iPhone 5s 上)。 App 是前台还是后台。设备已锁定。通知显示在锁定屏幕上。用户使用 Touch ID 解锁(不是通过滑动通知或手动输入锁定码)。然后用户打开应用程序,声音不会停止。
  • 我这里有完全相同的错误 :( 它真的是已知的 iOS7 吗?(在 iOS7.1.2 上仍然 KO)

标签: ios ios7


【解决方案1】:

这是 iOS7 的一个已知错误,令人讨厌。
如果您使用远程通知,您将遇到完全相同的问题。

解决方法是更改​​应用程序徽章计数两次,至少一步更改为值 0。 我的应用中有这个方法:

- (void)fixRing{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        // iOS7 fix for notification sound not stopping.
        // see http://stackoverflow.com/questions/19124882/stopping-ios-7-remote-notification-sound
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    }
}

不要忘记在之后有时将徽章计数更新为实际值。

编辑: 实际上,这不适用于 local 通知,而仅适用于远程(推送)通知。 [application cancelAllLocalNotifications]; 不起作用,[application cancelLocalNotification:notif]; 也不起作用...
这是我已向 Apple 报告的错误,在撰写本文时正在“处理”中。
我尝试了很多解决方法(用小声音推送通知以擦除长声音,使用计时器并用较短的声音重复通知,而不是让它持续 30 秒,等等。 ) 但没有一个有效。

请注意,Google Hangout 似乎也遇到了这个问题。所以我想没有真正的解决方案。

【讨论】:

  • 在运行 iOS 7.1 的 iPhone 5 上似乎无法使用。
  • 您能否确认它适用于哪个设备以及哪个特定版本?
  • @Gui13 这个问题还没有解决办法吗?我应该弄清楚:(
  • 唉,没有。在我的同事内部,我们认为 Apple 想要放弃这个 30 年代的功能,因为它只对 VoIP 应用有用。也许他们会提出更实质性的建议(例如 GSM 通话的通话视图??pleaaaaase)。或者更可能删除它..
【解决方案2】:

didFinishLaunchingWithOptions 中的AppDelegate 中,您会收到这样的通知:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
    // do something with it
}

检查,如果您可以使用 cancelLocalNotification: 从那里停止警报

【讨论】:

  • 是的,我正在取消“didFinishLaunchingWithOptions”中的本地通知。
  • 对象是否为空?如果是,您可能会在 receivedLocalNotification 中获得它,因为您的应用仍在运行此 voip 故事?
  • 基本上应用程序一直在运行,但它在后台并且有屏幕锁定。因此,由于 UILocalNotification 警报,当使用警报滑动时,应用程序进入 applicationWillEnterForeground,然后是 didReceiveLocalNotification,然后是 applicationDidBecomeActive。我正在取消 didReceiveLocalNotification 中的所有本地通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多