HOME > RSSリーダで利用するAPIを検証してみる
ニュースアプリの様なRSSを表示させたいのですがXMLを処理するAPIが数点存在するようです。 Swiftにあったものを見つけ出せたらと思います。
参考:SwiftのRSS Readerを100行で作ったよ
参考:iOS初心者がSwiftでグノシーみたいなタブ型RSSリーダーを作ってみた
参考:SwiftだけでRSSリーダーを作ってみた
参考:MWFeedParser を Swift で使ってみる
参考:Foundation Framework Reference NSXMLParser Class Reference
参考:XML Parsing in Swift Language – iOS 8 – NSXMLParser
参考:SwiftでiOS開発:RSSリーダー
参考:iOSアプリでXMLを解析する方法(NSXMLParser)【基礎編】
ざっとみたところNMFeedParserとFoundationに含まれる標準のNSMMLParserを利用する場合があるようですので検証します。利用対象はYahooのニュースにしてみます。 http://rss.dailynews.yahoo.co.jp/fc/rss.xml
こちらはGitHubからソースを取り出しプロジェクトに追加、ObjectiveCで記載されていますので、 ブリッジヘッダでObjective-CとSwiftの掛け渡し処理を事前に行います。詳しくはこちらー>Objective-CとSwiftの共存。
結果:15分ほどいじっていたのですが、GitHubのソースもでライブラリだけと分けられておらず(?)簡単に実装できませんでした。コンパイルまで進めましたが APP起動時に落ちる等、どうもうまく処理がはしりませんので保留。なの解析もできず、、、、。導入はもしかすると簡単ではないのかもしれません(私が未熟なだけかもですが、、、)
こちらは迷わず実装できました。YahooニュースからタイトルとLinkだけを取得しているサンプルです。これを元に自由にカスタマイズしてください! 解析の順序を理解していないと混乱するのかもしれませんが、要はタグで囲まれた文字列があったとすると、開始タグー>間の文字列ー>終了タグ 次の要素の開始タグー>間の文字列ー>終了タグ、 とパース処理が実行されてきます。それぞれ処理するparser関数が違うのでデバッグで処理してみてください。下に結果のログも参考にご確認ください。大きなタイトルとサブタイトルが混合されていますが、そのあたりはこれを元にカスタマイズいただければ感謝です。
import UIKit
class ViewController: UIViewController,NSXMLParserDelegate {
var isTitle:Bool=false
var isLink:Bool=false
var parser = NSXMLParser()
override func viewDidLoad() {
super.viewDidLoad()
var url:String="http://rss.dailynews.yahoo.co.jp/fc/rss.xml"
var urlToSend: NSURL = NSURL(string: url)!
parser = NSXMLParser(contentsOfURL: urlToSend)!
parser.delegate = self
//以下の1行の処理でparse関連の処理が行われる。
var success:Bool = parser.parse()
if success {
println("パース成功")
} else {
println("パース失敗")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// ここから下はParse関連処理
//開始タグを読み込んだ時よばれる - Start
func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) {
if (elementName == "title"){
isTitle = true;
}else if(elementName == "link"){
isLink = true;
}
}
//閉じタグを読み込んだ時よばれる - End
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if (elementName == "title"){
isTitle = false;
}else if(elementName == "link"){
isLink = false;
}
}
//タグ以外のテキストを読み込んだ時(タグとタグ間の文字列)
func parser(parser: NSXMLParser, foundCharacters string: String?) {
if(isTitle)
{
println("タイトル=\(string)")
}else if (isLink){
println("リンク=\(string)")
}
}
//エラー発生時
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
NSLog("failure error: %@", parseError)
}
}
上記のコードを実行すると以下がログ出力されます
タイトル=Optional("Yahoo!")
タイトル=Optional("ニュース・トピックス - トップ")
リンク=Optional("http://news.yahoo.co.jp/")
タイトル=Optional("川内原発 きょう午前再稼働")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/nuclear_power_plant_reoperation/?id=6170182")
タイトル=Optional("70")
タイトル=Optional("年談話「おわび」に言及へ")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/abe_cabinet/?id=6170195")
タイトル=Optional("舛添氏 新国立完成前倒し要請")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/new_national_stadium/?id=6170183")
タイトル=Optional("旧日本軍の巨大地下壕を公開")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/domestic/defence_policy/?id=6170170")
タイトル=Optional("境内で半裸ライブ 遺族ら反発")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/local/ibaraki/?id=6170192")
タイトル=Optional("上原 右手首骨折で今季絶望")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/sports/uehara_koji/?id=6170194")
タイトル=Optional("本田翼は棒? 月9の通説に反論")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/entertainment/sereal_tv_drama/?id=6170184")
タイトル=Optional("神野美伽 荒木氏と離婚へ")
リンク=Optional("http://dailynews.yahoo.co.jp/fc/entertainment/divorce/?id=6170189")
パース成功
Foundationの標準クラスのNSXMLParserで十分対応可能です。
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|