iOS10 iMessage貼紙app開發,從零開始做自己的iMessage 表情包應用

????iOS10 蘋果推出了Messages.framework ,它允許開發者創建獨立的貼紙app(表情包),或者是某個app的iMessage 擴展應用(可以是表情包也可以是主工程的iMessage插件)。
????總之,可以自己在iMessage里面搞表情包啦~~

目錄:

  1. 一行代碼不用寫,實現iMessage Stickers App
  2. 使用代碼實現iMessage Stickers App
  3. 我們還能做些其他的什么?
    ??-自定義compact控制器和expanded控制器
  4. 小結

1、一行代碼不用寫,實現iMessage Stickers App


????新建工程,工程模版選擇為Sticker Pack Application,如下圖:

iMessage Stickers Project.png

????創建好的新工程非常干凈,只需要將你的貼紙拖拽到右側的Sticker Pack中即可。

Sticker Pack.png

????之后直接run一下,效果圖如下:
Sticker Pack Application.gif

????一行代碼沒有寫,驚不驚喜!意不意外!~

hahha.jpg

????當然Sticker Pack也是有圖片類型要求的,如下圖:

圖片支持.png

????蘋果推薦使用PNG或者APNG,而不推薦使用gif,原因在于關于透明度等的處理上,PNG和APNG要優于gif,如下圖:

PNG和gif對比.png
????那么如何導入APNG的動圖呢?

????在Sticker Pack下右鍵選中Add assets->New Sticker Sequence

New Sticker Sequence.png

????然后就會創建出一個新的Sticker Sequence,之后將動圖每一幀的PNG圖拖進去就行了。

Sticker Sequence Frame.png

????當然除了默認的每行三個圖的顯示模式,蘋果還提供另外兩種顯示模式:

設置每行顯示的表情個數.png

????而每種顯示模式下對于圖片的尺寸要求也是不同的,如下圖:

尺寸要求.png

2、使用代碼實現iMessage Stickers App


????使用Sticker Pack Application創建的Stickers App,每次更新貼紙需要進行版本迭代。如果想做成動態從服務器獲取的就不能使用Sticker Pack Application工程模版了。
????下面我們通過另外一種方式,使用代碼創建出一個Stickers App,看看Sticker Pack Application工程模版中蘋果都為我們做了哪些事情。
????首先新建工程,工程模版選擇為iMessage Application,如下圖:

iMessage Application.png

????創建好的工程中包含:
??- MessagesViewController
??- MainInterface.storyboard
??- Assets.xcassets
??- Info.plist

????其中MainInterface.storyboard是我們的iMessage Extension App啟動時的根控制器,而MessagesViewController就是sb對應的vc。
????Assets.xcassets照例是icon圖片存放的地方
????Info.plist則是我們的iMessage app相關配置文件

????如果我們不想用sb怎么辦呢?找到Info.plist把這個keyNSExtensionMainStoryboard對應的鍵值對刪掉,添加新的keyNSExtensionPrincipalClass,value為你的控制器。

????打開Messages.framework,我們可以看到MS框架的相關頭文件。

MS頭文件.png

????在這個demo中,我們可以把注意力先放到:MSStickerMSStickerViewMSStickerBrowserViewDataSourceMSStickerBrowserViewController這幾個類里面。
????其中每一個貼紙都是放在一個MSStickerView上的,MSStickerView對應的貼紙的一些屬性信息數據源就是MSSticker
????MSStickerBrowserViewController我們可以類比為UICollectionViewController,而MSStickerBrowserViewDataSource就是我們的數據源代理。
?
????快速理解MS框架的api,我們可以繼承自MSStickerBrowserViewController,實現我們自己的MyStickerViewController。
????首先構建數據源數組,數組中是MSSticker對象

