給新手的新浪微博 SDK 集成教程【一】

給新手的微博 SDK 集成教程

微博 SDK 介紹

WeiboSDK是對新浪微博公開接口的一些封裝,iOS 應用的開發者可使用它來訪問新浪微博的 API,進行登陸受權,獲取用戶信息,獲取微博列表,發微博等等。其實就是對 微博 API 的包裝,無非就是給新浪的服務器發送一個請求,而後處理收到的回覆(固然,其實不止這麼多,它還能夠跟你手機上的微博客戶端作交互)。html

微博開發者帳戶

這個沒什麼好說的,到微博開放平臺去註冊吧。註冊完了,添加一個應用,填寫應用信息,就能夠得到一個 AppKey(這個在後面要用到)。須要注意的幾個點以下:ios

1.Bundle ID 必須與你的 App 一直,不然測試時會出錯。git

clipboard.png

2.回調地址填通常填默認的就能夠了,除非你須要在本身的服務器處理回調。github

clipboard.png

3.能夠把本身的微博帳戶添加到測試帳戶以方便測試。web

SDK 集成

能夠按照微博文檔裏說的方式手工集成(把依賴的源碼,文件等都手工加入到工程裏,手工的更改編譯配置等),又或者可使用 CocoaPods 工具自動集成。swift

CocoaPods

CocoaPods 是一個 iOS 開發的依賴管理工具。什麼叫依賴呢?好比說你開發一個 App,裏面須要用到微博 SDK,則你的這個 App 依賴於微博 SDK。一個實際的項目中,可能會依賴十幾個甚至更多的第三方庫,若是每個都像手工集成微博 SDK 那樣集成,會很麻煩,也不利於維護。因而產生了神器 CocoaPods,簡單的來講,你只須要維護一份配置文件,這個文件裏列出來你須要集成哪些第三方庫,而後運行一條命令,CocoaPods 會自動地從網上下載相關的文件,而後自動地幫你配置好整個工程。api

安裝 CocoaPods

CocoaPods 是使用 Ruby 寫的,OS X 上已經默認安裝了 Ruby,因此能夠直接使用它來安裝 CocoaPods。在安裝以前須要注意一下,因爲衆所周知的緣由,在國內訪問國外的不少網站會很慢,好比 Ruby 的默認源,可是不用擔憂,taobao 作了一個 Ruby 源的鏡像,因此在安裝以前,最好先把 Ruby 的默認源改成 taobao 的鏡像:xcode

// 刪除默認源
$gem sources --remove https://rubygems.org/
// 添加淘寶的 Ruby 鏡像
$gem sources -a https://ruby.taobao.org/

// 查看結果
$gem sources -l

替換成功以後就能夠安裝 CocoaPods 了:ruby

$sudo gem install cocoapods

參照 CocoaPods 安裝教程 上所述,若是你的系統升級到了 OS X EL Capitan,則使用下面的命令安裝:服務器

$sudo gem install -n /usr/local/bin cocoapods

安裝完以後,運行一下 setup,耐心,這一步很慢:

$pod setup

使用 CocoaPods 集成微博 SDK

如前面所述,你只須要提供一個配置文件就能夠, 其它的都交給 CocoaPods,這份配置文件就是 Podfile。假設你如今有個工程叫作 WeiboDemo.xcodeproj,在你的 WeiboDemo.xcodeproj 文件相同的目錄下新建一個名叫 Podfile 的文件(或者運行 pod init),用任何文本編輯器打開該文件,輸入一下內容:

# Uncomment this line to define a global platform for your project
platform :ios, '8.0'
# Uncomment this line if you're using Swift
use_frameworks!

target 'WeiboDemo' do

pod "WeiboSDK", :git => "https://github.com/sinaweibosdk/weibo_ios_sdk.git"

end

先不用在乎這個配置文件的格式,大部分時候,你只須要寫相似 pod xxxx 就能夠,別的地方都不用動。保存 Podfile 文件後,運行:

$ pod install

安裝完成後,項目目錄下會多出一個叫作 WeiboDemo.xcworkspace 的文件,注意:以後打開工程的時候都不能再經過原來的 WeiboDemo.xcodeproj 文件了,而是須要打開 WeiboDemo.xcworkspace。CocoaPods 新建了一個 workspace,而後把你原來的工程以及一個包含全部 CocoaPods 管理的第三方庫的 Pods 工程都加入到這個 workspace 裏去。

