利用剪切板,添加表情到whatsapp

寫(xiě)在前面

雖然在國(guó)內(nèi)用whatsapp 的人不多, 但在香港等地方大部分還是用whatsapp,這一章我們來(lái)討論討論怎么添加表情到whatsapp, 也可以看whatsapp 的Guide
它里面主要介紹的是利用它的lib來(lái)集成,有現(xiàn)成的案例,這里就不多說(shuō)了.
我們主要談?wù)撓略趺蠢眉羟邪鍋?lái)添加,也就是第二種方法. 當(dāng)然這添加的表情也是來(lái)自本地的,如果需要從server 獲取也可以,但相對(duì)來(lái)說(shuō)會(huì)麻煩一點(diǎn),但確實(shí)是可以的.

  • 圖片的格式,大小等,請(qǐng)看guide, 本文只討論發(fā)送到whatsapp

開(kāi)始

  • 在Info.plist中添加,
<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>whatsapp</string>
    </array>

我們都知道LSApplicationQueriesSchemes的作用是為了雙方測(cè)試.加這個(gè)可以判斷你的手機(jī)是否安裝了whatsapp

判斷安裝,如果沒(méi)有安裝whatsapp return false;

func canSend() -> Bool {
        return UIApplication.shared.canOpenURL(URL(string: "whatsapp://")!)
}

使用下面描述的結(jié)構(gòu)將貼紙數(shù)據(jù)格式化為JSON對(duì)象,

{
  "ios_app_store_link" : "String",
  "android_play_store_link" : "String",
  "identifier" : "String",
  "name" : "String",
  "publisher" : "String",
  "tray_image" : "String", (Base64 representation of the PNG, not WebP, data of the tray image)
  "stickers" : [
    {
      "image_data" : "String", (Base64 representation of the WebP, not PNG, data of the sticker image)
      "emojis" : ["String", "String"] (Array of emoji strings. Maximum of 3 emoji)
    }
  ]
}
  • 重要

tray_image使用PNG,而image_data使用WebP, 再轉(zhuǎn)成data string 的形式
一次只能發(fā)送一個(gè)貼紙包

  • 步驟

我們需要先將數(shù)據(jù)復(fù)制到Pasteboard
然后再打開(kāi)whatsapp://stickerPack, 它會(huì)跳到whatsapp ,之后whatsapp會(huì)自己從Pasteboard中獲取sticker

代碼

import UIKit

struct Interoperability {
    // whatsapp guide 中說(shuō)不要包含這個(gè)Id.
    private static let DefaultBundleIdentifier: String = "WA.WAStickersThirdParty"
    private static let PasteboardExpirationSeconds: TimeInterval = 60
    // 請(qǐng)保持這個(gè).
    private static let PasteboardStickerPackDataType: String = "net.whatsapp.third-party.sticker-pack"
    private static let WhatsAppURL: URL = URL(string: "whatsapp://stickerPack")!

    static var iOSAppStoreLink: String = "https://itunes.apple.com....";
    static var AndroidStoreLink: String = "https://play.google.com/....";

    static func canSend() -> Bool {
        return UIApplication.shared.canOpenURL(URL(string: "whatsapp://")!)
    }
    
    // 這個(gè)json 的格式就是上面的格式, 有一點(diǎn)值得說(shuō)的是:tray_image / image_data 需要轉(zhuǎn)成data string 來(lái)存儲(chǔ) 
    // 就是要把你的image 轉(zhuǎn)化成data,再轉(zhuǎn)換成String.
    static func send(json: [String: Any]) -> Bool {
        // 判斷id 是否合法
        if let bundleIdentifier = Bundle.main.bundleIdentifier {
            if bundleIdentifier.contains(DefaultBundleIdentifier) {
                fatalError("Your bundle identifier must not include the default one.");
            }
        }

        let pasteboard: UIPasteboard = UIPasteboard.general

        var jsonWithAppStoreLink: [String: Any] = json
        jsonWithAppStoreLink["ios_app_store_link"] = iOSAppStoreLink
        jsonWithAppStoreLink["android_play_store_link"] = AndroidStoreLink

        guard let dataToSend = try? JSONSerialization.data(withJSONObject: jsonWithAppStoreLink, options: []) else {
            return false
        }
        // 從iOS 10 開(kāi)始Pasteboard,有新的api
        if #available(iOS 10.0, *) {
            pasteboard.setItems([[PasteboardStickerPackDataType: dataToSend]], options: [UIPasteboardOption.localOnly: true, UIPasteboardOption.expirationDate: NSDate(timeIntervalSinceNow: PasteboardExpirationSeconds)])
        } else {
            pasteboard.setData(dataToSend, forPasteboardType: PasteboardStickerPackDataType)
        }
        DispatchQueue.main.async {
            if canSend() {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(WhatsAppURL, options: [:], completionHandler: nil)
                } else {
                    UIApplication.shared.openURL(WhatsAppURL)
                }
            }
        }
        return true
    }

}

