IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能

Stella981
• 阅读 549

    上一篇《IOS开发笔记(Swift):利用开源类库实现检测更新功能》中,我们简单的实现了更多功能中的检测更新功能,本篇我们继续在原有代码的基础上,实现应用的分享功能,这里我们会使用ShareSDK和TYAlertController。

    ShareSDK是提供社交化功能的一个组件,更多了解请访问官网。TYAlertController是与上一篇中SweetAlert功能比较类似的一个类库,不过TYAlertController可以自定义弹出view。Github地址在这里:https://github.com/12207480/TYAlertController

    ShareSDK官网提供了文档帮助我们在ios工程里集成ShareSDK,不过个人感觉文档整理的乱七八糟的,根据文档在集成时也遇到了一些问题,本篇也是在官方文档的基础上做了整理,希望对大家有所帮助。这里是两篇官方的文档:使用cocoapods集成sharesdkswift-调用-sharesdk

    首先简单的介绍一下应用的分享,本篇主要是集成了几种主流的应用:QQ、微信、新浪微博、支付宝。有其他需求的请自行参考官方文档集成,就是多引入几个类库,使用一些ShareSDK的api,很简单的。先来看一下效果图:

IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能

    是了,你没看错,这是TYAlertController提供的Demo上面做出来的效果,个人感觉挺漂亮的,接下来,我们就一步步的来实现分享功能。

    先根据之前的两篇文档,在我们上一篇创建的工程里集成ShareSDK和TYAlertController,先在工程的Podfile里面加入下面的一些类库:

  pod 'TYAlertController','~> 1.1.6'
  # 主模块(必须)
  pod 'ShareSDK3'
  # Mob 公共库(必须) 如果同时集成SMSSDK iOS2.0:可看此注意事项:http://bbs.mob.com/thread-20051-1-1.html 
  pod 'MOBFoundation'
  
  # UI模块(非必须,需要用到ShareSDK提供的分享菜单栏和分享编辑页面需要以下1行)
  pod 'ShareSDK3/ShareSDKUI'
  
  # 平台SDK模块(对照一下平台,需要的加上。这里只需要QQ、微信、新浪微博、支付宝)
  pod 'ShareSDK3/ShareSDKPlatforms/QQ'
  pod 'ShareSDK3/ShareSDKPlatforms/SinaWeibo'
  pod 'ShareSDK3/ShareSDKPlatforms/WeChat'
  pod 'ShareSDK3/ShareSDKPlatforms/AliPaySocial'

    然后,我们在命令行里,进入到工程目录,通过pod install安装一下,重新打开工程。虽然我们引入了类库,但是我们并不能通过Swift直接的调用这些OC类库,想要使用的话,我们需要建立桥接,苹果提供了解决方案。

    我们新建一个HeaderFile,命名为MyShare-Bridging-Header.h,并建立桥接,其实就是新建一个.h文件,在其中引入oc类库的一些头文件。代码如下:

#ifndef MyShare_Bridging_Header_h
#define MyShare_Bridging_Header_h

#import <ShareSDK/ShareSDK.h>
#import <ShareSDKUI/ShareSDK+SSUI.h>
#import <ShareSDKConnector/ShareSDKConnector.h>

//腾讯SDK头文件
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterface.h>

//微信SDK头文件
#import "WXApi.h"

//新浪微博SDK头文件
#import "WeiboSDK.h"

//支付宝SDK
#import "APOpenAPI.h"

#endif /* MyShare_Bridging_Header_h */

    然后在工程的Targets-BuildSetting里面设置一下Objective-C Bridging Header,操作如图所示:

IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能     我们在代码中输入ShareSDK尝试一下,就会发现已经集成成功了,我们已经可以使用ShareSDK提供的一些api了,如下图:

IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能     根据官方文档swift-调用-sharesdk中所述,我们修改AppDelegate.swift文件,初始化ShareSDK以及我们所需的一些社交平台,在didFinishLaunchingWithOptions方法中,注册ShareSDK并初始化一些信息,完整代码如下:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        /**
         *  设置ShareSDK的appKey,如果尚未在ShareSDK官网注册过App,请移步到http://mob.com/login 登录后台进行应用注册,
         *  在将生成的AppKey传入到此方法中。
         *  方法中的第二个参数用于指定要使用哪些社交平台,以数组形式传入。第三个参数为需要连接社交平台SDK时触发,
         *  在此事件中写入连接代码。第四个参数则为配置本地社交平台时触发,根据返回的平台类型来配置平台信息。
         *  如果您使用的时服务端托管平台信息时,第二、四项参数可以传入nil,第三项参数则根据服务端托管平台来决定要连接的社交SDK。
         */
       
        ShareSDK.registerApp("Your appKey",
                            
                             activePlatforms: [SSDKPlatformType.TypeSinaWeibo.rawValue,
                                SSDKPlatformType.TypeQQ.rawValue,
                                SSDKPlatformType.SubTypeQZone.rawValue,
                                SSDKPlatformType.TypeAliPaySocial.rawValue,
                                SSDKPlatformType.TypeWechat.rawValue,
                                SSDKPlatformType.SubTypeWechatTimeline.rawValue
            ],
                             onImport: {(platform : SSDKPlatformType) -> Void in
                               
                                switch platform{
                                    
                                case SSDKPlatformType.TypeWechat,SSDKPlatformType.SubTypeWechatTimeline:
                                    ShareSDKConnector.connectWeChat(WXApi.classForCoder())
                                   
                                case SSDKPlatformType.TypeQQ,SSDKPlatformType.SubTypeQZone:
                                    ShareSDKConnector.connectQQ(QQApiInterface.classForCoder(), tencentOAuthClass: TencentOAuth.classForCoder())
                                case SSDKPlatformType.TypeAliPaySocial:
                                    ShareSDKConnector.connectAliPaySocial(APOpenAPI.classForCoder())
                                default:
                                    break
                                }
            },
                             onConfiguration: {(platform : SSDKPlatformType,appInfo : NSMutableDictionary!) -> Void in
                                switch platform {
                                   
                                case SSDKPlatformType.TypeSinaWeibo:
                                    //设置新浪微博应用信息,其中authType设置为使用SSO+Web形式授权
                                    appInfo.SSDKSetupSinaWeiboByAppKey("xxxxxxxx",
                                        appSecret : "xxxxxxxx",
                                        redirectUri : "http://www.enuobank.com/",
                                        authType : SSDKAuthTypeBoth)
                                    break
                                    
                                case SSDKPlatformType.TypeWechat:
                                    //设置微信应用信息
                                    appInfo.SSDKSetupWeChatByAppId("xxxxxxxx", appSecret: "xxxxxxxx")
                                    break
                                case SSDKPlatformType.SubTypeWechatTimeline:
                                    //设置微信朋友圈信息
                                    appInfo.SSDKSetupWeChatByAppId("xxxxxxxx", appSecret: "xxxxxxxx")
                                    break
                                case SSDKPlatformType.TypeQQ:
                                    //设置腾讯qq,其中authType设置为只用Web形式授权
                                    appInfo.SSDKSetupQQByAppId("xxxxxxxx",
                                        appKey: "xxxxxxxx",
                                        authType : SSDKAuthTypeBoth)
                                    break
                                case SSDKPlatformType.SubTypeQZone:
                                    //设置腾讯qq空间,其中authType设置为只用Web形式授权
                                    appInfo.SSDKSetupQQByAppId("xxxxxxxx",
                                        appKey: "xxxxxxxx",
                                        authType : SSDKAuthTypeBoth)
                                    break
                                case SSDKPlatformType.TypeAliPaySocial:
                                    //设置支付宝应用信息
                                    appInfo.SSDKSetupAliPaySocialByAppId("xxxxxxxx")
                                    break
                                default:
                                    break
                                }
        })
        return true
    }

    下面,我们开始实现点击单元格,弹出一个view,view里面放置一些平台按钮,点击这些按钮调用ShareSDK中相应的api,去进行分享操作。我们新建一个View,命名为ShareView.xib,并做一些简单的设置,在attributes inspector里面修改一下Size为Freeform,在Size inspector里面讲xy都设置为300。简单的准备一些图片,设计一个布局,这里不再赘述,直接看效果:

IOS开发笔记(Swift):通过ShareSDK和TYAlertController实现分享功能

    我们新建一个ShareView.swift文件,继承UIView,并在xib文件选中View,在identity inspector里面设置class为ShareView,并关联上图中的各个按钮,调用ShareSDK的一些API实现各自的分享,以新浪微博为例,代码示例如下:

import UIKit
import JLToast

class ShareView : UIView {
    
    // 1.创建分享参数
    let shareParames = NSMutableDictionary()
    
