シリコンバレーのマーケター日記

東京、シンガポールを経てシリコンバレーで働く、マーケター。英語、プログラミング、データ分析は次世代マーケターの必須スキルだと信じて進む。

API: Google News APIを引っ張ってきてWebViewで表示させる

今週からサーバー通信を学習し始めたので、下のサイトを参考に進めます。

参考サイト:

[Swift 1.1] swiftで api を叩いて、JSONをパースして、表示させる方法 (xcodeは6.1, iOSは8.1) - Qiita

iOS - [Swift]APIで取得したJSONをswiftyJSONでパースして、天気情報をUITableViewで表示。お天気アプリを作ってみる。 - Qiita

 

1) 用意

google newsのAPI
URLの"num=10"が引っ張ってくる記事の数になる
http://ajax.googleapis.com/ajax/services/feed/load? v=1.0&num=10&q=http%3A%2F%2Fnews.google.com%2Fnews%3Foutput%3Drss
SweefyJSON
無料で提供されているライブラリ。最初自力でやろうとしたのですが、昨夜ハマり死にそうになったところで、発見しました。JSONからのパースが本当に楽でした。以下のページからzipをダウンロードし、解凍したフォルダーの中のjson.swiftをDrag&Paste。 lingoer/SwiftyJSON · GitHub

[Swift] JSONを簡単に扱う為のライブラリ SwiftyJSONのサンプル

JSON整形サービス

一見難解なJSONをみやすく段落別けしてくれるので、全体把握に便利です。

 

2) Master Detail Applicationを選択しプロジェクト開始

f:id:yuyutata:20150531173901p:plain

3) 全体図

 

f:id:yuyutata:20150531175914p:plain

MasterViewController.swift

  • Class: UITableViewController
  • override func viewDidLoad():パースする関数の呼び出し

  • func makeTableData():パースする関数を自分で定義

  • override func numberOfSectionsInTableView(tableView: UITableView):セクション数を入れる
  • override func tableView(tableView: UITableView, numberOfRowsInSection section: Int):セル数入れる
  • override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath):セルの中に入れる文字を指定する

        cell.textLabel?.text = self.cellItems[indexPath.row] as? String

        cell.detailTextLabel?.text = self.urlItem[indexPath.row] as? String

  • override func prepareForSegue:Segueで画面遷移する先、遷移する際のkeyを入れる

DetilViewController.swift

Class: UIViewController

Webview:@IBOutlet weak var myWebView: UIWebView!

func configureView():この中にwebviewで開けるようにコードを入れる

4) ハイライト

ーJSONをパースする

MasterViewController.swiftのviewDidLoadの中に関数を呼び込むように仕込んで、外側でパースするための関数定義を別にする。なるほどです。ここ昨夜自力でやろうとしてうまくできなかったところ。swiftyJSONで配列の中の値をパースする場合、一番上からkeyを掘り下げていって表記します。

title = json["responseData"]["feed"]["entries"][i]["title"]

ーSegueで画面遷移させるところは、定石的に使い回し。

ーセットアップ

    // セクションの数

    let sectionNum = 1

    // 1セクションあたりのセルの行数

    let cellNum = 10

    // 取得するAPI

    let url = NSURL(string: "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Fnews.google.com%2Fnews%3Foutput%3Drss")

    // セルの中身

    var cellItems = NSMutableArray()

    var urlItem = NSMutableArray()

    // ロード中かどうか

    var isInLoad = false

    // 選択されたセルの列番号

    var selectedRow: Int?

5) 結果

GoogleAPIからリストを引っ張り、Webviewで閲覧することができました。WebView表示が最適化されていないのは秘密です。

f:id:yuyutata:20150531180828p:plain

雑感

ひとまず動いた。。良かった。シンガポールは三連休です。これでハマってコードが動かないと、週明けの、外資系であるある質問”Hey how was the weekend?"と聞かれるたびに悶絶するしかなかったので、ひとまず一歩進めて良かったです。