2012-01-23 120 views
2

MFMessageComposeViewController的文檔說您應該在嘗試創建MFMessageComposeViewController之前檢查[MFMessageComposeViewController canSendText]MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification的原因

它還說:

中的iOS 5.0或更高版本,你應該爲MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification通知的觀察者通知在發短信的可用性改變的註冊。

發生短信變化的可能原因是什麼? 難道只是make Linus Torvalds cry

背景:我正在創建一個需要能夠發送短信的iOS應用程序。我在Info.plist中加入了smsUIRequiredDeviceCapabilities。它應該只在iPhone上運行(根據蘋果的文檔,我讀的地方這包括iPod touch上或僅與iMessage的解鎖iPhone和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觸摸,但是,必須有一個錯誤(無論是在我的測試代碼還是蘋果公司的產品中)都會阻止它正常工作。

如果您需要此通知,我嘗試在UIApplicationDidBecomeActiveNotification上再次檢查[MFMessageComposeViewController canSendText]。這有時會起作用,但是如果您在Settings.app和您的應用之間快速切換,那麼切換到您的應用時可能還沒有更改,導致canSendText仍然反映舊值。

我現在的解決方案只是在做出相關決定之前簡單地檢查canSendText,並且處理(可能的)情況,即在沒有我以某種適當方式知道的情況下它可能已經改變。

回答

1

目前,有無案例其中MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification發送。

canSendText的值發生變化的唯一時間是在iPad或iPod Touch(不是帶有SMS消息的iPhone)上打開/關閉iMessage時。

即使canSendText變化,不會發送任何通知。 (除非它只是一個錯誤我test code?)這似乎是蘋果的代碼中的錯誤或丟失的功能。

2

由於MFMessageComposeViewController可以在iOS5中使用iMessage,我猜測這可能是爲了處理iPod Touch和Wi-Fi iPad在鍵入消息時失去互聯網連接的情況。

+0

這是一個好主意 - 我會確保這下一次我有一個iPod Touch的訪問我的測試。 – DouglasHeriot

+0

另一種思考 - 當被的iMessage和關閉打開的iPod觸摸它可能是? – DouglasHeriot

+0

您應該可以在iPhone上測試這種情況,方法是開啓飛行模式,然後打開Wifi並走出wifi熱點的範圍。 是的,這也應該處理的人改變他們的iMessage狀態的情況下。 –

2

我設法排除另一種情況下它不會觸發MFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification

  • 發件人的iPad與工作wifi連接
  • Reciepient Android手機

結果:MessageComposeResult == MessageComposeResultSentMFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification沒有觸發

接下來,我嘗試同樣的場景,其中的iMessage,以複製最終結果。 (==不能發送iMessage)。

然後我意識到,iMessage能夠提前告訴我這將永遠不會工作,通過在收件人姓名旁邊加上一個紅色驚歎號,並顯示此人沒有向iMessage註冊的消息。 MFMessageComposeViewController不這樣做!

我現在的結論是:canSendText應該命名爲canComposeTextMFMessageComposeViewControllerTextMessageAvailabilityDidChangeNotification什麼都不做。

+0

有趣的是,MFMessageComposeViewController完全不警告你,而Messages.app卻是。特別是對於iPad/iPod,這是一個非常糟糕的錯誤! - 基本上使它完全無法用於iPad/iPod,因爲用戶會感到困惑。絕對是你/我應該向蘋果報告的東西。 我也注意到在iPhone上它總是顯示電話號碼和發送按鈕爲藍色,而Messages.app將在使用SMS消息時切換爲綠色。 – DouglasHeriot