Xcode
iOS
Swift

SwiftでYoutube検索【メモ】

More than 3 years have passed since last update.

SwiftでYoutube検索【メモ】

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

(Github:サンプルコード)

スクリーンショット 2014-11-12 21.39.37.png

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で便利な方法があればそちらに書き換える予定です。