うるおいらんど

アプリ開発やサイト制作のメモとか。

【WordPress】WordPressの記事をJSON形式で出力し、アプリで受け取る方法【Swift】

魚ライン
魚ライン

誰でも投稿できるサイトをWordPressで作り、その投稿をアプリに反映させたい!ということでやってみました。

 

まずは流れです。

【WordPress上ですること】

・誰でも投稿できるフォームを作成する。(ここは別記事にします!)

・JSON形式のデータを作成する

【Xcode上ですること】

・JSONデータから必要なデータを取得する

 

JSONデータを作成して、それを受け取る!そのまんまですね。

 

WordPressの投稿をJSONデータにする

まずはWordPressから。

今回はプラグインは使いません!

プラグインを用いることももちろんできるのですが、今回カスタム投稿を使用していたため、なかなか思い通りにいかず、結局プラグインなしでできる方法を見つけたのでそちらでいきます。

 

まずはページのテンプレートを作ります。適当にapi-page.phpとしておきます。

その中にこのコードを書きましょう。

 

カスタム投稿の場合はスラッグ名を書くことで、その投稿のみを取得することができます。

今回は全記事を取得したいので numberpostsは-1にしています。

 

次に固定ページを作成します

スクリーンショット-2016-01-24-0.41.43

 

タイトルは適当につけて、テンプレートを先ほど作ったAPI Pageに設定します。

そして公開して指定したリンク先に飛んでみましょう!

 

ピャーッ

スクリーンショット-2016-01-24-0.49.21

 

とりあえず最新3記事にしたんですけど膨大な量ですね。てか単に文字のエンコードがひどくて長くなってるだけなのもあると思うけども・・・。

JSONファイルの形式は下のような形です

 

こんな感じの配列になっています。

JSONLintにて少し見やすくしてみましょう。

 

スクリーンショット-2016-01-24-0.59.45

 

これだとわかりやすいですね!

エンコードされてしまった文字列を確認したい場合は、Web便利ツール/URLエンコード・デコードフォーム – TAG index Webサイトにて確認してみてください。

 

WordPress側ですることはこれだけです。

 

アプリでJSONデータを受け取る

続いてXcodeで作業していきます。

こちらはライブラリを使っていきます「swift-json」というものを使用していきます。swiftyではないので注意ですよ!

 

json.swiftというファイルを作成しておき

https://github.com/dankogai/swift-json/blob/master/json/json.swift」こちらのコードをまるっとコピーして貼り付けましょう。

 

そして必要な箇所にて使用していきます

 

これで1番目の”post_title”のデータが取得できます。

 

しかし何故かこんなエラーが出る

Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.
 

この対処法の詳しい説明はこちらの記事に書かれていました->[iOS 9] iOS 9 で追加された App Transport Security の概要

やり方としてはプロジェクトの中にひっそりといるInfo.plistというファイルを少しいじるだけです。

 

右クリックでadd Rowを選択して以下を追加していきます。

スクリーンショット-2016-01-24-1.16.37

App Transport Security Settings(Dictionary型)を用意し

その中にException Domains(Dictionary型)を入れます。

その中に通信を許可したいサイトのドメインを入れます。(サブドメインを使用している場合はメインのドメイン)

NSTemporaryExceptionRequiresForwardSecrecy = true にすればOKです

 

もうひとつのNSIncludesSubdomainsはサブドメインも許可するかどうかです。許可する場合は付け足しておきましょう。

 

これでやっとJSONデータを取得できるはずです!

 

おまけ:

JSONファイルから記事のタイトルのみを全て抽出するときは

 

こんな感じにまず配列の個数を数えてからその分だけ繰り返しfor文を行うようにしてみました。

配列の個数を返してくれるものがあるのかもしれませんが、とりあえずわからなかったので。

最後に.asString!をつけることでJSONからStringに変換します。

Intとかも同様に.asIntで変換できますよ。

 

 

先ほど説明で用いたこちらのJSONデータを取得するとします

 

コンソールに表示させればわかるんですが

と書くとJSONデータの全てを取得します。

つまり、上記全てです。

 

次にjson[0]とします

これだと一番最初のデータを取得します

この部分です。

 

最後にjson[1][“lunch”]を取得してみます

結果は「パスタ」となります。

 

この程度でしか使用していないのですが、とにかく思ったより楽にできた!気がします。

 

感想

めちゃくちゃ時間がかかると思っていたのですが、意外とすんなりできました(それでも半日以上は悩んでましたけど)

wordpressでjsonファイルを作るとき、通常の投稿を取得するだけならばプラグインを用いた方が早いと思います。

「WP REST API」のプラグインは導入するだけでURLの最後にwp-json/を付け加えるだけでJSONデータを作成してくれるので簡単です。そこからカスタム投稿と上手く繋げることができなかったため今回の方法をとりました。

 

アプリ側ではSwiftyJSONやAlamofireを使用しようとしていたのですがエラーエラーで使えず。そういえば以前も同じようにこれらを使用してターミナルと戦ってた気がします。

とにもかくにもプラグインやライブラリを用いずにできるならばそれに越したことはないかなとも思いますので結果はよかったのかな・・・・?

 

アプリも後はメモリ管理とリリース前のアイコン作成とかのみになりました。今月中にはなんとかリリースできそうです。頑張ります!

それでは

 

参考サイト

//wordpress

[WordPress] 記事を JSON で出力する API ページを作る – rakuishi.com

WordPressの投稿データをJSON形式で外部アプリに渡す | バシャログ。

//swift

SwiftでJsonを簡単に扱えるライブラリ「swift-json」が超便利! – しろかい!

[iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO

【iOS9】HTTP→HTTPSだと!App Transport Security(ATS)について

dankogai/swift-json: Even Swiftier JSON Han… – GitHub

 

 

 

 

 

魚ライン
モッピー!お金がたまるポイントサイト
魚ライン

Swiftの記事一覧を見る

コメント

コメントは認証制です。詳しくは下記の注意をお読みください。

コメントを残す

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

魚ライン 魚ライン