たとえば、YouTube Data API Search のpublishedAfter
など日時のパラメータを使う際、NSDate
からNSString
に変換するメモです。
おまけ
publishedAfter
は、「その日時以降の動画を検索対象にする」というパラメータです。実際には、Now
のところには「1日前」「1ヶ月前」などを入れて使います。
たとえば、YouTube Data API Search のpublishedAfter
など日時のパラメータを使う際、NSDate
からNSString
に変換するメモです。
publishedAfter
は、「その日時以降の動画を検索対象にする」というパラメータです。実際には、Now
のところには「1日前」「1ヶ月前」などを入れて使います。
Carthage関連の記事はSwiftと結びついていることが多いですが、Objective-Cでも使えます。
(Carthageに対応しているライブラリはSwiftのものが多いのかなと)
CocoaPodsも併用していますが、どちらも問題なく使えます。
(※ただ、ストアに申請したことがないので、併用が本当に問題ないかどうかは現時点では不明です)
読みは・・「カルタゴ」が正解?
(カーセージと読んでしまう><)
Homebrew環境です。
$ brew install carthage
私の環境ではパーミッションのエラーが出てしまったのでメモです。
Error: Permission denied - /Library/Caches/Homebrew/Formula/carthage.brewing
こちらを参考にしました。
Permission denied - /Library/Caches/Homebrew/Formula/nmap.brewing
$ sudo chown -R $USER /Library/Caches/Homebrew/
ディレクトリの権限を変更しておきます。
Cartfile
というファイルを用意します。
CocoaPodsでいうところのPodfile
ですね。
「Cartfile」という名称のファイルを自分で作って、プロジェクトのディレクトリに置きます。
(pod init
的なものはないようです)
例えば、
https://github.com/LeoNatan/LNPopupController.git
こちらのライブラリをCarthageで管理したいとして、Cartfile
には
github "LeoNatan/LNPopupController"
このように書きます。
☆ 参考: Example Cartfile
☆ LNPopupController (標準のミュージックアプリのミニプレーヤーに似たステキなControllerです)
Cartfile
の準備ができたら、
$ carthage update
を実行します。
正常に完了すれば、
Carthage
フォルダCartfile.resolved
ファイルが追加されます。
Carthage/Build/iOS
の中に、xxx.framework
があります。
(その他にdSYMファイルなどがあることもあります)
Carthageで管理しているFrameworkを、プロジェクトに追加しましょう。
Carthage/Build/iOS
にあるxxx.framework
ファイルを選択する。/usr/local/bin/carthage copy-frameworks
を追加する。$(SRCROOT)/Carthage/Build/iOS/xxx.framework
を追加する。☆参考: If you're building for iOS
☆参考: github/gitignore/Objective-C.gitignore
# Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build
上の.gitignore
では、CathageのBuildフォルダだけ除外という感じですが、
Carthageフォルダごと除外でよいかと思います。
# Carthage Carthage/
私はフォルダごと除外しています。
☆ Cartfile.resolvedについては、
strongly recommended to commit this file to your repository.
と念押しされています。
Cartfile
とCartfile.resolve
は、もれなくGit管理してあげましょう。
これで、Carthageのインストール 〜 ライブラリを利用する準備が整いました。
想像よりも気楽に準備が整えられたので良かったです。
それと、Run Scriptを追加する若干の手間はあるとしても、CocoaPodsよりもプロジェクトとの結合が疎な感じが、個人的には気に入りました☆
YTPlayerView
を使っています。
なんか画面表示されなくなった?? と思っていたら
つい昨日、0.1.5
にアップデートしたために動かなくなってしまった模様。
Received error rendering template: Error Domain=NSCocoaErrorDomain Code=258 "The operation couldn’t be completed. (Cocoa error 258.)"
こんなエラーが出ます。
うっすら追ってみると、YTPlayerView-iframe-player.html
のpath
がnil
になってしまっていて、↑エラーメッセージが出ている。
0.1.4
ではあったAssets
フォルダがなくなっている、というか
0.1.5
からAssets.bundle
にしたようですが、
それが入ってるフォルダが落ちてこない・・(cocoapodsを使っています)
Issueにも上がっていたので、ひとまず0.1.4
に戻して、動きを見守ろう・・
たこさんウィンナーのスタンプ\(^o^)/
その昔はお絵描きが趣味でした。(ここ5年ほどさっぱりでしたが)
前々から、「自分で使うスタンプを作ってみたい!」と思っていました。
わりとなんでも自作してみたくなるタイプです。(でも腰が重い)
「年内にリリース!」「1日1個書く!」と決めたその日から、ようやく取りかかったのでした。
売る気なし、完全に自己満足です。
2歳の娘が、初めてたこさんウィンナーを見たときの食いつきっぷりにいたく感激し、「私もたこさんウィンナーになりたい!!」と思いました!(アホ親)
1日1個(約10分)、約2ヶ月。
毎日(たまにさぼりつつも)ちまちま書き続けて、やっとこさ40個!
妙な達成感はありました!
10分x40個=400分=約7時間…1人日。
2ヶ月もかかってるけど、ぎゅっと濃縮したら1人日。
(でも、一日中描き続けるなんて私にはムリィ・・)
Fire Alpacaで作りました。フリーでありがたいです\(^o^)/
好きです、ファイアーアルパカ!
10/29に申請を出して、11/4に審査が通りました。
申請〜通過まで6日間でした。
リジェクトなしでした。
周知とかなんにもせず、リリース初日(11/5)に¥700ほど売り上げて、以降はゼロですwww
細長い山が1個だけ、ピョコンてなってます。
「新着」で偶然見かけた人が買ってくれたのでしょう・・!ありがとうsomeone・・!
以上です!
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
これをオーバーライドするだけだと、リモートコントロールのイベントを受け取れないんですね。
以前にリモートコントロールの処理を書いた時には、特別なことを記憶がないのですが・・。
謎は残りつつも、動いたコードをメモしておきます。
リモートコントロールのイベントを受け取りたいオブジェクトに、以下を追加します。
私はカスタムUIViewに書いていますが、動きました。
(一般的にはUIViewController
に書くことが多いかと思います)
UIViewController
の場合は、viewDidLoad
などに書きます。
(私はUIView
なのでawakeFromNib
に書きました)
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
オーバーライドします。
- (BOOL)canBecomeFirstResponder { return YES; }
この2つで、remoteControlReceivedWithEvent
が呼ばれるようになりました。
前回「iOSのロジックテストをはじめる」の続きです。
XCode7, XCTestを使っています。
今回は、Privateメソッドをテストしてみました。
(Privateのテストついてはさまざまな議論があると思いますが、今回はやり方のみ記録しています。)
Testing
カテゴリを追加します。#import <XCTest/XCTest.h> #import "Sample.h" // テスト対象のオブジェクト @interface Sample (Testing) - (void)privateMethodInSample; // テストしたいPrivateメソッドを書く @end // テストケース @interface SampleTests : XCTestCase @end @implementation SampleTests - (void)setUp { [super setUp]; } - (void)tearDown { [super tearDown]; } - (void)testSamplePrivateMethod { Sample *target = [[Sample alloc] init]; [target privateMethodInSample]; // 呼べます ... }
これだけでした。
想像以上にお手軽・・!
個人的には、Privateでもユニットテストを書きたい時があるので、テストしやすいのはうれしいです。
iOSで初めてまじめにテスト書こうと思いまして・・!(←色々と問題)
とっても最初の、スタート地点より手前なところからまとめていこうと思います。
環境はXCode7です。
XCodeで用意されてるテストは2種類あります。
このうちのロジックテストについて取り上げます。
(UIテストは・・またいつの日かっ)
プロジェクトを作成すると、ロジックテスト&UIテストが存在していて、テストを書ける状態が既に整っています。
これまで特に意識してませんでしたが、
Applicationプロジェクト作成時に、テストに関するチェックボックスがあります。
Include Unit Tests
Include UI Tests
標準ではどちらもチェック済みになっているので、 何も意識せずともテストが実行できる環境が出来上がっているのでした。(ありがたや)
Libraryプロジェクト作成時には、上記のようなチェックボックスがありません。
プロジェクト作成が終わった後に、自分でテストターゲットを追加します。
Libraryプロジェクト作成直後の状態から、テストターゲットを追加してみます。
1.メニューバーから File
- New
- Target
を選択
2.iOS
- Test
- iOS Unit Testing Bundle
を選択
3.Product Name
にテストターゲットの名前を入力して Finish
テストターゲットの名前は
プロジェクト名Test
プロジェクト名UITest
とするのが標準的なようです。
これで、テストを実行できるようになりました。
導入の敷居が低くてステキですね。
(もっと早くから取り組むべきだったんですけど・・・汗汗汗・・・
今日は、テストケースを先に書いてからメソッドの中身を実装する、という事をやってみました。なかなかおもしろかったです。状況に応じてまたやってみようっと。