iOS 10 創建自己的iMessage App

申請完賬號,我們就得有一個自己的APP我選的是盆友推薦的類型iMessage表情包,下面我就來介紹一下該表情包的創建。(同時附上盆友簡書的鏈接@kurt_wang

騷年們,整天斗圖可否想過創造自己的斗圖表情包!可否想過斗自己的圖,霸他人的屏。(ps:哈..哈..哈..想想都很嗨??)

隨著iOS10的發布,蘋果對開發者開放了Messages應用程序,以提供開發者創建自己的iMessage App,其包含簡單的表情包到可以交互的復雜界面。

此外還要說明一點, iMessage apps 只有效于iOS系統, 但它的內容可以在MacOS和watchOS上顯示,watchOS 3的用戶能夠查看最近使用的表情包,并可以從蘋果的手表把這些表情直接直接發給聯系人。

廢話不多說,就一個字??

640.png

iMessage App 創建有兩種模板:
一、Sticker Pack Application
二、iMessage Application

一、通過Sticker Pack Application模板創建
創建新工程,選擇模板Sticker Pack Application

640.jpeg

下圖為新建好的iMessage應用,然后我們將事先做好的表情包直接拖到Sticker Pack下便可(如下圖)

640-1.jpeg
640-2.jpeg

對,你沒看錯,無需一行代碼便可創建自己的表情包應用,驚不驚喜,意不意外,害不害怕,下面就讓我們看一下運行效果:

640-3.jpeg

同時蘋果還給我們提供了表情的排布樣式,共分三種:small、Medium、Large;它們的展現形式如下圖:

640.jpeg

關于GIF有兩種導入形式:
1.是和圖片一樣直接拖到Sticker Pack下便可
2.是點擊Stickers.xcstickers-->Sticker Pack右鍵選中New Sticker Sequence; 然后把幀圖拖到新建的 Sticker中即可(如下圖):

640.jpeg

對于表情圖片大小蘋果雖然沒有嚴格限制,但還是給出了建議大小:

640-1.jpeg

另外還有其他的一些限制:

640-2.jpeg

二、通過iMessage Application模板創建
此處說明一下,基本的表情應用程序提供的模板可能不完全滿足需求;處于這個原因, 蘋果提供了一種方法來使你創建更為復雜的標簽應用程序,這個便是iMessage Application,下面就讓我們一起來做一下吧 。

創建新工程,選擇模板iMessage Application

640.jpeg

創建完項目我們看到一個干凈的空項目如下圖:

640.jpeg

接下來我們把精力放在MessageExtension文件夾下:
1. MessagesViewController.swift : iMessage app的程序入口;
2. MainInterface.storyboard: 可視化操作;
3. Assets.xcassets: 圖片集合;
4. Info.plist : 配置一些擴展信息;

打開MessagesViewController.swift , 你會發現它是MSMessagesAppViewController的子類, 而再往上看父類就是UIViewController, 這意味著在iMessage APP中都符合UIKit的標準;

點擊MSMessagesAppViewController你會發現它提供了很多回調函數,你可以覆蓋他們, 進一步定制應用程序的功能。接下來讓我們來一步一步實現:

1.遵守MSStickerBrowserViewDataSource協議

class MessagesViewController: MSMessagesAppViewController, MSStickerBrowserViewDataSource {

...

}
將圖片導入包:

640-1.jpeg

接下來讓我們構建數據源數組

///  創建數據源
lazy var dataArray: [MSSticker] = {    
    var array:[MSSticker] = []        
    for i in 1...24 {            
        if let url = Bundle.main.path(forResource: "\(i)", ofType: "png") {                do {                
               let temp = URL.init(fileURLWithPath: url)                    
                let sticker = try MSSticker(contentsOfFileURL: temp, localizedDescription: "")
                array.append(sticker)
            } catch {                    print(error)
            }
        } else if let url = Bundle.main.path(forResource: "\(i)", ofType: "gif") {                do {                    
                let temp = URL.init(fileURLWithPath: url)                    
                let sticker = try MSSticker(contentsOfFileURL: temp, localizedDescription: "")
                array.append(sticker)
            } catch {                    print(error)
            }
        }else {            
            print("如果格式不是gif也不是png請自行添加判斷")
            
        }
    }        
    return array
   
}()

然后創建MSStickerBrowserViewController作為根視圖, 并設置寬高約束:

///  創建MSStickerBrowserViewController視圖
func createStickerBrowser() {        
    let controller = MSStickerBrowserViewController(stickerSize: .large)
    
    addChildViewController(controller)
    
    view.addSubview(controller.view)        
    //語法變了
    controller.stickerBrowserView.backgroundColor = UIColor.blue
    
    controller.stickerBrowserView.dataSource = self
    
    view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true
    
    view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true
    
    view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
    
    view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true
    
}    

接下來實現MSStickerBrowserViewDataSource代理方法(必須實現):

func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {        
        return dataArray.count
}    
func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {        
        return dataArray[index]
}    

ok,代碼添加完畢,在viewDidLoad中調用createStickerBrowser函數
iewController
override func viewDidLoad() {
super.viewDidLoad()

    createStickerBrowser()
    
}

MessagesViewController
最后運行代碼讓我們看一下運行效果:

640-2.jpeg

最后介紹關于iMessage應用的一個獨特的消息。
依然是第二種創建項目的形式在此基礎上我們稍作擴展,在視圖MessagesViewController添加按鈕 “創建Message”:
如下代碼

/// 創建
func creatMessageBtn() {

    let creatBtn = UIButton(frame: CGRect(x: 100, y: 100, width: 200, height: 200))
    
    creatBtn.addTarget(self, action: #selector(touchBtn), for: .touchUpOutside)
    
    creatBtn.backgroundColor = UIColor.white
    
    view.addSubview(creatBtn)
    
}

接下來, 寫代碼的時刻到啦, 第一步我介紹一些用到的類:

  1. MSConversation: 代表了當前打開的對話。可以使用這個類來操作一些步驟,例如通過插入消息或當前選擇的信息;
  2. MSMessage: 代表單個消息,判斷是否由你插入對話或已經存在的對話;
  3. MSMessageTemplateLayout: 創建一個消息氣泡,如下圖, 里邊有許多屬性和空間來提供給你來自定義message;
640.jpeg

特別提醒, 左上角的空間是展示你的icon, 所有的屬性都是可選的, 提供任何標題字符串將擺脫底部部分的布局。
創建image

func creatImage() -> UIImage? {

    let background = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    background.backgroundColor = UIColor.red
    
    let label = UILabel(frame: CGRect(x: 75, y: 75, width: 150, height: 150))
    label.font = UIFont.systemFont(ofSize: 56.0)
    label.backgroundColor = UIColor.brown
    label.textColor = UIColor.white
    label.text = "Message"
    label.textAlignment = .center
    label.layer.cornerRadius = label.frame.size.width/2.0
    label.clipsToBounds = true
    
    background.addSubview(label)
    background.frame.origin = CGPoint(x: view.frame.size.width, y: view.frame.size.height)
    view.addSubview(background)        
    UIGraphicsBeginImageContextWithOptions(background.frame.size, false, UIScreen.main.scale)
    background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()
    
    background.removeFromSuperview()        
    return image
    
}

點擊創建Message按鈕把MSMessage對象并插入到會話中:

/// 創建表情點擊事件
func touchBtn() {
if let image = creatImage(), let conversation = activeConversation { let layout = MSMessageTemplateLayout()
layout.image = image
layout.caption = "Stepper Value"
layout.subcaption = "subcaption"
layout.trailingCaption = "trailingCaption"
layout.trailingSubcaption = "trailingSubcaption"

        let message = MSMessage()
        message.layout = layout
        message.url = URL(string: "www")
        
        conversation.insert(message, completionHandler: { (error: NSError?) in
            
            } as? (Error?) -> Void)
    }
    
}

要注意, 在iMessage中自定義message必須要設置layout和URL, 這個URL是鏈接某個web頁面的一些內容, 進而MacOS用戶可以看到iMessage的內容, 在這個例子中, 我們只是創建了簡單的字符URL;

最后我們將這個message插入到當前活動的會話中, 調用這個方法不會發送信息, 相反,它把你的信息在用戶的輸入字段,以便他們可以發送。

運行效果如下圖:

640-1.jpeg

下面奉上github地址: Demo

好吧!到此為止,簡要介紹了iMessage App的創建方式,剩下的就是小伙伴們動動手構建自己的App咯??

小可愛表情包下載地址:小可愛表情包

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

推薦閱讀更多精彩內容