Swiftで日付の操作
久しぶりの投稿です。
SwiftでCommonクラスに入れて使いまわしている日付取得用のメソッドです。
前はObjective−Cで書いていたのですが、Swiftに書き換えてみようと思い、土日数時間使ってちょこちょことやってます。
マンガ新刊情報〜圏外OK!買い忘れ防止アラートあり!〜
月を渡して表示させたい画像を選択
月の値を渡して画像を切り替えたいというときに使っています。
共通のメソッドは以下のようになってます。
/** 月から表示させる画像ファイル名を取得 */ func getMonthImage(strMonth:String)->String{ return commonConst.common.imageList[strMonth.toInt()!-1] }
画像のファイル名を月順に配列にもたせて、そこから取得する流れです。
class commonConst { struct common { static let imageList :[String] = [ "Jan.png", "Feb.png", "Mar.png", "Apr.png", "May.png", "Jun.png", "Jul.png", "Aug.png", "Sep.png", "Oct.png", "Nov.png", "Dec.png" ] } }
時差を取得
私が作ってる漫画の新刊情報取得アプリはローカルストレージに発売スケジュールを持ってます。
マンガの新刊情報ってそんな更新頻度ないんで1日1回だけ最新がないかチェックをかけてるわけです。
そういうわけで現在日時と前回更新日時の差分をとるためのメソッドです。
/** 時間の差分を取得 */ func diffDate(baseDate:NSDate,checkDate:NSDate) -> NSInteger{ var sinceInt = NSInteger(checkDate.timeIntervalSinceDate(baseDate)) return sinceInt/60 }
今日って第何週?
発売情報を週ごとに表示させる際、今日が第◯週だったらその週を最初から表示させてまう!
じゃ、今日は第何週目ですかー?というときのメソッドです。
(ULTRAMANかっこいい。。)
/** 今日が第何週か取得 */ func getTodayWeekOfMonth() -> Int { let calendar = NSCalendar.currentCalendar() var comp : NSDateComponents = calendar.components( NSCalendarUnit.CalendarUnitWeekOfMonth, fromDate: NSDate()) return comp.weekOfMonth }
日付フォーマット毎回書くの面倒
フォーマットさせたいNSDate型の日時と、取得したい日時フォーマット形式を渡すとStringで返してくれるメソッドです。
/** 日付のフォーマット */ func dateFormatter(date : NSDate, style : String) -> String { let dateFormatter = NSDateFormatter() dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") dateFormatter.dateFormat = style return dateFormatter.stringFromDate(date) }
使うときはこんな感じ。
/** 今日の月を取得 */ func getThisMonth()->String{ var now = dateFormatter(NSDate(), style: "M") return now }
以上ですー。
こうした方がかっこいいよ!というのがあればコメントよろしくですー。
Appleとの戦い
大変お待たせしました。今日Appleの審査に通り、無事(?)リリースを行えました。
今回のリリースは前回リリース時のバグ(データ永続化されてない)を修正したものです。
永続化されない問題を回避を再優先にしたリリースのため、その他いろいろと細かなバグが残っています。
今回の記事では経緯をまとめておこうと思います。
マンガ新刊情報のアプリではCocoaContorolsに登録されているライブラリ、MagicalRecordを利用しています。
前回のリリース時にこのMagialRecordを最新化+mogeneratorを最新化してました。
最新化に伴い使い方に一部変更があり、永続化方法が変更になってました。
修正は前回リリース日には既に完了しており、うまく行けばその後1週間後にAppleの審査が通り無事リリースされる見込みでした。
今回1ヶ月越しのリリースになったのは、このAppleの審査に4度落ちたからです。
1回目落ちた理由
[March 1, 2015 at 4:08 AM]
- 3.3 - Apps with names, descriptions, screenshots, or previews not relevant to the content and functionality of the App will be rejected
アイコン型広告の範囲を広げたことによる影響。
→アイコン型広告の公開範囲、(ギャンブル系など)を除去。
- 3.8 - Developers are responsible for assigning appropriate ratings to their Apps. Inappropriate ratings may be changed/deleted by Apple
最新刊情報のマンガ一覧で今アプリを公開している状態のレートにそぐわないとのこと。
つまりは、やらしいタイトルのマンガが対象年令のレートにそぐわないらしい。
→対象年令は9歳から12歳以上に変更しました。
2回目落ちた理由
[February 22, 2015 at 8:16 AM]
- 3.3 - Apps with names, descriptions, screenshots, or previews not relevant to the content and functionality of the App will be rejected
また3.3ですが、今回はアプリ内でRakutenやAmazonで購入できるというアプリ紹介文とアプリ紹介画像がNGとのこと。 →修正してすぐレビュー。
3回目落ちた理由
[February 12, 2015 at 8:48 AM]
- 11.13 - Apps that link to external mechanisms for purchases or subscriptions to be used in the App, such as a "buy" button that goes to a web site to purchase a digital book, will be rejected
アプリ内でRakutenやAmazonでの注文がダメとのこと。
まぁ知ってはいたんですが、今まで審査通ってたし今更感。。
アプリの魅力として、最新刊を知る→すぐ注文して購入できる!という流れを作りたかったための機能なのでちょっとレビューアと戦いました。
4回目落ちた理由
[February 4, 2015 at 2:27 AM]
- 2.25 - Apps that display Apps other than your own for purchase or promotion in a manner similar to or confusing with the App Store will be rejected
アプリ紹介画像に広告のアイコンが表示されているのはNGとのこと。
まぁ、、うん。。。今更ですが、とりあえず消しました。
- 11.13 - Apps that link to external mechanisms for purchases or subscriptions to be used in the App, such as a "buy" button that goes to a web site to purchase a digital book, will be rejected
3回目落とされたときから継続して戦い中。
アプリのレビューアと別の窓口があるので、そちらにもアプリの審査通らないから助けて!って連絡しました。
その人は、確かにアプリの魅力をわかってない!オレも文句言ったる!と言ってくれたんですが・・・
結局アプリレビューア最強ということで、こちらが折れる結果となりました。
レビューアとの戦いは以上です。
なので中途半端にアプリのアイコンがなくなってたりといろいろ指摘された箇所をつぎはぎで修正しています。
ただ永続化の問題を直すためだけだったのに・・・
なので次回リリースはSwiftを使って軽量化+デザインリニューアルを測りVer3を構想中です。
また次回のリリースをお待ちください。
SwiftでJSONを使ってみた
今までObjective-cでJSONをやっていたんですが、 Swiftをそろそろやってみようと思い調べながらやってみましたのでメモついでに書き込みます。
共通定数クラス
取得先のURLは共通定数クラスに定義したいので以下のようにしました。 (他にいい書き方ないのかな。。。)
import Foundation class const { /** JSON用URL */ class jsonUrl { class var hoge:String{ return "http://hoge.com/hoge.json" } ・ ・ ・ } }
JSONを取得してログに出してみる
JSONのサンプル
取得するJSONのサンプルは以下の通りです。
{ "items" : [ { "title" : "hogeeeeee", "image" : "http://hoge.co.jp/hogeeee.jpg", "release" : "2015-03-01T00:00:00+00:00", "auth" : "保毛保毛" }, ・ ・ ・ ] }
定数を取得
先ほど Const.swift で定義した値を使ってNSData
型で取得します。
var strJsonUrl = const.jsonUrl.hoge var jsonData = NSData(contentsOfURL: NSURL(string: strJsonUrl)!)
Swiftで単純にやってみた
キーitems
の中にあるリストから1つ目を取得し、その中のキーtitle
のValueを取得してみます。
let jsonMap:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData!,options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary if let itemsArray = jsonMap["items"] as? NSArray { if let firstItem = itemsArray[0] as? NSDictionary { if let item = firstItem["title"] as? NSString { println(item) } } }
面倒すね。。
hogeeeeee
SwiftyJSONを使ってみた
SwiftyJSONを取得します。 実際に使うのは Source ディレクトリの中にある SwiftyJSON.swift のみです。 そのままプロジェクトにドラッグアンドドロップで取り込みます。
git clone https://github.com/SwiftyJSON/SwiftyJSON.git
ソースは以下のとおりです。
let json = JSON(data:jsonData!) println(json) if let title = json["items"][0]["title"].string { println(title) }
とっても簡単! SwiftyJSONがすげー!って記事をいくつか見たんですが、半信半疑でやった結果 やっぱりすげー!でした。
参考
- [Swift] JSONを簡単に扱う為のライブラリ SwiftyJSONのサンプル - Developers.io
- SwiftでJSONを扱うライブラリ SwiftyJSON | json-swift - 定食屋おろポン
※サイトに記載されてるままではOptionalでエラーになってしまいました。
バーテンダーがいない未来
In Review
大変おまたせしています。
マンガ新刊情報のアプリについて今朝Appleの方でレビューが開始されました。
ただ、In Reviewに入ったのはいいんですが、そのまま土曜を迎えてしまっています。
今度こそ審査は通過する見込みですので来週火曜にはリリースされるのではと思っています。
※シアトルで審査していることを考えると日本時間では火曜になると思います。
もう少々お待ちください。
今回の臨時の修正でいろいろと不要なソースとなってしまったものもあるので、これを気にObjective-cからSwiftに切り替え軽量化、安定化を試みます。
いろいろと追加したい機能も考えているのでこれからもどうぞよろしくお願いします。