Video Cloud App SDK for iOS および Cocoa Touch での作業において陥りやすい過ちを、以下に記載しています。ここでの概説は、アプリケーションを正しくプログラミングするために役立ちます。Video Cloud App SDK for iOS に関する以下のドキュメントについてもご確認ください。
iPhone 向けのプログラミングにおいて、メモリ管理に関する問題がよくみられます。クラッシュなしで使いやすいアプリケーションを作成することは非常に重要です。 ここではメモリ管理の黄金律について確認します。new、alloc、または copy を含むメソッドでオブジェクトを作成する場合、後にそのオブジェクトをリリースあるいはオートリリースする必要があります。さらに、retain メソッドの呼び出しによってオブジェクトのオーナーシップを得ることが必要になる場合があります。Video Cloud Media API 呼び出しを行うとき、BCVideo などの返されたオブジェクトはいったん保持し、不要になった時点でリリースしなければなりません。メモリ問題のデバッグは苦痛を伴う場合があります。 しかしアプリケーションを慎重に開発し、コードを徐々に実行し、行き詰まった場合にはオンラインで検索することにより、エラーを正確に把握できるはずです。Xcode 3.2 をインストールしている場合、メモリ管理の潜在的な問題を見つけるには、Build メニューの Build and Analyze オプションが役立ちます。Apple のデベロッパ用ドキュメントにコード分析に関する詳細が記載されています。
ユニット テストは、アプリケーションをより安定させ、意図した通りにコードが機能しているかを確認するための優れた方法です。Apple iOS SDK には、ユニット テスト フレームワークで必要な基本機能すべてを提供する、OCUnit フレームワークが付属しています。サードパーティによる Objective-C 用のユニット テスト フレームワークは数多く存在しますが、プロジェクトへの組み込みには、アプリケーションの一部をモックしてテストを簡素化する OCMock を推奨します。
API トークンを入力する必要があります。そうしなかった場合は、呼び出しを試みた際に BCMediaAPI が NSInternalInconsistencyException 処理を実行します。
BCMediaAPI *api = [[BCMediaAPI alloc] initWithReadToken: APIToken];
Video Cloud API への呼び出しを行った際、結果が NIL かどうかをチェックします。NIL の場合、パラメータとして渡したエラー ポインタをチェックします。
BCMediaAPI *api = [[BCMediaAPI alloc] initWithReadToken: APIToken];
NSError *e;
BCVideo *video = [api findVideoById: 12345 error: &e];
if (video) {
[video retain]; //保持されるよう動画が定義される
} else {
NSString *errStr = [api getErrorsAsString:e];
NSLog(errStr);
}
findVideoById を無効な動画 ID で呼び出しているなど、探しているオブジェクトが見つからない場合、結果は NIL となって、エラーに「NULL」のメッセージが含まれます。以下の例では、動画 ID 121212 は存在しません。
BCMediaAPI *api = [[BCMediaAPI alloc] initWithReadToken: APIToken];
NSError *e;
BCVideo *video = [api findVideoById: 121212 error: &e];
if (video) {
[video retain];
} else {
NSString *errStr = [api getErrorsAsString:e];
NSLog(errStr); // 受け取ったエラー: コンソールに NULL がログされた
}
アプリケーションはユーザー側で使用されているため、ネットワークの信頼性はいつでも変わる可能性があります。ユーザーのデバイスが Video Cloud サービスにアクセスできない場合、エラー ポインタには NSCocoaErrorDomain エラーが記述されます。
BCMediaAPI *api = [[BCMediaAPI alloc] initWithReadToken: APIToken];
NSError *e;
BCVideo *video = [api findVideoById: 456123 error: &e];
if (video) {
[video retain];
} else {
NSString *errStr = [api getErrorsAsString:e];
NSLog(errStr); // 受け取ったエラー: オペレーションが完了できなかった。(Cocoa エラー 256) コンソールにログ
}
非アクティブ化された動画、無効な動画、スケジュールの関係でアクティブでない動画、あるいは不許可の状態の動画(メディア共有で共有された動画で起きる場合がある)を再生しようとすると、プレーヤ UI に真っ黒の画面がロードされます。これらの状態にある動画は再生しないでください。
ストリーミング動画を再生しようとすると、Apple MPMoviePlayerController クラスが例外を投げます。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:'Invalid content URL provided to MPMoviePlayerController (media url)'.
RTMP および RTMPe プロトコルは MPMoviePlayerController クラスでサポートされていません。ストリーミング コンテンツを HTTP 経由で再生するため、ユニバーサル デリバリ サービスを使用するように Video Cloud アカウントを設定することをお勧めします。以下の例に、BCMediaAPI オブジェクトでユニバーサル デリバリ サービスをオンにする方法を示しています。
BCMediaAPI *api = [[BCMediaAPI alloc] initWithReadToken: APIToken]; [api setUdsSupportOn:YES];
プロパティが設定されると、すべての Media API 呼び出しが media_delivery=HTTP 引数が付加されて行われます。
BCMediaAPI オブジェクトがメディアの地域制限メタデータを返した場合でも、MPMoviePlayerController では地域制限はサポートされていません。これについては将来のサポートが検討されています。
初期設定では、Video Cloud Media API への呼び出しはすべて、api.brightcove.co.jp に送信されますが、api.brightcove.co.jp に送信するよう設定することが可能です。これには、BCConfigManager クラスで setRegion() メソッドを使用します。このメソッドは、BCRegionUS か BCRegionJP のどちらかのリージョン列挙値を取ります。
高解像度での動画再生はプレーヤにアーチファクトを起こす可能性があります。モバイル機器での再生には、低解像度でのエンコーディングをお勧めします。デフォルトのトランスコード設定を使用している場合は、問題はありません。そうでない場合、帯域幅合計が約 256 kbps であり、H.264 ベースライン プロファイルでエンコードされたレンディションが動画に必要です。
.flv などのサポートされていない形式を HTTP から再生しようとすると、エラー警告が表示されます。既知の問題として、警告が消えてからステータス バーが表示されることが報告されています。
Video Cloud App SDK for iOS の 1.x リリースでは、Twitter での動画共有に Twitter の Basic 認証を使用します。Twitter は将来、API における Basic 認証を終了する予定です。したがって、別の認証 API を使用する Video Cloud App SDK for iOS が新たにリリースされるまで、iOS 用 Video Cloud アプリから Twitter への共有が利用できなくなります。iOS 用 Video Cloud アプリでの共有エラーを回避するには、以下を行う必要があります。
これらのヒントが Video Cloud App SDK for iOS を使用した iPhone アプリケーション開発に役立つことを願っています。サポートが必要な場合あるいは質問がある場合は、フォーラムにアクセスしてください。また、Video Cloud App SDK for iOS については Twitter(http://twitter.com/bciphonesdk)でもフォローできます。