最近產(chǎn)品大人有需求準(zhǔn)備把iMessage Extension的功能集成進(jìn)公司app中,當(dāng)然我個(gè)人對(duì)這些東西也非常感興趣,遂研究了兩天。參考鏈接如下:
iOS10中Messages獨(dú)立應(yīng)用與擴(kuò)展插件詳析
使用 Xcode 8 為 Message 構(gòu)建一個(gè) Sticker App Extension
趁熱來(lái)一波,WWDC 2016 iMessage App開(kāi)發(fā)
摘要 在iOS10系統(tǒng)中,開(kāi)發(fā)者可以為自己的項(xiàng)目添加表情擴(kuò)展包或者iMessages插件,也可以獨(dú)立于應(yīng)用之外,開(kāi)發(fā)獨(dú)立的Message應(yīng)用或表情包。 iMessage App 的載體是iOS系統(tǒng)的Message應(yīng)用,通過(guò)iMessage App,用戶可以發(fā)送更加豐富的消息內(nèi)容,享受更具交互性的會(huì)話體驗(yàn)。
iMessage App入口
蘋(píng)果在系統(tǒng)的Message應(yīng)用中新增了iMessage Extension插件的入口,蘋(píng)果甚至為應(yīng)用擴(kuò)展添加了新的appStore,在Message appStore中,可以設(shè)置應(yīng)用支持iMessage Extension的話自動(dòng)或者手動(dòng)添加到Message應(yīng)用抽屜。
iMessage AppStore用來(lái)干什么的呢?
1、顯示iMessage App;
2、為未安裝應(yīng)用的用戶提供安裝途徑(Inline App Attribution);
3、提供iap,Apple Pay和訪問(wèn)相機(jī)功能。
iMessage App只能在iOS(10+)系統(tǒng)運(yùn)行,iWatch和mac可以收到消息,但是不能解析。iWatch可以發(fā)送Stickers。
iMessage App本身是一個(gè)Extension,但是它可以獨(dú)立開(kāi)發(fā),不依賴(lài)任何Container App。我們也可以在現(xiàn)有的項(xiàng)目中添加iMessage App,系統(tǒng)會(huì)自動(dòng)將其添加到Messages App Store。如果不想創(chuàng)建Container App,在Xcode 8中,直接創(chuàng)建一個(gè)Messages Application
(****File->New->Project->Application->Messages Application****);在現(xiàn)有項(xiàng)目中添加iMessage App,可以通過(guò)添加Extension的方式添加
(****File->New->Target->Application Extension->Messages Extension****)。
iMessage 新增三種會(huì)話類(lèi)型:
1、Stickers
2、Interactive Messages
3、可以發(fā)送圖片,音視頻,文本,鏈接等等
具體效果見(jiàn)下圖:(.gif圖制作工具:licecap)
Sticker Pack表情包
無(wú)論是使用系統(tǒng)提供的默認(rèn)模板還是自定義模板在上面參考鏈接中已經(jīng)有詳細(xì)的說(shuō)明,親測(cè)可用,這里不再贅述。
在現(xiàn)有工程內(nèi)集成iMessage App插件
我們?cè)诂F(xiàn)有工程中按照
****File->New->Target->Application Extension->Messages Extension****添加Message Extension后Xcode會(huì)自動(dòng)創(chuàng)建 MessageExtension文件夾,并且在該文件夾內(nèi)創(chuàng)建了MessagesViewController : MSMessagesAppViewController :UIViewController控制器,并且iOS 10中新增的Message.framework框架已經(jīng)自動(dòng)被添加到工程中。Message.framework框架中新增的主要關(guān)鍵類(lèi)如下:
MSMessageAppViewController:這個(gè)類(lèi)Messages App的基礎(chǔ)視圖控制器類(lèi),其繼承自UIViewController,但其中添加了許多Messages App相關(guān)的聲明周期方法。
MSConversation:描述一個(gè)會(huì)話實(shí)例。
MSSticker:表情貼圖實(shí)例。
MSMessage:在Messages App之間進(jìn)行傳遞的消息實(shí)體。
MSMessageLayout:抽象類(lèi),其并沒(méi)有實(shí)現(xiàn)任何方法,有子類(lèi)實(shí)現(xiàn)。
MSMessageTemplateLayout:用于對(duì)消息實(shí)體MSMessage進(jìn)行布局排版。
MSStickerBorwserViewController:用于創(chuàng)建表情包視圖控制器。
MSStickerBorwserView:表情包視圖容器,類(lèi)似CollectionView。
MSStickerView:表情承載視圖。
MSMessageAppViewController
****Xcode自動(dòng)生成的MessagesViewController類(lèi),這個(gè)類(lèi)就是此iMessages App的主界面視圖控制器。需要注意,iMessages App的視圖控制器都分為兩種狀態(tài),分別為Compact(緊湊的)和Expanded(擴(kuò)寬的)。并且在這兩種狀態(tài)進(jìn)行切換時(shí),視圖的底部的工具欄和頭部的導(dǎo)航欄也會(huì)交替出現(xiàn),所以在進(jìn)行模式切換的時(shí)候需要對(duì)界面做布局處理****。
目前所支持的模式系統(tǒng)提供了一個(gè)枚舉
typedef NS_ENUM(NSUInteger, MSMessagesAppPresentationStyle) {
MSMessagesAppPresentationStyleCompact, //緊湊模式
MSMessagesAppPresentationStyleExpanded //擴(kuò)寬模式
} NS_ENUM_AVAILABLE_IOS(10_0);
緊湊模式
擴(kuò)寬模式
需要注意的是系統(tǒng)提供了相關(guān)的API方便在兩種模式之間進(jìn)行切換
/*!
@method requestPresentationStyle:
@abstract Requests that Messages transition the extension to the specified presentation style.
@param presentationStyle The presentation style to transition to.
*/
-(void)requestPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;
MSConversation
MSMessageAppViewController類(lèi)中已經(jīng)提供了一個(gè)當(dāng)前會(huì)話實(shí)例
/*!
@property activeConversation
@abstract Current active conversation.
*/
@property (nonatomic, strong, readonly, nullable) MSConversation *activeConversation;
MSConversation指當(dāng)前的會(huì)話,即當(dāng)前的對(duì)話雙方場(chǎng)景,我們可以通過(guò)MSConversation
“發(fā)送消息”(****這里的發(fā)送消息并不是真正的發(fā)送消息,只是把消息添加到輸入框中,真正的消息發(fā)送是用戶點(diǎn)擊發(fā)送按鈕完成的****),獲取會(huì)話的用戶信息等。
MSMessage
MSMessage是消息實(shí)體,創(chuàng)建消息實(shí)體的代碼如下
MSMessage * message = [[MSMessage alloc]initWithSession:_session];
message.URL = [NSURL URLWithString:@"http://www.baidu.com"];
message.accessibilityLabel = @"message";
message.summaryText = @"message";
MSMessageTemplateLayout * layout = [[MSMessageTemplateLayout alloc]init];
layout.caption = @"caption";
layout.subcaption = @"subcaption";
layout.trailingCaption = @"trailing";
layout.trailingSubcaption =@"subtrailing";
layout.image = [UIImage imageNamed:@"ic_common_wanglibank"];
NSURL *url = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ic_common_wanglibank" ofType:@"png"]];
layout.mediaFileURL = url;
layout.imageTitle = @"易黃金";
layout.imageSubtitle = @"易黃金";
message.layout = layout;
[self.activeConversation insertMessage:message completionHandler:nil];
iMessage App lifeCycle
啟動(dòng)過(guò)程:
Message Extension啟動(dòng)
- (void)didBecomeActiveWithConversation:(MSConversation *)conversation;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
銷(xiāo)毀過(guò)程:
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
- (void)willResignActiveWithConversation:(MSConversation *)conversation;
Message Extension被系統(tǒng)銷(xiāo)毀
另外在MSMessageAppViewController在Compact和Expanded模式間進(jìn)行切換的時(shí)候,該控制器中的方法會(huì)被回調(diào),我們需要在這里對(duì)界面進(jìn)行重新布局,VC在兩種模式中的可布局空間是不同的。
//視圖控制器的模式發(fā)生變化時(shí)進(jìn)行回調(diào),可以在這里根據(jù)模式修改布局
-(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle {
// Called after the extension transitions to a new presentation style.
// Use this method to finalize any behaviors associated with the change in presentation style.
if (presentationStyle == MSMessagesAppPresentationStyleCompact) {
//緊湊的
_topConstraint.constant = 0;
_leftConstraint.constant = -15;
_bottomConstraint.constant = -44;
_rightConstraint.constant = -15;
}else
{
//展開(kāi)的
_topConstraint.constant = -85;
_leftConstraint.constant = -15;
_bottomConstraint.constant = 0;
_rightConstraint.constant = -15;
}
[self.view layoutIfNeeded];
}
關(guān)于控制器的跳轉(zhuǎn)
由于MSMessageAppViewController是繼承于 UIViewController的,所以我理解也是可以正常進(jìn)行VC跳轉(zhuǎn)的,嘗試了一下進(jìn)行跳轉(zhuǎn)
跳轉(zhuǎn)代碼同平時(shí)的一樣
//擴(kuò)展模式下 進(jìn)入子頁(yè)面
//MessageChildVC 是我創(chuàng)建的VC
[self presentViewController:[[MessageChildVC alloc] init] animated:YES completion:nil];
基本的頁(yè)面布局及邏輯跳轉(zhuǎn)弄清楚了,剩下的就等產(chǎn)品及設(shè)計(jì)天馬行空,文章中很大一部分非原創(chuàng),參考或者直接拷貝了所列鏈接作者的勞動(dòng),非常感謝各位的勞動(dòng)。
學(xué)習(xí)的過(guò)程中寫(xiě)的HostIMessageExtensionApp Demo已經(jīng)上傳,想看或者懶得動(dòng)手的小伙伴請(qǐng)移步gitHub。