Web・IT うんたらら

業務系とWeb系の狭間でIT業界を彷徨いながら備忘録と足跡を残していきます

iTunes ConnectからApp ビデオプレビューを登録する際のハマりどころ等まとめ

Markdownで手軽にEvernoteへメモできるアプリ、Everkdownのver.1.2を公開しました。

Everkdown - Markdownで素早くEvernoteにメモ

Everkdown - Markdownで素早くEvernoteにメモ

  • Takehiko Iwanaga
  • 仕事効率化
  • ¥200

今回のアップデートに伴い、App ビデオプレビューを投稿してみました。
iOS8から実装された、AppStoreでアプリの動画が観られるアレです。

思いのほかいろいろハマったのでメモしておきます。

アプリ動画の撮り方

Macに実機(iPhoneiPad)を接続すれば、QuickTime Playerで簡単に動画を撮影できます。(Yosemite以降)
[ファイル]→[新規ムービー接続]→[表示されたウインドウにて録画マーク横の三角形]→[該当のデバイス] →[録画マーク]でOK。
投稿できる動画の長さは30秒程度までのようなので注意しましょう。
動画のカット編集には、以下のツールなどを使うといいかと。
avidemux プロジェクト日本語トップページ - SourceForge.JP

動画フォーマットを調整

以下のツールなどでエンコードできます。
HandBrake: Open Source Video Transcoder

とくに注意すべきは以下のあたり。

  • Video Codec: H.264(x264)
  • Framerate(fps): 30
  • [Window]→[Picture Settings]でサイズを調整

アップロード

全言語共通です。サイズは別々で、3.5インチには設定不可。

アップロード時のエラー

App ビデオプレビューを保存できませんでした

上記メッセージが表示される場合は、おそらく動画のフォーマットが間違っています。

App ビデオプレビューの処理中です

この処理には最大24時間かかることがあります...だそうですが、私の場合は24時間たっても終わりませんでした。
(この状態でレビューを申請すると不明なエラーが返ってきてしまいます。)
一度ビデオを削除後、再度アップロードすると数分であっさり完了したので、あまり時間がかかるようでしたら再アップロードしたほうがいいかと。

【FireMonkey】Delphi XE7のMessageDlgをXE6以前の仕様で使えるようにする

Delphi XE7からMessageDlgにコールバック関数を渡し、非同期で実行できるようになりました。
参考: FMX.Dialogs.MessageDlg - RAD Studio API Documentation

それはいいんですが、何を思ったか、Androidの場合に限り、従来の同期処理でメッセージダイアログ表示ができなくなりました。
しかもコンパイル時に警告も出ず、実行時にエラーメッセージが表示されるのみ。

Embercadero......いつもながらやってくれるな (#^ω^)ビキビキ

とりあえず個別で対策

その後の処理を全部無名関数に囲んで渡してしまうか、別の関数に切り出せば、とりあえずは動きます。
修正前が以下のソースとするなら

case MessageDlg(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) of
  mrYes: ShowMessage('yes');
  mrNo: ShowMessage('no');
end;

このように修正

MessageDlg(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, 
  procedure(const AResult: TModalResult) begin
    case AResult of
      mrYes: ShowMessage('yes');
      mrNo: ShowMessage('no');
    end;
  end
)

とはいえ、従来のソースを全部このように修正するのはかなり大変です。

XE6以前と互換の関数を作って置き換える

ということで、作りました。

FireMonkey/FMX.Dialogs.Wait.pas at master · vamview/FireMonkey · GitHub

これをusesに追加し、既存のMessageDlgをMessageDlgWaitに置き換えるだけ。

case MessageDlgWait(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) of
  mrYes: ShowMessage('yes');
  mrNo: ShowMessage('no');
end;

【Objective-C】NSStringをASCIIコードで指定

CRLF (0xd + 0xa) = @"\r\n"とか、ポピュラーなエスケープシーケンスが用意されているものはいいのですが、もっとマイナーなASCIIコードの制御文字を入力or指定したい場合の処理。
stringWithFormatでいけました。

NSString *bs = [NSString stringWithFormat:@"%c", 0x8];

こんな感じ。
上記を実行した結果、0x8には@"\b"というエスケープシーケンスが用意されていることが判明し若干ショックを受けているのですが...それはそれということで。
おそらくSwiftでも同様の方法で可能だと思います。