2009-12-13 93 views
9

通过使用applicationWillResignActive和applicationDidBecomeActive,我可以检测到iPhone进入睡眠状态并从睡眠中回来。但是,我怎么知道它是什么样的中断。我正在制作一个音频播放器应用程序,并且需要在iPhone进入睡眠状态时保持音频播放(我知道该怎么做)。但是当消息,闹钟或低电池电量中断发生时,我需要中断音频。当事件结束时,我还需要恢复音频。检测iPhone中断的类型

那么如何区分这些不同的中断。

回答

5

该信息可能不适用于您的应用,但这里有一些要尝试的操作。

  1. applicationWillResignActive:,检查NSNotification的对象和用户信息的属性,看看是否有任何提示存在。

  2. 注册,就能获得所有通知张贴到默认的通知中心:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:nil object:nil]; 
    

什么时候张贴你的方法将被调用。记录通知对象和userInfo字典,也许你会看到一个有用的通知张贴。如果你找到一个,你可以注册。

  1. 这是最棘手的问题,但您可能可以访问显示的警报,如果它是消息或电池警告。警报通过应用程序的主UIWindow显示在UIWindow中。您可以注册UIWindowDidBecomeVisibleNotification,然后查看窗口的子视图,查看是否可以找到警报或其他有用的线索。

以上所有方法都将依赖未记录的行为来工作,并且可能会让您的提交在App Store中被拒绝。它们都不涉及私人方法调用,但您可能会认为观察未记录的通知名称将视为私有API。最后,苹果的意见是唯一重要的。

就我个人而言,我会尝试一下,确保代码在系统发生变化时优雅地失败。

+1

尝试过A和B,但它全部空了。用户信息中没有描述或键值对。对象也没有。它奇怪苹果如何错过这样简单的功能。没有尝试C,因为它看起来太hacky,即使对我来说。 – Prashant 2009-12-15 06:12:32

+1

你可能想重新考虑一下C:如果你只是假设在你的应用上显示的任何*警告都是暂停音乐的理由,那么你将不会做任何没有记录的事情。它只是围绕视图层次结构来读取将是hacky的警报文本。 – benzado 2009-12-15 06:21:42