是否是很簡單?若是之後你須要增長別的第三方庫,只須要編輯 Podfile 文件, 而後從新運行一下 pod install 命令就能夠了。好比下面這個就是咱們某個項目裏用到的第三方庫:

platform :ios, '8.0'
inhibit_all_warnings!
use_frameworks!

pod 'RestKit', '~> 0.25.0'
pod 'SDWebImage', '~>3.7.2'
pod 'BlocksKit', '~>2.2.5'
pod 'pop', '~> 1.0.8'
pod 'MBProgressHUD', '~> 0.8'
pod "Qiniu", :git => 'https://github.com/KyleXie/objc-sdk.git', :branch => 'AFNetworking-1.x'
pod 'KTCenterFlowLayout'
pod 'ReactiveCocoa', '4.0.4-alpha-1'
pod 'SnapKit', '~> 0.15.0'
pod "SwiftAddressBook", '~> 0.5.0'
pod "WeiboSDK", :git => "https://github.com/sinaweibosdk/weibo_ios_sdk.git"
pod 'UICollectionViewLeftAlignedLayout'
pod 'UMengAnalytics-NO-IDFA'
pod 'Locksmith'
pod 'iRate', :git => 'https://github.com/nicklockwood/iRate.git'
pod 'TSMessages', :git => 'https://github.com/KrauseFx/TSMessages.git'

配置 URL schemes

前面有提到微博的 SDK 能夠跟你手機上的微博客戶端作交互(舉個栗子,你在本身的 App 裏點了某個按鈕後,直接跳到了微博 App 裏的微博發送頁面,發完微博又回來了。其它如跳轉到微信發個消息,跳轉到支付寶付個錢等也都是同理),感興趣的能夠看一看 Inter-App Communication。爲了作到這個,咱們須要配置一下項目的 URL Schemes。以下圖所示, 在工程的 Info 下,找到 URL Types, 點擊下方的小 + 按鈕,新增一個 URL Type,identifier 填入 com.weibo,URL Schemes 填入 wb+AppKey(好比說你的 AppKey 是 123, 則這裏填入 wb123)。

clipboard.png

還沒完

新浪微博的 SDK 是用 ObjC 寫的,而你的項目可能已經在使用 Swift 了,這裏你須要加一個橋接的頭文件,以便於你在 Swift 的代碼裏調用 ObjC 的代碼。操做起來也很簡單,隨便在工程裏添加一個 ObjC 的文件,Xcode 就會提示你添加 WeiboDemo-Bridging-Header.h 文件(WeiboDemo 是項目名稱,也能夠手工添加這個文件)。在 WeiboDemo-Bridging-Header.h 文件里加入:

#import "WeiboSDK.h"

噠噠!你就能夠在 Swift 的代碼裏引用 WeiboSDK 了。
(其實,若是 WeiboSDK 是一個 framework 的話,你們就能夠直接使用 Swift 的 import framework 來引入了,不須要添加橋接的文件,不少其餘的第三方庫都是這種方式。)

先來個受權登陸吧

1.集成完微博 SDK 以後,就能夠在本身的 App 裏調用調起微博客戶端來進行受權了, 在 AppDelegate.swift 文件裏,加入如下代碼:

let appKey = "xxxxx" // 記得上面說過的 AppKey 吧?填在這裏


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    WeiboSDK.enableDebugMode(true)
    WeiboSDK.registerApp(appKey)
    return true
}

這裏主要是微博 SDK 的初始化,打開 debug 模式,能夠看到更多的調試信息,若是出錯了也能夠知道錯在哪裏。

2.隨便在某個 ViewController 裏添加一個登陸受權的按鈕,在按鈕的點擊事件裏發送微博受權的請求:

@IBAction func onLoginBtn(sender: AnyObject) {
    let request = WBAuthorizeRequest.request() as? WBAuthorizeRequest
    request?.redirectURI = redirectURI
    request?.scope = "all"
        
    WeiboSDK.sendRequest(request)
}

這段代碼的意思就是每當這個按鈕別點擊的時候,就向微博的 SDK 發送一個 WBAuthorizeRequest 請求,若是你的手機上裝了微博客戶端,則會跳轉到微博 App,請求受權,若是沒有安裝,則會彈出一個 web 頁面,讓你登陸微博帳戶來受權。

