ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 11 Messages Framework の変更点

iOS 11 関連記事
iOS 11 UIKit の変更点 - ObjecTips
iOS 11 Foundation の変更点 - ObjecTips
iOS 11 PDFKit - ObjecTips
iOS 11 Core Image の変更点 - ObjecTips
Vision framework でテキスト検出 TextDetection - ObjecTips
Vision Framework で水平角検出(傾き) Horizon Detection - ObjecTips

Messages Framework

MSConversation
- (void)sendMessage:(MSMessage *)message completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_AVAILABLE_IOS(11_0);
- (void)sendSticker:(MSSticker *)sticker completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_AVAILABLE_IOS(11_0);
- (void)sendText:(NSString *)text completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_AVAILABLE_IOS(11_0);
- (void)sendAttachment:(NSURL *)URL withAlternateFilename:(nullable NSString *)filename completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_AVAILABLE_IOS(11_0);

これまではテキスト入力エリアにテキストや画像、ステッカーを入力、添付する事しか出来ず送信のアクションはユーザ自身が送信ボタンを押す必要があった。
送信の最終決定権はユーザにあるという事でポリシーとして納得していたけど iOS 11 では送信アクション自体をアプリから実行する事が出来るらしい。
アプリがバグってたらユーザの意図しない内容のメッセージが送られたりしてしまうけど本当にユーザのプレビューと送信アクション無しで大丈夫かな?
その心配より利便性を取ったのかも知れない。ユーザは便利になる一方開発者にはより責任が求められる。

MSMessagesAppPresentationStyle
MSMessagesAppPresentationStyleTranscript NS_ENUM_AVAILABLE_IOS(11_0),

MSMessagesAppViewController の表示状態を表すものとして Compact と Expand があったがそれに追加で Transcript という状態が加わったらしい。

MSMessagesAppCompactOrExpandedPresentation
MSMessagesAppTranscriptPresentation

この2つのプロトコルも追加された。

MSMessageLiveLayout
NS_CLASS_AVAILABLE_IOS(11_0)
@interface MSMessageLiveLayout : MSMessageLayout

ライブレイアウトが何かは分からないけど多分WWDCのセッションでデモが行われるだろう。
ライブレイアウト非対応のデバイスでは以下のレイアウトが使われるとの事。

@property (nonatomic, readonly) MSMessageTemplateLayout *alternateLayout;
MSMessageErrorCode
    MSMessageErrorCodeUnknown NS_ENUM_AVAILABLE_IOS(11_0) = -1,
    MSMessageErrorCodeSendWithoutRecentInteraction NS_ENUM_AVAILABLE_IOS(11_0),
    MSMessageErrorCodeSendWhileNotVisible NS_ENUM_AVAILABLE_IOS(11_0),

ドキュメントが無いので詳細が分からないけど

  • 1つめは不明なエラー
  • 2つ目はユーザが何も操作していない状態で送信を実行した時のエラー
  • 3つ目はアプリが表示されていない時に送信を実行した時のエラー。

おそらく後ろ2つについてはプログラムからメッセージの送信を実行出来る様になったとは言え、これらのケースの様なユーザが認識しないタイミングで勝手にメッセージを送信させないというポリシーに基づいてエラーが発生する様になっているんだと思う。

まとめ

アプリからメッセージ送信を実行出来る、でも変なタイミングで送ってもエラーが起きる。
ライブレイアウトはセッションの情報待ち。