テスト用のターゲットを作成する必要があります。 ユニットテストを有効にした場合は、MyApplication_Testsという名前のターゲットが既に存在しているかもしれません。 その場合に、もしそのターゲットをユニットテスト用に使用しないのであれば、そのターゲットをKIF用に使用しても構いません。 それ以外の場合は、以下の手順で新規にターゲットを作成してください。
- Xcode上でプロジェクトやターゲット選択欄から、ターゲットの追加を押す
【やりたいこと】
| NSHTTPURLResponse *httpurlResponse = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:@"/hoge/"] | |
| statusCode:200 | |
| HTTPVersion:nil | |
| headerFields:@{}]; | |
| RKResponseMapperOperation *responseMapperOperation = [[RKResponseMapperOperation alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"/hoge/"]] | |
| response:httpurlResponse | |
| data:[NSData new] | |
| responseDescriptors:@[ | |
| [RKResponseDescriptor responseDescriptorWithMapping:responseMapping | |
| extension String { | |
| var lastPathComponent: String { | |
| get { | |
| return (self as NSString).lastPathComponent | |
| } | |
| } | |
| var pathExtension: String { | |
iOS9からApp Transport Security(ATS)が追加されました。 ATSとは安全なネットワーク接続を実現するための機能であり、Appleの要件を満たしていない場合は接続失敗という扱いになります。
対象となるのは、自社内サーバ、WebView経由、サードパーティライブラリ(SNS、広告、分析など)だと思います。 ATS自体を無効にするのはあまり良いやり方ではないので、これらのドメインをATSの例外に設定するのが一般的なやり方だと思います。
設定方法はInfo.plistに指定の情報をセットするだけです。 しかし、プロジェクトのTargetが多かったりConfigurationによって設定を分けたい場合には、Info.plistを個別に用意して管理する必要がありますが、無駄にInfo.plistファイルが増えるので良い方法ではないと思います。
最近AppleがProtocol Buffersの公式プラグインをGitHubに公開して話題になったので、実際に使ってみました。APIの通信が速くなったり、型安全に通信処理を書ける など、メリットが多いと感じたので簡単に紹介します。
他の事例だと、iOSオールスターズ2で発表された「これから始めるProtocol Buffers導入」が非常に参考になると思うので併せて読んでみてください。
この記事ではProtocol Buffersの概要について書いています。別途こちらの記事で使い方について サンプルを使って説明している ので、併せて読んでみてください。
この記事では、Protocol BuffersをSwiftでどう使うかサンプルアプリを使って説明します。Protocol Buffersの詳細はこちらの記事を先に読むと大体のイメージが掴めると思います。個人的には Protocol Buffersのメリットは型安全に書けて高速な通信が実現する ことだと思います。
今回のサンプルアプリは、クライアント側はAPIKit、サーバ側はKituraで 通信処理を実装します。サンプルアプリはGitHubで公開しているので、こちらからダウンロードして試してみてください。
また、URLSessionで実装したサンプルアプリもこちらに用意しました。URLSessionだけでも楽に実装できるので、こちらも参考にしてみてください。
| import UIKit | |
| protocol StoryboardInstantiable { | |
| static var storyboardName: String { get } | |
| static var storyboardIdentifier: String { get } | |
| } | |
| extension StoryboardInstantiable where Self: UIViewController { | |
| static var storyboardName: String { return String(describing: self) } | |
| static var storyboardIdentifier: String { return String(describing: self) } |
| import Foundation | |
| protocol UserDefaultsStorable { | |
| associatedtype UserDefaultsKey: RawRepresentable | |
| static func userDefaultsValue(forKey key: UserDefaultsKey) -> Bool? | |
| static func userDefaultsValue(forKey key: UserDefaultsKey) -> Int? | |
| static func userDefaultsValue(forKey key: UserDefaultsKey) -> Int64? | |
| static func userDefaultsValue(forKey key: UserDefaultsKey) -> Double? | |
| static func userDefaultsValue(forKey key: UserDefaultsKey) -> String? |
| import UIKit | |
| extension UITableView { | |
| func registerNib<T: UITableViewCell>(forCellType type: T.Type) { | |
| let name = String(describing: type) | |
| let nib = UINib(nibName: name, bundle: nil) | |
| register(nib, forCellReuseIdentifier: name) | |
| } | |
| func registerNib<T: UIView>(forHeaderFooterType type: T.Type) { |