Help us understand the problem. What is going on with this article?

SwiftでYoutube検索【メモ】

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away