MonkeyKing——我要这SDK有何用?

前言


集成第三方的东西虽然很简单,但是如果出现了一些编译上的错误,作为菜鸟是很难处理的。而最简单有效的处理方式就是把第三方的SDK全部移除再重新添加,错误就神奇的消失啦~

我读书少,表骗我

之前公司技术总监因故放弃了使用友M去管理第三方SDK,采取直接去第三方平台下载SDK集成的方式,导致项目里的SDK管理混乱。那么可不可以不使用第三方的SDK来实现第三方平台的分享、授权、支付等操作嘞?那就请猴王MonkeyKing来收服这些SDK吧~
其实官方demo里面的例子讲的很清楚了,但是自己动手按照自己喜欢的方式封装一下内部方法,用起来也舒服些~

正片


操作环境:
xcode 8.2.1
swift 3.0

准备工作

新建一个xcode项目,使用CocoaPods导入MonkeyKing。

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
target 'MonkeyKingDemo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!
  pod 'MonkeyKing'
end

先从第三方分享开始吧~
打开项目,先根据自己的需求配置一下第三方平台的URL Type(微信,qq,微博等等)。

按需配置URL Type

按需配置LSApplicationQueriesSchemes

  1. 我们创建一个工具类thirdParty.swift来统一管理第三方的业务逻辑。
    先按照自己的需求,定义一些枚举方便使用。
// 分享类型
enum shareType {
    case weChatSession
    case weChatTimeline
    case weibo
    case qqFriend
    case qqZone
    case other // 占位用
}
// 第三方平台类型
enum platformType {
    case weChat
    case qq
    case weibo
    case alipay
    case other //占位用
}
  1. 我们给工具类定义一个注册第三方账号的类方法,这个方法我们可以在app启动时就调用,或者在你需要使用第三方之前调用。第三方的App key 和App ID、回调地址,我们可以在该工具类里面定义一些常量来管理,这里不再赘述。
/// regist third account
    class func registAccount() {
        MonkeyKing.registerAccount(.weChat(appID: "xxxxxxx", appKey: "xxxxxxx"))
        MonkeyKing.registerAccount(.weibo(appID: "xxxxxxx", appKey: "xxxxxxx", redirectURL: "xxxxxxx"))
        MonkeyKing.registerAccount(.qq(appID: "xxxxxxx"))
    }

通常我们就在app刚启动时调用这个方法吧~

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // regist third account
        thirdParty.registAccount()
        return true
    }
  1. 如果我们还需要处理第三方的回调,那么我们还需要在AppDelegate里面添加以下处理。
// iOS 10
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        _ = MonkeyKing.handleOpenURL(url)
        return true
 }
// iOS 9
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        _ = MonkeyKing.handleOpenURL(url)
        return true
}
是不是已经等不及了

第三方分享


同常我们需要分享的内容包括文字、图片、链接、视频、音频。在这里我只是把常用的文字、图片、链接分享处理一下,音视频一般不太用的到,如果需要的话,大同小异。

首先我们在thirdParty里面增加一个内部使用的方法,实际上就是封装了MonkeyKing的内部方法,方便我们使用。分享文字、图片和链接时所封装的方法内部都会用到这个方法,不需要暴露给外界,所以方法加了fileprivate关键字

fileprivate class func shareInfo(_ info: MonkeyKing.Info, shareType: shareType) {
        var message: MonkeyKing.Message?
        switch shareType {
        case .weChatSession:
            message = MonkeyKing.Message.weChat(.session(info: info))
        case .weChatTimeline:
            message = MonkeyKing.Message.weChat(.timeline(info: info))
        case .weibo:
            message = MonkeyKing.Message.weibo(.default(info: info, accessToken: nil))
        case .qqFriend:
            message = MonkeyKing.Message.qq(.friends(info: info))
        case .qqZone:
            message = MonkeyKing.Message.qq(.zone(info: info))
        default:
            break
        }
        // 处理分享结果
        if let message = message{
            MonkeyKing.deliver(message) { result in
                print("result: \(result)")
            }
        }
    }
分享文字

分享文字的话,其实方法参数里只留下text就可以,博主因为强迫症,各个方法都想要长得一样。。。所以用不到的参数也加上了。。。额。。。

class func share(text: String?, title: String?, description: String?, shareType: shareType) {
        guard let text = text else { return }
        let info = MonkeyKing.Info(
            title: text,
            description: nil,
            thumbnail: nil,
            media: nil
        )
        shareInfo(info, shareType: shareType)
    }
分享图片

分享图片的话有一点是需要注意的。第三方对图片的缩略图大小是有限制的,通常是不能大于32kb(32768b),所以需要对传入的待分享图片的缩略图进行处理。
我们先增加一个UIImage类的扩展,用于压缩图片体积,备用。这个方法比较简单粗暴,如果有更科学的方法,大家请分享一下。

extension UIImage {
    /// 压缩图片大小
    ///
    /// - Parameters:
    ///   - maxLength: 最大尺寸(比特)
    ///   - compress: 压缩系数(0~1)
    /// - Returns:
    func compress(maxLength: Int, compress: CGFloat = 0.90) -> Data? {
        let data = UIImageJPEGRepresentation(self, compress)
        if (data?.count)! < maxLength || compress < 0{
            return data
        }
        return self.compress(maxLength: maxLength, compress: compress-0.05)
    }
}