    //新浪微博
    @IBAction func sinaWeibo(sender: AnyObject) {
        shareParames.SSDKSetupShareParamsByText("分享内容",
                                                images : UIImage(named: "shareImg.png"),
                                                url : NSURL(string:"http://mob.com"),
                                                title : "分享标题",
                                                type : SSDKContentType.Auto) 
        //2.进行分享
        ShareSDK.share(SSDKPlatformType.TypeSinaWeibo, parameters: shareParames) { (state : SSDKResponseState, userData : [NSObject : AnyObject]!, contentEntity :SSDKContentEntity!, error : NSError!) -> Void in            
            switch state{                
            case SSDKResponseState.Success:
                JLToast.makeText("分享成功",duration: JLToastDelay.ShortDelay).show()
            case SSDKResponseState.Fail:
                print("分享失败,错误描述:\(error)")
                JLToast.makeText("分享失败",duration: JLToastDelay.ShortDelay).show()
            case SSDKResponseState.Cancel:
                JLToast.makeText("分享取消",duration: JLToastDelay.ShortDelay).show()
            default:
                break
            }
        }
    }
    //QQ空间
    @IBAction func qqZone(sender: AnyObject) {
    }
    //QQ好友
    @IBAction func qqFriend(sender: AnyObject) {
    }
    //微信
    @IBAction func weChat(sender: AnyObject) {
    }
    //朋友圈
    @IBAction func wechatTimeline(sender: AnyObject) {    
    }
    //支付宝
    @IBAction func aliPaySocial(sender: AnyObject) {
    }
    //点击取消
    @IBAction func cancel(sender: AnyObject) {
    }   
}

    然后,就是实现单元格的点击事件了,通过TYAlertController的官方介绍,我们发现可以通过代码展示我们自定义的view:

    TYAlertController.init(alertView: <#T##UIView!#>, preferredStyle: <#T##TYAlertControllerStyle#>)

    但是问题来了,我们创建的是xib文件,如何通过xib获取到这个view呢?这里我们使用了stackoverflow上面大神的一个UIView扩展(地址),完整代码如下:

public extension UIView {
    public class func fromNib(nibNameOrNil: String? = nil) -> Self {
        return fromNib(nibNameOrNil, type: self)
    }
    
    public class func fromNib<T : UIView>(nibNameOrNil: String? = nil, type: T.Type) -> T {
        let v: T? = fromNib(nibNameOrNil, type: T.self)
        return v!
    }
    
    public class func fromNib<T : UIView>(nibNameOrNil: String? = nil, type: T.Type) -> T? {
        var view: T?
        let name: String
        if let nibName = nibNameOrNil {
            name = nibName
        } else {
            // Most nibs are demangled by practice, if not, just declare string explicitly
            name = nibName
        }
        let nibViews = NSBundle.mainBundle().loadNibNamed(name, owner: nil, options: nil)
        for v in nibViews {
            if let tog = v as? T {
                view = tog
            }
        }
        return view
    }
    
    public class var nibName: String {
        let name = "\(self)".componentsSeparatedByString(".").first ?? ""
        return name
    }
    public class var nib: UINib? {
        if let _ = NSBundle.mainBundle().pathForResource(nibName, ofType: "nib") {
            return UINib(nibName: nibName, bundle: nil)
        } else {
            return nil
        }
    }
}

    最后,我们只需要在点击单元格时,执行如下代码,就可以展示我们的分享view了,当然也需要实现一下分享view中的取消操作,TYAlertController已经提供了解决方案:

                let shareView = ShareView.fromNib("ShareView")
                self.presentViewController(TYAlertController.init(alertView: shareView,preferredStyle: .Alert), animated: true, completion: nil)

    //点击取消
    @IBAction func cancel(sender: AnyObject) {
        self.hideView()
    }

    运行我们的工程,你就会看到本文最初的那种效果,点击取消也会隐藏掉,至于如何在各个平台申请应用获取appid和appkey不属于本文的内容,请读者自行搜索。不过在使用ShareSDK的过程中,也会遇到这样的警告【#warning:尚未配置[新浪微博]URL Scheme:sinaweibosso.wb......】,这里提供了解决方案(地址)。

   最后,本文通过ShareSDK和TYAlertController这两个优秀的类库,以及其他人提供的一些解决方案,简单的实现了应用中常见的分享功能,代码粗糙, 文笔简陋,希望大家批评指正,多多交流,互相进步!

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Stella981 Stella981
2年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
2年前
Nepxion Discovery 5.5.0 发布
!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
IOS开发笔记(Swift):利用开源类库实现检测更新功能
  上一篇《IOS开发笔记(Swift):UITableView表格视图的静态使用(http://my.oschina.net/realfighter/blog/700079)》中,我们通过UITableView静态化表格实现App中常用的更多功能布局,本篇我们来实现一下其中的检测更新功能。本篇也会介绍几种常用的类库:Alamofire、Swifty
Easter79 Easter79
2年前
Swift学习第一练——用Swift实现的FlappyBird小游戏
用Swift实现的FlappyBird小游戏   伴随着apple公司对swift的推广态度深入,swift火的很快,并且swift精简便捷的语法和强大的功能,对于使用Object—C开发iOS的开发者来说,也有必要了解学习一下swift。这篇博客跳过swift干涩的语法,直接从一个小游戏项目开始使用s
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这