從server 來(lái)

  • 如果表情是根據(jù)api get 獲得. 一般表情包很小的, 可以讓server 把表情包轉(zhuǎn)換成data string , 再派過(guò)來(lái).以類似上面send 方法中的json 格式. 然后也可以, 這樣的話server要做的事就會(huì)多一點(diǎn).
  • 如果server 不想轉(zhuǎn)成data string . 那可以讓server先將表情包zip, call api get 到后, 再unzip. unzip 后自己再轉(zhuǎn)換成data string . 這樣也可以.

-- 如果對(duì)你有幫助的話, 請(qǐng)留個(gè) "喜歡"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皂甘,隨后出現(xiàn)的幾起案子作谭,更是在濱河造成了極大的恐慌苍凛,老刑警劉巖箍铭,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟炫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仅醇,警方通過(guò)查閱死者的電腦和手機(jī)冗美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)析二,“玉大人粉洼,你說(shuō)我怎么就攤上這事∫渡悖” “怎么了属韧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蛤吓。 經(jīng)常有香客問(wèn)我宵喂,道長(zhǎng),這世上最難降的妖魔是什么会傲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任锅棕,我火速辦了婚禮,結(jié)果婚禮上淌山,老公的妹妹穿的比我還像新娘裸燎。我一直安慰自己,他們只是感情好泼疑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布顺少。 她就那樣靜靜地躺著,像睡著了一般王浴。 火紅的嫁衣襯著肌膚如雪脆炎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天氓辣,我揣著相機(jī)與錄音秒裕,去河邊找鬼。 笑死钞啸,一個(gè)胖子當(dāng)著我的面吹牛几蜻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播体斩,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梭稚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了絮吵?” 一聲冷哼從身側(cè)響起弧烤,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹬敲,沒(méi)想到半個(gè)月后暇昂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體莺戒,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年急波,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了从铲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澄暮,死狀恐怖名段,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泣懊,我是刑警寧澤吉嫩,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站嗅定,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏用踩。R本人自食惡果不足惜渠退,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脐彩。 院中可真熱鬧碎乃,春花似錦、人聲如沸惠奸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佛南。三九已至梗掰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗅回,已是汗流浹背及穗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绵载,地道東北人埂陆。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娃豹,于是被迫代替她去往敵國(guó)和親焚虱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)懂版、插件鹃栽、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 夠鐘死心了 當(dāng)你沉默的高調(diào) 當(dāng)?shù)梦覛v經(jīng)低潮 為何尚要打擾 過(guò)幾多通宵至肯醒覺(jué) 才愿退燒 愛(ài)不了卻偏走不了別說(shuō)笑
    午夜飛行_puppet閱讀 168評(píng)論 0 0
  • 李沁李沁閱讀 113評(píng)論 0 0
  • 昨日 跑步1.3公里 做系統(tǒng)書(shū) 案例和打工難部分 確定外出行程 周總結(jié) 邊滑板邊和家里、何中玉通話1.5小時(shí) 今日...
    子茵Lynn閱讀 134評(píng)論 0 0
  • 在這里 環(huán)境不怎么好 但是你可以找到你想要的東西 在這里 第一次接觸可能不適應(yīng) 但是適應(yīng)之后你會(huì)感謝這里的一切 在...
    傾聽(tīng)之雨閱讀 147評(píng)論 0 0