然后我们依旧在thirdParty里面增加一个内部使用的方法,来压缩图片缩略图。这里的3000是指32kb(32768b),博主强迫症,非得弄个整数不可。

fileprivate class func compress(thumbnail: UIImage) -> UIImage? {
        if let data = UIImageJPEGRepresentation(thumbnail, 1) {
            if data.count < 30000 { return thumbnail } // 无需压缩
        }
        if let imageData = thumbnail.compress(maxLength: 30000) {
            if imageData.count > 30000 { // 还不符合尺寸要求?再压
                if let compressedImage = UIImage(data: imageData) {
                    return compress(thumbnail: compressedImage)
                }
            } else {
                if let compressedImage = UIImage(data: imageData) {
                    return compressedImage
                }
            }
        }
        return nil
    }

最后,我们进行图片分享

class func share(image: UIImage?, thumbnail: UIImage?, shareType: shareType) {
        guard let image = image else { return }
        var compressedThumbnail: UIImage?
        if thumbnail != nil { // 如果传入了缩略图,也得判断一下尺寸是否合格
            if let compressedImage = compress(thumbnail: thumbnail!) {
                compressedThumbnail = compressedImage
            }
        } else { // 没有缩略图,那就取原图来压一个缩略图来用
            if let compressedImage = compress(thumbnail: image) {
                compressedThumbnail = compressedImage
            }
        }
        let info = MonkeyKing.Info(
            title: nil,
            description: nil,
            thumbnail: compressedThumbnail,
            media: .image(image)
        )
        shareInfo(info, shareType: shareType)
    }
分享链接

如果分享的链接需要配缩略图,缩略图也要符合尺寸的要求。

class func share(url: String?, thumbnail: UIImage?, title: String?, description: String?, shareType: shareType) {
        guard let urlString = url else { return }
        guard let url = URL(string: urlString) else { return }
        
        var compressedThumbnail: UIImage?
        if thumbnail != nil {
            if let compressedImage = compress(thumbnail: thumbnail!) {
                compressedThumbnail = compressedImage
            }
        }
    
        let info = MonkeyKing.Info(
            title: title,
            description: description,
            thumbnail: compressedThumbnail,
            media: .url(url)
        )
        shareInfo(info, shareType: shareType)
    }
呐,是不是很简单

第三方授权


我们先在thirdParty里定义一个闭包来处理第三方授权后返回的数据。

public typealias completionHandler = (_ info: [String: Any]?, _ response: URLResponse?, _ error: Error?) -> Void

然后。。。就用这个方法。

  // MARK:-OAuth
class func OAuth(platformType: platformType, completionHandler: @escaping completionHandler) {
        switch platformType {
        case .weChat:
            MonkeyKing.oauth(for: .weChat) { (info, response, error) in
                completionHandler(info, response, error)
            }
        case .qq:
            MonkeyKing.oauth(for: .qq, scope: "get_user_info") { (info, response, error) in
                completionHandler(info, response, error)   
            }
        case .weibo:
            MonkeyKing.oauth(for: .weibo) { (info, response, error) in
                completionHandler(info, response, error)
            }
        default:
            break
        }
        
    }

在我们需要第三方授权的地方使用这个方法,并在回调里处理返回的数据。
例如微信:

thirdParty.OAuth(platformType: .weChat) { (dictionary, response, error) in
            print("dictionary \(dictionary)")
            print("error \(error)")
}

第三方支付


关于支付这个地方,其实demo不太好处理。但是我依然稍微封了一个方法,就待优化吧。
我们先在thirdParty里定义一个闭包来处理第三方支付后返回的数据。

public typealias payCompletionHandler = (_ result: Bool) -> Void

然后。。。就用这个方法。传入的urlString是发起订单后server端返回的数据拼接出来的,这一点还是不太方便的。例如微信的订单(此处WXPayModel是用户根据后台返回数据自己定义的):

 let string = "weixin://app/\(WXPayModel.appid!)/pay/?nonceStr=\(WXPayModel.noncestr!)&package=Sign%3DWXPay&partnerId=\(WXPayModel.partnerid!)&prepayId=\(WXPayModel.prepayid!)&timeStamp=\(UInt32(WXPayModel.timestamp!))&sign=\(WXPayModel.sign!)&signType=SHA1"

获取到订单信息后拼接为url,作为参数传入以下方法。

// MARK:-Pay
class func pay(platformType: platformType, urlString: String, completionHandler: @escaping payCompletionHandler) {
        switch platformType {
        case .weChat:
            let order = MonkeyKing.Order.weChat(urlString: urlString)
            MonkeyKing.deliver(order) { result in
                completionHandler(result)
            }
        case .alipay:
            let order = MonkeyKing.Order.alipay(urlString: urlString)
            MonkeyKing.deliver(order) { result in
                completionHandler(result)
            }
        default:
            break
        }
  }

结束语


更详细的使用,请大家移步至MonkeyKing下载官方的demo来学习吧~
MonkeyKing由国人开发,目前由四个大牛程序员维护。不引入SDK,方便快捷,减少项目体积,大家有兴趣可以试试~
我的demo地址demo,因为分享、授权、支付等应用场景很多,所以demo里面并没有一一实现,仅仅提供该thridParty工具类以及相关类扩展。有什么疑问或建议,请留言~
最后,祝大家新年快乐~

动漫人物:2016/7月番《new game》 凉风青叶 八神光
B站:http://bangumi.bilibili.com/anime/5027

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容