Edited at

SwiftでYoutube検索【メモ】

More than 3 years have passed since last update.


SwiftでYoutube検索【メモ】

Objective-C言語で書いていたYoutube検索処理をSwiftに置き換えてみました。Qiitaには要点だけ記載して、アプリの形にしたものはGithubに公開しています。


(Github:サンプルコード)

Youtubeの検索では、【YouTube Data API v3】を利用します。


YoutubeのAPIについて


API Key

Youtube検索で利用しているのは、【YouTube Data API v3】です。リンク先に設定の手順などが記載されているので、登録と設定を行い、Google Developer ConsoleでiOS用の API_Key を取得しておきます。

※この API Key をswiftのコード上で利用します。


URLとパラメータ

Youtubeに対するリクスエストURL内に含めるパラメータで、検索の条件などを指定することができます。

Youtube Data API v3 - Searchパラメータ

パラメータ
意味

&key=API_Key

事前に取得したAPI Keyを指定します

&q=検索文字

検索したい文字列です

&part=snippet
サムネイルなどの詳細情報を結果のJSON文字列に含める

&maxResults=10
最大件数10件

&order=viewCount
再生回数の多い順に並べ替え

今回使用するURLでは、上記の要素を指定しています。


URLの準備(Swiftコード)

Youtube APIで決められているURLを構成します。URLには事前の設定で取得したAPI_Keyを含める必要があります。また、検索のキーワードなどに日本語を含めることを前提としてして文字列はURLエンコード処置を行っておきます。


ViewController.swift


let API_KEY:String = "xxxxxxxxxxxx"

//SearchBarに入力されている文字列
println("search text=\(text)")

//URLエンコーディング(文字列エスケープ処理)
let searchWord:String! = text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

//Youtubeに対して、検索をかけるURL文字列
let urlString:String = "https://www.googleapis.com/youtube/v3/search?key=\(API_KEY)&q=\(searchWord)&part=snippet&maxResults=10&order=viewCount"

//データを読み取るためのNSURL
let url:NSURL! = NSURL(string:urlString)



JSONデータの取得

データの取得には、NSURLConnectionクラスを使用します。このクラスでURLに対してリクエストをする場合、同期、非同期の呼び出しが可能です。このコードでは非同期の呼び出しをしているので、結果が戻ってくるまでに時間がかかったとしても、iOSアプリの動作を妨げることがありません。

※エラー処理については割愛


ViewController.swift


let urlRequest:NSURLRequest = NSURLRequest(URL:url)

//URLに対してNSDataの結果を非同期で取得する
NSURLConnection.sendAsynchronousRequest(
urlRequest,
queue: NSOperationQueue.mainQueue(),
completionHandler:{(response,jsonData,error) -> Void in

//データが取得できた場合には、JSONを解析してNSDicrionaryに格納
let dic:NSDictionary = NSJSONSerialization.JSONObjectWithData(
jsonData!,
options: NSJSONReadingOptions.AllowFragments,
error: nil) as NSDictionary

//結果のJSON文字列から必要な箇所だけを取得(itemsのキーだけを取り出す)
let resultArray:NSArray = dic["items"] as NSArray
println(resultArray)

//取得したデータの表示
})


同期、非同期の切り替えには、使用するメソッドを切り替えます。

※NSURLConnectionクラスの使用方法は、Objective-Cと引数の記法など変わっているので、注意が必要です。

メソッド名
用途
結果の取得方法

sendSynchronousRequest
同期呼び出し
戻り値がNSData?

sendAsynchronousRequest
非同期呼び出し
クロージャの引数にNSData!


課題

SwiftでJSON文字列からDictionary,Arrayへの配列変換に使える機能が見当たらないため、NSDictionary,NSArrayを利用してデータを保持しています。Swiftで便利な方法があればそちらに書き換える予定です。