SwiftによるシンプルなRSSリーダーの作り方、を試してみた 2

SwiftによるシンプルなRSSリーダーの作り方

SwiftによるシンプルなRSSリーダーの作り方、を試してみた 1

二日目

サムネが読み込めない

OGP("og:image")がなんか取ってこれなかったので、HTMLReaderを使いmetaタグから 持ってくる方法にシフト。

これを使いするため、クラス名のYqlと関係なくなるので、APIManagerに 名前を変更。

import Alamofire
import HTMLReader

class APIManager {
    class func test_request() {
        APIManager.yqlRequest(
            url: "http://d.hatena.ne.jp/nitoyon/rss",
            query: "select title from rss",
            success: { (data: Dictionary) in print(data) },
            fail: { (error: Error?) in print(error!) }
        )
    }

    // rssデータからjsonへの変換
    // https://qiita.com/tmf16/items/d2f13088dd089b6bb3e4
    // https://qiita.com/mishimay/items/1232dbfe8208e77ed10e
    class func yqlRequest(
        url: String,
        query: String,
        limit: Int = 0,
        success: @escaping (_ data: Dictionary<String, Any>) -> Void,
        fail: @escaping (_ error: Error?) -> Void) {
        
        let host = "https://query.yahooapis.com/v1/public/yql"
        let limit_query = (limit == 0) ? "" : "limit \(limit)"
        
        let param: Parameters = [
            "format": "json",
            "q": "\(query) where url='\(url)' \(limit_query)"
        ]
        
        Alamofire.request(host, method: .get, parameters: param).responseJSON { response in
            if response.result.isSuccess {
                success(response.result.value as! Dictionary)
            } else {
                fail(response.result.error)
            }
        }
    }

    // ["og:image": "http://image.png"]
    class func ogRequest(
        url: String,
        success: @escaping (_ data: Dictionary<String, String>) -> Void,
        fail: @escaping(_ error: Error?) -> Void) {
        
        Alamofire.request(url, method: .get).responseString { response in
            if response.result.isFailure {
                print(response.result.error!)
                return
            
            
            let html = HTMLDocument(string: response.result.value!)
            
            let ogTags:[HTMLElement] = html.nodes(matchingSelector: "meta[property^=\"og:\"]")
                
            var dict = Dictionary<String, String>()
            ogTags.forEach {
                let property = $0.attributes["property"]!
                let content = $0.attributes["content"]!
                dict[property] = content
            }
                
            success(dict)
        }
        
    }
}

一応完成。

感想

  • UITableViewのスクロールで画像がずれるとかいろいろ問題あり。
  • なんかロードが遅い。
  • 使えそうなやつをぶっこんでいったせいで、他の利用法とか調べてない。
  • リロード機能とかまだ実装が足りていない部分が多々。
  • 起動しているが、たまにrssを読み込んでくれない?バグが発生する。

やはり作ってみることで、問題→解決策という手順で学べる事が多い。 rssからのデータ整形、og:image=http...からサムネ取得、 YQLの使い方など今後も役に立つ知識なので、やってよかった。

特にCocoaPodsは、Podfileに記述するだけで利用でき、削除も不要な行を消せば できるので、理解すれば超絶楽だった。

完成品は自分のgithubに保存しておきます。
https://github.com/tikyuu/RssReader-Swift

f:id:hayateasdf:20171024104237p:plain