从今天开始,我们将一起探讨如何更好地在 Swift 项目中引入常用 SDK,我们先从微博开始。
下载
微博 SDK 下载地址: http://open.weibo.com/wiki/SDK
转移文件
由于 Xcode 的工程管理比较刻板:完全使用工程文件描述工程,依赖相对路径或绝对路径管理工程中的文件;而 git 又是基于文件系统的版本管理工具;所以我一向手动管理文件结构,从不使用“copy if needed”功能。
对于 SDK 文件的管理,我更推荐手动管理的方式,避免工程文件夹里啥文件都有的混乱局面。
在工程根目录下新建 SDKs 文件夹,解压微博 SDK,把 libWeiboSDK 文件夹复制过去。
开始集成
基本文档
我们将根据解压出的 微博iOS平台SDK文档V3.1.1.pdf 中的内容来引入微博 SDK。
注册应用
这步大家可以自己完成,注意设置“OAuth2.0 授权设置”,把你自己的微博账号添加为测试账号即可。
设置回调 URL Scheme
到如下页面根据你的 AppKey 设置 URL Scheme 地址:
添加 SDK 文件到工程
这一步是重头戏,也是大多数 Swift 开发者最容易卡住的地方:Xcode 工程的静态库管理策略比较奇怪,需要我们处理各种链接器设置、工程配置、搜索目录等问题。
① 拖进文件树
新建 SDKs > WeiboSDK 两级虚拟目录,将 libWeiboSDK 文件夹中的文件全部拖进去:
② 引入桥接文件
在项目中新建一个 .m 的 OC 文件,随便取个名字,保存之后,Xcode 就会自动提醒我们要不要创建桥接文件:
删掉刚刚创建的 .m 文件,我们就得到了我们真正想要的桥接文件:
③ 引入 OC 头文件
在头文件中引入微博的头文件:
#import "WeiboSDK.h"
这时候我们就可以在 AppDelegate 中注册微博应用了:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
WeiboSDK.enableDebugMode(true)
WeiboSDK.registerApp("1953849048")
return true
}
此时编译将会得到几十个 error,这是因为我们还没有引入 SDK 所依赖的系统库。
④ 引入依赖库
我们要引入 QuartzCore.framework ImageIO.framework SystemConfiguration.framework Security.framework CoreTelephony.framework CoreText.framework UIKit.framework Foundation.framework CoreGraphics.framework libz.dylib libsqlite3.dylib 这些系统库。
编译成功,运行起来之后,我们得到了如下错误:
2016-01-12 17:10:10.033 SwiftLoveSDKs[2112:222868] -[NSConcreteMutableData wbsdk_base64EncodedString]: unrecognized selector sent to instance 0x7faddb56d8b0
2016-01-12 17:10:10.035 SwiftLoveSDKs[2112:222868] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMutableData wbsdk_base64EncodedString]: unrecognized selector sent to instance 0x7faddb56d8b0'
经过简单 Google,找到了解决方案: https://github.com/sinaweibosdk/weibo_ios_sdk/issues/117 如下图操作之后,bug 解决:
⑤ 修改 AppDelegate
新增 delegate,实现 delegate 中的方法,修改 handleOpenURL 和 openURL 方法:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, WeiboSDKDelegate {
... ...
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return WeiboSDK.handleOpenURL(url, delegate: self)
}
func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {
return WeiboSDK.handleOpenURL(url, delegate: self)
}
// for Weibo
func didReceiveWeiboRequest(request: WBBaseRequest!) {
}
func didReceiveWeiboResponse(response: WBBaseResponse!) {
}
}
在这个过程中,可以随手解决一下 iOS 9 SDK 引入的网络问题。
⑥ 通过 SSO 协议调起微博客户端实现第三方登录
在 ViewController 中增加唤起登陆的代码:
let request = WBAuthorizeRequest()
request.redirectURI = "https://api.weibo.com/oauth2/default.html"
request.scope = "all"
request.userInfo = [
"SSO_From": "ViewController"
]
WeiboSDK.sendRequest(request)
然后就发现唤不起来微博呀。
⑦ 解决起不来的问题
以“源代码”方式编辑 Info.plist:
在 <key>NSAppTransportSecurity</key>
之前插入以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 新浪微博 URL Scheme 白名单-->
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
</array>
⑧ 检验成果
在 didReceiveWeiboResponse 方法中打印出登录成功后返回的信息:
func didReceiveWeiboResponse(response: WBBaseResponse!) {
if let authorizeResponse = response as? WBAuthorizeResponse {
if authorizeResponse.statusCode == WeiboSDKResponseStatusCode.Success {
print(authorizeResponse.userInfo)
}
}
}
运行,唤起微博,点击授权,授权成功返回,得到以下结果: