YouTubeDataAPIの動画再生画質サイズまとめ

iOSYTPlayerViewに定義されている定数YTPlaybackQualityとサイズの対応表、および再生画質関連のメモ。

YouTube JavaScript Player API Reference  |  YouTube IFrame API  |  Google Developers

動画プレーヤーの高さは以下のいずれかの値に、プレーヤーのサイズは 16:9 のアスペクト比にそれぞれ設定することをお勧めします。

YTPlaybackQuality 高さ (pixel) サイズ (pixel) アスペクト比
kYTPlaybackQualitySmall 240 320x240 4:3
kYTPlaybackQualityMedium 360 640x360 or 480x360 16:9 or 4:3
kYTPlaybackQualityLarge 480 853x480 or 640x480 16:9 or 4:3
kYTPlaybackQualityHD720 720 1280x720 or 960x720 16:9 or 4:3
kYTPlaybackQualityHD1080 1080 1920x1080 or 1440x1080 16:9 or 4:3
kYTPlaybackQualityHighRes 1080以上 1920x1080以上 16:9以上

たとえば、画質レベル large をリクエストし、それが無効な場合、再生画質は medium に設定されます(このレベルが有効であれば)。

YouTube Data APIでパラメータに日時を扱うとき

たとえば、YouTube Data API SearchpublishedAfterなど日時のパラメータを使う際、NSDateからNSStringに変換するメモです。

おまけ

publishedAfterは、「その日時以降の動画を検索対象にする」というパラメータです。実際には、Nowのところには「1日前」「1ヶ月前」などを入れて使います。

Carthageを使おう

環境

めも

  • Carthage関連の記事はSwiftと結びついていることが多いですが、Objective-Cでも使えます。
    (Carthageに対応しているライブラリはSwiftのものが多いのかなと)

  • CocoaPodsも併用していますが、どちらも問題なく使えます。
    (※ただ、ストアに申請したことがないので、併用が本当に問題ないかどうかは現時点では不明です)

  • 読みは・・「カルタゴ」が正解?
    (カーセージと読んでしまう><)

Carthageインストール

Homebrew環境です。

$ brew install carthage

もしPermission Deniedが出たら

私の環境ではパーミッションのエラーが出てしまったのでメモです。

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

Cartfileというファイルを用意します。
CocoaPodsでいうところのPodfileですね。

「Cartfile」という名称のファイルを自分で作って、プロジェクトのディレクトリに置きます。
(pod init的なものはないようです)

Cartfileの例

例えば、
https://github.com/LeoNatan/LNPopupController.git
こちらのライブラリをCarthageで管理したいとして、Cartfileには

github "LeoNatan/LNPopupController"

このように書きます。

☆ 参考: Example Cartfile
LNPopupController (標準のミュージックアプリのミニプレーヤーに似たステキなControllerです)

carthage update

Cartfileの準備ができたら、

$ carthage update

を実行します。

正常に完了すれば、

  • Carthage フォルダ
  • Cartfile.resolved ファイル

が追加されます。

プロジェクトの設定

Carthage/Build/iOSの中に、xxx.frameworkがあります。
(その他にdSYMファイルなどがあることもあります)

Carthageで管理しているFrameworkを、プロジェクトに追加しましょう。

Linked Frameworks and Libraries

  1. 「General」タブを開く。
  2. 「Linked Frameworks and Libraries」の「+」から、Carthage/Build/iOSにあるxxx.frameworkファイルを選択する。

Run Script

  1. 「Build Phases」タブを開く。
  2. 「+」から「New Run Script Phase」を追加する。
  3. 「Shell」の欄に/usr/local/bin/carthage copy-frameworksを追加する。
  4. 「Input Files」の「+」から、$(SRCROOT)/Carthage/Build/iOS/xxx.frameworkを追加する。

☆参考: If you're building for iOS

.gitignore

☆参考: 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

Cartfile.resolvedについては、

strongly recommended to commit this file to your repository.

と念押しされています。

CartfileCartfile.resolveは、もれなくGit管理してあげましょう。

以上です!

これで、Carthageのインストール 〜 ライブラリを利用する準備が整いました。
想像よりも気楽に準備が整えられたので良かったです。

それと、Run Scriptを追加する若干の手間はあるとしても、CocoaPodsよりもプロジェクトとの結合が疎な感じが、個人的には気に入りました☆

参考

[Swift] CocoaPodsとCarthageの違い / ライブラリ管理 - Qiita

Swiftで使えるライブラリ管理ツールCarthageの使い方

YTPlayerViewが動かなくなった (0.1.5)

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.htmlpathnilになってしまっていて、↑エラーメッセージが出ている。

0.1.4ではあったAssetsフォルダがなくなっている、というか
0.1.5からAssets.bundleにしたようですが、
それが入ってるフォルダが落ちてこない・・(cocoapodsを使っています)

Issueにも上がっていたので、ひとまず0.1.4に戻して、動きを見守ろう・・

Release 0.1.5 doesn't include Assets #157

LINEスタンプを作ってみました

たこさんウィンナーのスタンプ\(^o^)/

f:id:takopomm:20151107231800j:plain

その昔はお絵描きが趣味でした。(ここ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・・!

まとめ

  • ただただ、自分のためだけに作ったスタンプを、通りすがりの誰かが買ってくれていたことに驚愕しました。
  • すごい売り上げを叩き出す人、定期的にリリースしている人を、尊敬します。
  • お金にすることの難しさがよくわかりました。勉強になりました。
  • 自作スタンプへの愛着の湧き度合いは異常!ずっと愛でて使おう☆

以上です!

RemoteControlReceivedWithEventが呼ばれない時

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

これをオーバーライドするだけだと、リモートコントロールのイベントを受け取れないんですね。
以前にリモートコントロールの処理を書いた時には、特別なことを記憶がないのですが・・。
謎は残りつつも、動いたコードをメモしておきます。

イベントを受け取れるようにするには

リモートコントロールのイベントを受け取りたいオブジェクトに、以下を追加します。

私はカスタムUIViewに書いていますが、動きました。
(一般的にはUIViewControllerに書くことが多いかと思います)

1. beginReceivingRemoteControlEvents

UIViewControllerの場合は、viewDidLoadなどに書きます。
(私はUIViewなのでawakeFromNibに書きました)

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];

2. canBecomeFirstResponder

オーバーライドします。

- (BOOL)canBecomeFirstResponder {
    return YES;
}

この2つで、remoteControlReceivedWithEventが呼ばれるようになりました。

参考

iOSのロジックテスト その2

前回「iOSのロジックテストをはじめる」の続きです。

XCode7, XCTestを使っています。

今回は、Privateメソッドをテストしてみました。
(Privateのテストついてはさまざまな議論があると思いますが、今回はやり方のみ記録しています。)

Privateメソッドのテスト

  1. テスト対象のオブジェクトにTestingカテゴリを追加します。
  2. テストしたいPrivateメソッドを定義します。
  3. テストケースで呼び出します。
#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でもユニットテストを書きたい時があるので、テストしやすいのはうれしいです。