iMessage Extension App

最近產(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)用抽屜。

iMessageAppEntrance.png

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)

effect.gif

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);

緊湊模式

圖片.png

擴(kuò)寬模式

圖片.png

需要注意的是系統(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];
圖片.png
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)

effect.gif

跳轉(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,610評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,939評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,668評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,004評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,173評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,426評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,656評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,833評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,247評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,580評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,371評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,621評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容