MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification的原因

时间:2012-01-23 04:28:05

标签: objective-c cocoa-touch ios5 sms

MFMessageComposeViewController的文档说您应该在尝试创建[MFMessageComposeViewController canSendText]之前检查MFMessageComposeViewController

它还说:

  

在iOS 5.0或更高版本中,您应该注册为MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification通知的观察者,以便收到有关发送短信可用性变化的通知。

可能有哪些原因可以改变短信的消息? 仅仅是make Linus Torvalds cry吗?

背景:我正在创建一个需要能够发送短信的iOS应用。我已在sms中将UIRequiredDeviceCapabilities添加到Info.plist。它应该只在iPhone上运行(根据Apple文档,我在某处读到包含iPod touch或仅使用iMessage的iPad)

如果短信不可用,则该应用程序无用,应该会显示一些有用的错误消息。

更新:我已经使用我的iPhone 4S进行了测试,只是锁定的SIM卡仍然从canSendText返回YES - 仍然不是消息发送能力发生变化的原因。

更新#2 :我创建了simple test app以查看可能导致此问题的原因。 我根本没有收到通知。

不会导致MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification

的事情
  • 打开iMessage&关
  • 失去WiFi连接
  • 启用飞行模式
  • 锁定iPhone SIM卡

可能导致canSendText在YES / NO(但不发送通知)之间变化的事情

  • 打开iMessage&关闭iPad(我也认为是iPod touch)

我猜测iMessage开启或关闭时iPad和iPod触摸的正确情况是正确的,但是,必须存在一个错误(无论是在我的测试代码还是Apple中)都会阻止它工作。

如果您需要此通知,我尝试在[MFMessageComposeViewController canSendText]上再次检查UIApplicationDidBecomeActiveNotification。这有时会有效,但如果您在Settings.app和您的应用之间快速切换,那么当您切换到应用时,它可能尚未更改,导致canSendText仍然反映旧值。

我现在的解决方案就是在做出相关决定之前简单地检查canSendText,并处理(罕见的)情况,如果没有我以适当的方式知道它可能会发生变化。

3 个答案:

答案 0 :(得分:2)

由于MFMessageComposeViewController可以在iOS5中使用iMessage,我猜这可能是为了处理iPod Touch和Wi-Fi iPad在输入消息时丢失互联网连接的情况。

答案 1 :(得分:2)

我设法排除了另一种不会触发MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification的情况。

  • 发送iPad,带有无线网络连接
  • Reciepient Android手机

结果:MessageComposeResult == MessageComposeResultSentMFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification未被触发

接下来,我尝试了与iMessage相同的场景,以复制最终结果。 (==无法发送iMessage)。

然后我意识到iMessage能够告诉我提前这将永远无法通过在收件人姓名旁边添加红色感叹号,并且此人未在iMessage中注册。 MFMessageComposeViewController不会这样做!!!

我目前的结论是:canSendText应命名为 canComposeText MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification什么也没做。

答案 2 :(得分:1)

目前,有无案例,其中MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification已发送。

唯一一次canSendText更改的值是在iPad或iPod Touch上打开/关闭iMessage时(不是具有短信息的iPhone)。

即使canSendText发生更改,也不会发送通知。 (除非它只是我test code中的一个错误?)这似乎是Apple代码中的错误或缺失功能。