-(NSMutableArray *)stickersArrayM{
    if (!_stickersArrayM) {
        _stickersArrayM = [NSMutableArray array];
        
        for (int i = 1; i < 6; i ++) {
            
            NSString *imageName = [NSString stringWithFormat:@"test%d",i];
            
            NSString *stickerPath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"];
            
            NSURL *stickerUrl = [NSURL fileURLWithPath:stickerPath];
            
            MSSticker *sticker = [[MSSticker alloc] initWithContentsOfFileURL:stickerUrl localizedDescription:imageName error:NULL];
            
            [_stickersArrayM addObject:sticker];
        }
    }
    return _stickersArrayM;
}

????之后實現MSStickerBrowserViewDataSource的兩個數據源方法。

#pragma mark - MSStickerBrowserViewDataSource
// 返回貼紙數量的代理方法
- (NSInteger)numberOfStickersInStickerBrowserView:(MSStickerBrowserView *)stickerBrowserView{
    return self.stickersArrayM.count;
}
// 當前index顯示的MSSticker對象
- (MSSticker *)stickerBrowserView:(MSStickerBrowserView *)stickerBrowserView stickerAtIndex:(NSInteger)index{
    
    return self.stickersArrayM[index];
}

????在MessagesViewController中初始化我們自己的MyStickerViewController控制器。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    MyStickerViewController *myStickerViewController = [[MyStickerViewController alloc] initWithStickerSize:MSStickerSizeSmall];
    
    [self addChildViewController:myStickerViewController];
    
    [self.view addSubview:myStickerViewController.view];
}

????這里是demo

????其中MessagesViewController是我們的iMessage Extension App的根控制器,用于處理來自iMessage的回調以及具體視圖的顯示。
????而我們繼承自MSStickerBrowserViewController的MyStickerViewController則包含了MSStickerBrowserViewMSStickerBrowserViewDataSource數據源。如下圖所示:

MessagesViewController示意圖.png

3、我們還能做些其他的什么?


????那么除了固定的sticker貼紙app,我們還能做些其他的什么嗎?
????當然,iMessage Extension App并不只有那么一小塊顯示區域。我們還可以自定義expanded控制器,來實現其他需求。
????下圖是一個compact控制器與expanded控制器切換交互,并給compact控制器添加新sticker的一個演示:

compact與expand切換交互.gif

????接下來一起來看看是怎么實現的。

自定義compact控制器和expand控制器

????同樣使用iMessage Application工程模版創建一個新的工程。
????接下來創建兩個控制器:
????一個是MyCustomCompactViewController繼承自UIViewController,它用來顯示我們的compact sticker,并由它來叫出我們的expand控制器。
????另外一個控制器是AddStickerViewController,就是我們的expand控制器了。

控制器目錄.png

????其中MyCustomCompactViewController包含了一個collectionView,其中collectionView的第一個cell為加號按鈕;其他cell為sticker展示的cell,每一個中都包含了一個MSStickerView
????而AddStickerViewController就是一個簡單的展示的控制器,包含了一個collectionView。

????下面我們回到MessagesViewController,關于compact控制器和expand控制器的彈出與隱藏,最主要的方法就是:

  -(void)requestPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

????調用方法requestPresentationStyle,根據傳入的presentationStyle值,來做compact與expand的切換。
????注意還需要在轉場過渡結束方法中,將expand控制器移除。即下面這個方法:

  -(void)didTransitionToPresentationStyle:(MSMessagesAppPresentationStyle)presentationStyle;

????具體細節可以查看demo

小結

????上面的demo只是演示了最基本的compact控制器和expand控制器過渡切換和簡單交互,而反映到實際開發中iMessage Extension App不只是用來做貼紙app,也可以作為主app的iMessage插件,做一些輔助的快捷操作,如:淘票票中的邀請好友一起來選座,某些場景下的音視頻文件的共享等。

????而且,iMessage Extension App也是可以訪問相機相冊,和麥克風的。iMessage Store上還有很多
基于iMessage Extension實現的小游戲,不得不說,越來越好玩啦~

???????筆者也上架了幾個貼紙應用,雖然賣不幾個錢,但維持每年上交的開發者保護費還是可以的。???

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容