3.這樣還不夠,你還須要處理請求的返回結果,不能發完請求就完事了。WeiboSDK 使用的是在 Cocoas 開發中很經常使用的 delegate 模式來處理請求的結果響應,也就是說你的請求發送出去以後,響應的結果會在你設置的 delegate 裏通知你。這個 delegate 就是 WeiboSDKDelegate 協議,因此你須要有個類實現 WeiboSDKDelegate 協議,該協議下聲明瞭兩個方法:

/**
 收到一個來自微博客戶端程序的請求
 
 收到微博的請求後,第三方應用應該按照請求類型進行處理,處理完後必須經過 [WeiboSDK sendResponse:] 將結果回傳給微博
 @param request 具體的請求對象
 */
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request;

/**
 收到一個來自微博客戶端程序的響應
 
 收到微博的響應後,第三方應用能夠經過響應類型、響應的數據和 WBBaseResponse.userInfo 中的數據完成本身的功能
 @param response 具體的響應對象
 */
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response;

第一個是用來處理微博客戶端發來的請求的, 第二個是用來處理本身發送的請求的響應消息的,好比說咱們剛纔發的受權請求,有結果了就會在這第二個方法裏處理。

咱們可讓 AppDelegate 類實現 WeiboSDKDelegate 協議。首先聲明 AppDelegate 服從 WeiboSDKDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate, WeiboSDKDelegate {

而後在 AppDelegate 類裏實現 WeiboSDKDelegate 的兩個方法:

func didReceiveWeiboRequest(request: WBBaseRequest!) {
    if (request.isKindOfClass(WBProvideMessageForWeiboRequest)) {
        
    }
}
    
func didReceiveWeiboResponse(response: WBBaseResponse!) {
    if (response.isKindOfClass(WBAuthorizeResponse)) {
        let message = "響應狀態: \(response.statusCode.rawValue)\nresponse.userId: \((response as! WBAuthorizeResponse).userID)\nresponse.accessToken: \((response as! WBAuthorizeResponse).accessToken)\n響應UserInfo數據: \(response.userInfo)\n原請求UserInfo數據: \(response.requestUserInfo)"
        let alert = UIAlertView(title: "認證結果", message: message, delegate: nil, cancelButtonTitle: "肯定")
        alert.show()
    }
}

因爲咱們這個示例裏不須要處理微博發送給咱們的消息,第一個方法爲空。第二個方法裏對 WBAuthorizeRequest 請求的響應 WBAuthorizeResponse 作了處理,當收到該響應時, 彈窗顯示結果。

其實這整個過程跟 UITableView 的 delegate 或 datasource 是相似的,當你調用 reloadData 方法時,UITableView 會去找你指定的 datasource 要數據,有多少行要顯示,每一行是多高,每一行顯示什麼內容等,當你點擊了某一行的時候,UITableView 會經過你設置的 delegate 來通知你等等。

4.真的是最後一條了!還缺什麼呢?若是你類比 UITableView 的話, 就會發現,還少了設置 delegate 這一步,若是你不設置 WeiboSDK 的 delegate 爲你指定的對象,它本身是不知道該把這些消息發送給誰處理的,就像 UITableView 同樣,若是你不設置 datasource 和 delegate,它是沒有辦法正確顯示結果的。

在 AppDelegate 裏添加以下方法:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return WeiboSDK.handleOpenURL(url, delegate: self)
}

若是你還記得前面說的 App 間交互(URL Schemes),這個方法從名字就能夠看出來它的用處,打開一個 url,若是你在這個方法裏打個斷點,看一看 url 的值,就會發現:

clipboard.png
url 就是我們在 URL Types 裏定義的內容, sourceApplication 是 com.sina.weibo,這說明是新浪微博 App 想要打開咱們的 App,咱們把這個消息轉發給 WeiboSDK 來處理,並設置 WeiboSDK 的 delegate 爲 AppDelegate 類的對象(self)。(雖然搞不懂爲毛要在這裏設置 delegate,而不是初始化的時候就設置)。

至此,當你運行 App,點擊「登陸」按鈕,跳到微博或者彈出網頁登陸,而後再回到 App 的時候應該能夠看到以下的彈窗:

clipboard.png

若是沒有意外的話, 受權算是完成了,拿到了 access_token, 就能夠用它來調用別的微博接口了,好比獲取用戶信息,好比獲取用戶微博,好比發微博等。這些等着下回分解吧。

完整的項目及代碼見WeiboDemo

相關文章
相關標籤/搜索