上一篇《IOS开发笔记(Swift):利用开源类库实现检测更新功能》中,我们简单的实现了更多功能中的检测更新功能,本篇我们继续在原有代码的基础上,实现应用的分享功能,这里我们会使用ShareSDK和TYAlertController。
ShareSDK是提供社交化功能的一个组件,更多了解请访问官网。TYAlertController是与上一篇中SweetAlert功能比较类似的一个类库,不过TYAlertController可以自定义弹出view。Github地址在这里:https://github.com/12207480/TYAlertController。
ShareSDK官网提供了文档帮助我们在ios工程里集成ShareSDK,不过个人感觉文档整理的乱七八糟的,根据文档在集成时也遇到了一些问题,本篇也是在官方文档的基础上做了整理,希望对大家有所帮助。这里是两篇官方的文档:使用cocoapods集成sharesdk,swift-调用-sharesdk。
首先简单的介绍一下应用的分享,本篇主要是集成了几种主流的应用:QQ、微信、新浪微博、支付宝。有其他需求的请自行参考官方文档集成,就是多引入几个类库,使用一些ShareSDK的api,很简单的。先来看一下效果图:

是了,你没看错,这是TYAlertController提供的Demo上面做出来的效果,个人感觉挺漂亮的,接下来,我们就一步步的来实现分享功能。
先根据之前的两篇文档,在我们上一篇创建的工程里集成ShareSDK和TYAlertController,先在工程的Podfile里面加入下面的一些类库:
1 pod 'TYAlertController','~> 1.1.6' 2 # 主模块(必须) 3 pod 'ShareSDK3' 4 # Mob 公共库(必须) 如果同时集成SMSSDK iOS2.0:可看此注意事项:http://bbs.mob.com/thread-20051-1-1.html 5 pod 'MOBFoundation' 6 7 # UI模块(非必须,需要用到ShareSDK提供的分享菜单栏和分享编辑页面需要以下1行) 8 pod 'ShareSDK3/ShareSDKUI' 9 10 # 平台SDK模块(对照一下平台,需要的加上。这里只需要QQ、微信、新浪微博、支付宝) 11 pod 'ShareSDK3/ShareSDKPlatforms/QQ' 12 pod 'ShareSDK3/ShareSDKPlatforms/SinaWeibo' 13 pod 'ShareSDK3/ShareSDKPlatforms/WeChat' 14 pod 'ShareSDK3/ShareSDKPlatforms/AliPaySocial'
然后,我们在命令行里,进入到工程目录,通过pod install安装一下,重新打开工程。虽然我们引入了类库,但是我们并不能通过Swift直接的调用这些OC类库,想要使用的话,我们需要建立桥接,苹果提供了解决方案。
我们新建一个HeaderFile,命名为MyShare-Bridging-Header.h,并建立桥接,其实就是新建一个.h文件,在其中引入oc类库的一些头文件。代码如下:
1#ifndef MyShare_Bridging_Header_h 2#define MyShare_Bridging_Header_h 3 4#import <ShareSDK/ShareSDK.h> 5#import <ShareSDKUI/ShareSDK+SSUI.h> 6#import <ShareSDKConnector/ShareSDKConnector.h> 7 8//腾讯SDK头文件 9#import <TencentOpenAPI/TencentOAuth.h> 10#import <TencentOpenAPI/QQApiInterface.h> 11 12//微信SDK头文件 13#import "WXApi.h" 14 15//新浪微博SDK头文件 16#import "WeiboSDK.h" 17 18//支付宝SDK 19#import "APOpenAPI.h" 20 21#endif /* MyShare_Bridging_Header_h */
然后在工程的Targets-BuildSetting里面设置一下Objective-C Bridging Header,操作如图所示:
我们在代码中输入ShareSDK尝试一下,就会发现已经集成成功了,我们已经可以使用ShareSDK提供的一些api了,如下图:
根据官方文档swift-调用-sharesdk中所述,我们修改AppDelegate.swift文件,初始化ShareSDK以及我们所需的一些社交平台,在didFinishLaunchingWithOptions方法中,注册ShareSDK并初始化一些信息,完整代码如下:
1 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 2 // Override point for customization after application launch. 3 /** 4 * 设置ShareSDK的appKey,如果尚未在ShareSDK官网注册过App,请移步到http://mob.com/login 登录后台进行应用注册, 5 * 在将生成的AppKey传入到此方法中。 6 * 方法中的第二个参数用于指定要使用哪些社交平台,以数组形式传入。第三个参数为需要连接社交平台SDK时触发, 7 * 在此事件中写入连接代码。第四个参数则为配置本地社交平台时触发,根据返回的平台类型来配置平台信息。 8 * 如果您使用的时服务端托管平台信息时,第二、四项参数可以传入nil,第三项参数则根据服务端托管平台来决定要连接的社交SDK。 9 */ 10 11 ShareSDK.registerApp("Your appKey", 12 13 activePlatforms: [SSDKPlatformType.TypeSinaWeibo.rawValue, 14 SSDKPlatformType.TypeQQ.rawValue, 15 SSDKPlatformType.SubTypeQZone.rawValue, 16 SSDKPlatformType.TypeAliPaySocial.rawValue, 17 SSDKPlatformType.TypeWechat.rawValue, 18 SSDKPlatformType.SubTypeWechatTimeline.rawValue 19 ], 20 onImport: {(platform : SSDKPlatformType) -> Void in 21 22 switch platform{ 23 24 case SSDKPlatformType.TypeWechat,SSDKPlatformType.SubTypeWechatTimeline: 25 ShareSDKConnector.connectWeChat(WXApi.classForCoder()) 26 27 case SSDKPlatformType.TypeQQ,SSDKPlatformType.SubTypeQZone: 28 ShareSDKConnector.connectQQ(QQApiInterface.classForCoder(), tencentOAuthClass: TencentOAuth.classForCoder()) 29 case SSDKPlatformType.TypeAliPaySocial: 30 ShareSDKConnector.connectAliPaySocial(APOpenAPI.classForCoder()) 31 default: 32 break 33 } 34 }, 35 onConfiguration: {(platform : SSDKPlatformType,appInfo : NSMutableDictionary!) -> Void in 36 switch platform { 37 38 case SSDKPlatformType.TypeSinaWeibo: 39 //设置新浪微博应用信息,其中authType设置为使用SSO+Web形式授权 40 appInfo.SSDKSetupSinaWeiboByAppKey("xxxxxxxx", 41 appSecret : "xxxxxxxx", 42 redirectUri : "http://www.enuobank.com/", 43 authType : SSDKAuthTypeBoth) 44 break 45 46 case SSDKPlatformType.TypeWechat: 47 //设置微信应用信息 48 appInfo.SSDKSetupWeChatByAppId("xxxxxxxx", appSecret: "xxxxxxxx") 49 break 50 case SSDKPlatformType.SubTypeWechatTimeline: 51 //设置微信朋友圈信息 52 appInfo.SSDKSetupWeChatByAppId("xxxxxxxx", appSecret: "xxxxxxxx") 53 break 54 case SSDKPlatformType.TypeQQ: 55 //设置腾讯qq,其中authType设置为只用Web形式授权 56 appInfo.SSDKSetupQQByAppId("xxxxxxxx", 57 appKey: "xxxxxxxx", 58 authType : SSDKAuthTypeBoth) 59 break 60 case SSDKPlatformType.SubTypeQZone: 61 //设置腾讯qq空间,其中authType设置为只用Web形式授权 62 appInfo.SSDKSetupQQByAppId("xxxxxxxx", 63 appKey: "xxxxxxxx", 64 authType : SSDKAuthTypeBoth) 65 break 66 case SSDKPlatformType.TypeAliPaySocial: 67 //设置支付宝应用信息 68 appInfo.SSDKSetupAliPaySocialByAppId("xxxxxxxx") 69 break 70 default: 71 break 72 } 73 }) 74 return true 75 }
下面,我们开始实现点击单元格,弹出一个view,view里面放置一些平台按钮,点击这些按钮调用ShareSDK中相应的api,去进行分享操作。我们新建一个View,命名为ShareView.xib,并做一些简单的设置,在attributes inspector里面修改一下Size为Freeform,在Size inspector里面讲xy都设置为300。简单的准备一些图片,设计一个布局,这里不再赘述,直接看效果:

我们新建一个ShareView.swift文件,继承UIView,并在xib文件选中View,在identity inspector里面设置class为ShareView,并关联上图中的各个按钮,调用ShareSDK的一些API实现各自的分享,以新浪微博为例,代码示例如下:
1import UIKit 2import JLToast 3 4class ShareView : UIView { 5 6 // 1.创建分享参数 7 let shareParames = NSMutableDictionary() 8 9 //新浪微博 10 @IBAction func sinaWeibo(sender: AnyObject) { 11 shareParames.SSDKSetupShareParamsByText("分享内容", 12 images : UIImage(named: "shareImg.png"), 13 url : NSURL(string:"http://mob.com"), 14 title : "分享标题", 15 type : SSDKContentType.Auto) 16 //2.进行分享 17 ShareSDK.share(SSDKPlatformType.TypeSinaWeibo, parameters: shareParames) { (state : SSDKResponseState, userData : [NSObject : AnyObject]!, contentEntity :SSDKContentEntity!, error : NSError!) -> Void in 18 switch state{ 19 case SSDKResponseState.Success: 20 JLToast.makeText("分享成功",duration: JLToastDelay.ShortDelay).show() 21 case SSDKResponseState.Fail: 22 print("分享失败,错误描述:\(error)") 23 JLToast.makeText("分享失败",duration: JLToastDelay.ShortDelay).show() 24 case SSDKResponseState.Cancel: 25 JLToast.makeText("分享取消",duration: JLToastDelay.ShortDelay).show() 26 default: 27 break 28 } 29 } 30 } 31 //QQ空间 32 @IBAction func qqZone(sender: AnyObject) { 33 } 34 //QQ好友 35 @IBAction func qqFriend(sender: AnyObject) { 36 } 37 //微信 38 @IBAction func weChat(sender: AnyObject) { 39 } 40 //朋友圈 41 @IBAction func wechatTimeline(sender: AnyObject) { 42 } 43 //支付宝 44 @IBAction func aliPaySocial(sender: AnyObject) { 45 } 46 //点击取消 47 @IBAction func cancel(sender: AnyObject) { 48 } 49}
然后,就是实现单元格的点击事件了,通过TYAlertController的官方介绍,我们发现可以通过代码展示我们自定义的view:
TYAlertController.init(alertView: <#T##UIView!#>, preferredStyle: <#T##TYAlertControllerStyle#>)
但是问题来了,我们创建的是xib文件,如何通过xib获取到这个view呢?这里我们使用了stackoverflow上面大神的一个UIView扩展(地址),完整代码如下:
1public extension UIView { 2 public class func fromNib(nibNameOrNil: String? = nil) -> Self { 3 return fromNib(nibNameOrNil, type: self) 4 } 5 6 public class func fromNib<T : UIView>(nibNameOrNil: String? = nil, type: T.Type) -> T { 7 let v: T? = fromNib(nibNameOrNil, type: T.self) 8 return v! 9 } 10 11 public class func fromNib<T : UIView>(nibNameOrNil: String? = nil, type: T.Type) -> T? { 12 var view: T? 13 let name: String 14 if let nibName = nibNameOrNil { 15 name = nibName 16 } else { 17 // Most nibs are demangled by practice, if not, just declare string explicitly 18 name = nibName 19 } 20 let nibViews = NSBundle.mainBundle().loadNibNamed(name, owner: nil, options: nil) 21 for v in nibViews { 22 if let tog = v as? T { 23 view = tog 24 } 25 } 26 return view 27 } 28 29 public class var nibName: String { 30 let name = "\(self)".componentsSeparatedByString(".").first ?? "" 31 return name 32 } 33 public class var nib: UINib? { 34 if let _ = NSBundle.mainBundle().pathForResource(nibName, ofType: "nib") { 35 return UINib(nibName: nibName, bundle: nil) 36 } else { 37 return nil 38 } 39 } 40}
最后,我们只需要在点击单元格时,执行如下代码,就可以展示我们的分享view了,当然也需要实现一下分享view中的取消操作,TYAlertController已经提供了解决方案:
1 let shareView = ShareView.fromNib("ShareView") 2 self.presentViewController(TYAlertController.init(alertView: shareView,preferredStyle: .Alert), animated: true, completion: nil) 3 4 //点击取消 5 @IBAction func cancel(sender: AnyObject) { 6 self.hideView() 7 }
运行我们的工程,你就会看到本文最初的那种效果,点击取消也会隐藏掉,至于如何在各个平台申请应用获取appid和appkey不属于本文的内容,请读者自行搜索。不过在使用ShareSDK的过程中,也会遇到这样的警告【#warning:尚未配置[新浪微博]URL Scheme:sinaweibosso.wb......】,这里提供了解决方案(地址)。
最后,本文通过ShareSDK和TYAlertController这两个优秀的类库,以及其他人提供的一些解决方案,简单的实现了应用中常见的分享功能,代码粗糙, 文笔简陋,希望大家批评指正,多多交流,互相进步!