利用剪切板,利用剪切板移动的四个步骤利用剪切板写在前面虽然在国内用whatsapp的人不多,但在香港等地方大部分还是用whatsapp,这一章我们来讨论讨论怎么添加表情到whatsapp,也可以看whatsapp的Guide它里面主要介绍的是利用它的lib来集成,有现成的案例,这里就不多说了。我们主要谈论下怎么利用剪切......
写在前面
虽然在国内用whatsapp的人不多,但在香港等地方大部分还是用whatsapp,这一章我们来讨论讨论怎么添加表情到whatsapp,也可以看whatsapp的Guide
它里面主要介绍的是利用它的lib来集成,有现成的案例,这里就不多说了。
我们主要谈论下怎么利用剪切板来添加,也就是第二种方法。当然这添加的表情也是来自本地的,如果需要从server获取也可以,但相对来说会麻烦一点,但确实是可以的。
·图片的格式、大小等,请看guide,本文只讨论发国际快递whatsapp
开始
·在Info.plist中添加,
keyLSApplicationQueriesSchemes/key
array
stringwhatsapp/string
/array
我们都知道LSApplicationQueriesSchemes的作用是为了双方测试。加这个可以判断你的手机是否安装了whatsapp。
判断安装,如果没有安装whatsapp return false;
func canSend() Bool {
return UIApplication.shared.canOpenURL(URL(string: whatsapp://)!)
}
使用下面描述的结构将贴纸数据格式化为JSON对象,
{
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,再转成data string的形式
一次只能发快递一个贴纸包
·步骤
我们需要先将数据复制到Pasteboard
然后再打开whatsapp://stickerPack,它会跳到whatsapp,之后whatsapp会自己从Pasteboard中获取sticker
代码
import UIKit
struct Interoperability {
// whatsapp guide 中说不要包含这个Id.
private static let DefaultBundleIdentifier: String = WA.WAStickersThirdParty
private static let PasteboardExpirationSeconds: TimeInterval = 60
// 请保持这个.
private static let PasteboardStickerPackDataType: String = net.whatsapp.thirdparty.stickerpack
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://)!)
}
// 这个json 的格式就是上面的格式, 有一点值得说的是:tray_image / image_data 需要转成data string 来存储
// 就是要把你的image 转化成data,再转换成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 开始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来
·如果表情是根据api get获得。一般表情包很小的,可以让server把表情包转换成data string,再派过来。以类似上面send方法中的json格式,然后也可以,这样的话server要做的事就会多一点。
·如果server不想转成data string,那可以让server先将表情包zip,call api get到后,再unzip.unzip后自己再转换成data string,这样也可以。
特别声明:以上文章内容仅代表作者本人观点,不代表ESG跨境电商观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与ESG跨境电商联系。
二维码加载中...
使用微信扫一扫登录
使用账号密码登录
平台顾问
微信扫一扫
马上联系在线顾问
小程序
ESG跨境小程序
手机入驻更便捷
返回顶部