Home

袖触れ合うも多少の縁

iPhone gdata-objectivec-client でYouTubeへ動画をアップ

  • Posted by: goron
  • 2010年8月31日 21:49
  • iPhone

iPhoneアプリからYouTubeへの動画アップを実装しました。
その際、かなりつまずいたので解決策をメモしておきます。

つまづいたポイント


  1. YouTubeアカウント ID&PWが通らない

  2. アップロード中、エラーで中断する

まず、gdata-objectivec-client ライブラリは下記からDLしてください。
http://code.google.com/p/gdata-objectivec-client/

ビルドするのにかなりつまづきました。
ビルドは下記を参考にしました。
Google Data API クライアントライブラリのビルド

その他、基本的なことはgdata-objectivec-client に入っている。
Examples/YouTubeSampleを参照してください。


1.YouTubeアカウント ID&PWが通らない
ある特定のYouTubeアカウントだとなぜか通らないことがあります。

問題は、サンプルの
YouTubeSampleWindowController.m
- (void)uploadVideoFile;

NSString *username = [mUsernameField stringValue];
NSString *clientID = [mClientIDField stringValue];
NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:username  clientID:clientID];

サンプルの通りだとエラーになるアカウントがあります。
これを、

NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:@"default" clientID:@""];

usernameを使わずに@"default"にすると問題は解決されました。

以下参考:
http://code.google.com/p/gdata-objectivec-client/issues/detail?id=22


2.アップロード中、エラーで中断する
次に、何のタイミングでエラーが起きているのかは不明なのですが、
アップロード中に突然中断してしまい、localizedDescriptionには Cannot allocate memory というエラーメッセージがサーバから戻ってくることがありました。
また、NSErrorFailingURLStringKeyにはresume用のアドレスが戻ってきます。
今回検証していて上記のエラー頻発したのは、3GS iOS4でした。(でも3G 3.1.3ではほとんど起きなかった!?)
メッセージの通りメモリか、と。しかし対処法が無いと途方に暮れていたのですが、何とか解決できました。

やはりポイントは
YouTubeSampleWindowController.m
- (void)uploadVideoFile; 内の

サンプルではアップロードする動画ファイルを下記で行っています。


NSData *data = [NSData dataWithContentsOfFile:path];

どうも、これだとメモリを食うらしく、上記を

NSData *data = [NSData dataWithContentsOfMappedFile:path];

にしてやれば、上記のエラーは出なくなりました。
アップロードもどんなに時間がかかっても最後まで無事にできるようになりました。

かなり、ネット上でも情報が乏しかったので、大変でしたが何とか解決出来て良かったです。
また誰かのお役に立てればと思います。

iPhone UISegmentControl の大きさ

  • Posted by: goron
  • 2010年8月 5日 16:55
  • iPhone

UISegmentControlのセグメントはセグメントのテキストを変えると自動で文字数の長さに合わせて大きさを変えてくれます。文字数が少ないと小さいセグメントができちゃう。
その他例えば、タブで画面を切り替えて、セグメントのテキストを入れ替えて使う場合などで、各タブで大きさがマチマチになって気持ち悪い。
そんな時はサイズを固定しちゃいましょう。

たとえば、ボタンが3つあるとして、
それぞれの大きさを60pxに設定して、全体は180pxにします。


//ボタンに使うテキスト
NSArray  *seg = [[NSArray alloc] initWithObjects:@"猫",@"鳥",@"犬",nil];

UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:seg];

//各セグメントのサイズを統一
for(int i = 0; i < 3; ++i) {
[segment setWidth:60 forSegmentAtIndex:i];
}

//全体のサイズを設定
CGRect rect = segment.frame;
rect.size.width = 180;
[segment setFrame:rect];

UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithCustomView:segment];
self.navigationItem.rightBarButtonItem = barButton;
[segment release];
[barButton release];
[seg release];

iPhone テキストフィールドからフォーカス外す

  • Posted by: goron
  • 2010年8月 3日 15:27
  • iPhone

久々のiPhoneネタ更新です。
viewに複数のテキストフィールがある場合、フォーカスのあたっているテキストフィールドを特定せずにキーボードを隠す方法。

テキストフィールドにフォーカスがあたると、キーボードが自動で出てきます。
iPhone UIKeyboard メモ

このキーボ--ドが出た状態で、UIAlertViewなどが出ると、
ログに"wait_fences: failed to receive reply: 10004003"と出力されます。
特に動作に問題はないようだけど、なんか嫌ですね。
解決法は、UIAlertView等を出す前にキーボードを消せば良いです。
[UITextfield resignFirstResponder] ですね。
テキストフィールドが1つの場合は、これでもいいのですが、もしviewに複数テキストフィールドがある場合は、どのテキストフィールドにフォーカスがあるのか特定しないといけないです。
これは面倒です。

すると、必殺技がありました。
[viewcontroller.view endEditing: YES ];
で、どのテキストフィールドにフォーカスがあっても問題なくキーボードを隠せます。

参考サイト
http://appteam.blog114.fc2.com/blog-entry-99.html

iPhoneアプリ リリース(やっと)

  • Posted by: goron
  • 2010年7月 7日 19:37
  • iPhone

今日 7/7 やっと、携わっているプロジェクトからiPhoneアプリをリリースできました。
無料ですのでiPhoneをお持ちの方はダウンロードしてみてください。
http://www.clipcm.com/iphone.html


今日のAppBankMACお宝鑑定団のBlogにも紹介されたみたいです。


リリース初日で15位に入っております。(7/7 19時現在)
Itunes エンターテインメント 無料アプリ一覧

レビューでの評価も上々のようでなによりなのですが、
「再起動できない」とのコメントがありますね。。。
チェックした限りそのような問題は起こらず、原因不明。
レビューでは環境などが分からないので対応ができないですね。
サポートへ連絡してもらえるといいんですけど。

今後、機能強化も次期アップデートで予定しています。

iOS SDK4.0でのビルド

  • Posted by: goron
  • 2010年6月28日 21:47
  • iPhone

6/5にiPhoneアプリをアップルへ申請してリジェクトもされずに審査通過しました。ありがたや。しかし7/7にアプリリリースと、リリースまでは時間があります。
と、思った矢先、6/22 iOS4が出ましたね。分かっていたことだけど。
いざ、実機でチェックすると、MPMoviePlayerControllerが音は出ているけど、映像が流れないというバグが発生していました。。。
そして、リリース前にすでにアップデートを再度申請することになりました。何とも愚かな。

MPMoviePlayerController では、movieControlModeやMPMoviePlayerContentPreloadDidFinishNotification などが非推奨になっています。
ちなみに上記の映像を表示するには、MPMoviePlayerをaddSubviewする必要がありました。


修正したデータを再度申請に出そうとそのままビルドしたのですが、アップロードできません。
"The binary you uploaded was invalid. The application-identifier entitlement is not formatted correctly; it should contain your 10-character App ID Seed, followed by a dot, followed by your bundle identifier."
と、エラーメッセージがでます。

かなり焦りましたが、グーグル先生に聞いたところ、下記のサイトにたどり着きました。
iOS SDK 4.0でコンパイルしたアプリzipのApp Storeアップロードでエラー

どうも使用しているEntitlement.plistに項目を追加しないといけなかったようです。
自分は上記サイトにもあるように、Entitlement.plistを一旦削除して、新規で作成しました。これで、無事審査に出すことができました。。。

iPhone textureToolが使えない時

  • Posted by: goron
  • 2010年6月 1日 09:34
  • iPhone

OpenGLで圧縮テクスチャを利用する際、
iPhone SDKにはtextureToolというコマンドラインツールがあると書籍にあります。
普通にSDKをインストールすれば、
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/textureTool
にインストールされています。

それで、ターミナルで実行してみたけど、textureToolがありませんと出ちゃう。
-bash: texturetool: command not found

と思ったら、pathを指定しなければいけなかった。。。このことも書籍に書いて欲しかった。
.bash_profileに下記を追加する。

PATH="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH}"
export PATH


.bash_profileは
open /Applications/TextEdit.app ~/.bash_profile
でターミナルから開けます。

参考サイト:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/22649-cannot-get-texturetool-work.html

Twitter告知での計測結果だよ(T-T)

  • Posted by: goron
  • 2010年5月17日 15:07
  • iPad | twitter

iPadお触りする会で実験したこと。

iPadの期待度とTwitterでのみの告知して、
福島でどれぐらいの人が集まるものなのか? 実験してみました。

予想よりは遥かに寂しい結果となりました。。。
何かの役に立つか分かりませんが一応共有しておきます。

5/14(金)16時ごろ twitter にてツイート。
自分@hiranodept のフォロワー数は80。

その他RTしてくれた方々のフォロワー数
@BUN さん 910
@makotone さん 390
@acqua8 さん 193
@syoh_xxx さん 1137
@teruteru1950 37
(みなさんありがとうございました)

その他、概要説明 ブログ
http://www.hirano-dept.com/blog/2010/05/ipad-1.html
Google Analytics 上記ページ:5/14-5/16
アクセス数:60 (14日:36回 15日:15回、 16日:9回)

当日来場者数:8名(うち子供2名、 関係者4名)

以上のような結果となりました。
さあ、ここから何が見えてくるでしょうか。。。?


5/14の午前に突然思い立って行動してみたという、無計画ぶりもさることながら
そんな中、twitterでの僕の発言をいち早くキャッチしてくれ、
@acqua8さんは 自ら会場の手配してくれたり、
@BUNさん@makotoneさんは積極的にRTして頂けたり、
自分一人の力ではできないことを自発的行動していただきました。ありがたや〜

すでに予定があり、実際来たくても来られなかった方や、
このお知らせツイートに気づいた時には、会はもう始まっていて来れなかったりと
そのようなツイートをのちにいくつかみることもできました。
まぁ、ツイートするタイミングはとても重要のようです。(当たり前!)
そんな状況でも見に来て体験していただけた方がいたということは
大変ありがたい話しで、驚きであるかもしれません。

【iPadが郡山にくるよ!】

  • Posted by: goron
  • 2010年5月14日 16:41
  • iPad

突然ですが、
【iPadが郡山にくるよ!】と題して iPadお触りする会を開催しますよ。

日時:平成22年 5月16日 (日)13時〜15時
場所: 郡山地域テクノポリスものづくりインキュベーションセンター 会議室(MAP

今月末には日本でもiPadが発売されます。
発売前に触ってみたい方はぜひ遊びに来てください。
ちなみに無料です。

お触りしたいアプリなどありましたら、#iPad_fukushima でツイートしてください。
可能な限りインストールしておきます。

お問い合わせはメールで:
hirano@hirano-dept.com

iPhone MPMoviePlayerController再生中にタッチイベント取得してスキップさせる

  • Posted by: goron
  • 2010年4月28日 18:07
  • iPhone

アプリ起動時に、ムービーを表示していて、タッチしてスキップさせる方法がやっと分かりましたのでメモしておきます。
そもそも、MPMoviePlayerController の movieControlMode = YES にしておけばコントローラが出て「完了」ボタンを押せばよい話ですが、このコントローラを出したくないとき(movieControlMode = NO)に使えるのではないでしょうか。

参考にした書籍:iPhoneSDK開発のレシピ

今回はMPMoviePlayerController の上にUIViewを貼付けて、UIViewでタッチイベントを拾うようにします。

まず、起動時にムービーを表示させるのは、下記等を参考にしてください。
[iPhone] メディアプレイヤーで動画再生

ポイントは、keyWindowを取得して、それにUIViewをaddSubviewすることでした。
このkeyWindowの取得方法がなかなか分からなかった。。。

自分が試した方法は、ムービーがプリロードを完了した
- (void) finishPreload:(NSNotificationCenter *) aNotification
が呼ばれた時、MPMoviePlayerController の再生メソッドを呼んだ後にUIViewを作成しaddSubviewする。
(再生メソッドを呼ぶ前だとUIViewがムービーの背面に位置してタッチイベントがとれませんでした)

具体的には


- (void) finishPreload:(NSNotificationCenter *) aNotification {
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerContentPreloadDidFinishNotification object:player];
[player play];

//ムービースキップ用のUIView --SkipView
//SkipView にはタッチイベントを取得して、ムービー停止を呼ぶメソッドがある
skip = [[SkipView alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480)];
UIWindow *movieWindow;
movieWindow = [[UIApplication sharedApplication] keyWindow];
[movieWindow addSubview:skip];
[skip release];
}

[[UIApplication sharedApplication] keyWindow]でkeyWindowを取得してaddSubviewする。
SkipViewがタッチを取得したら、[player stop] を呼んで、画面遷移すればOK。

書籍では、UIViewを90度回転させていますが、回転させなくても問題ありませんでした。

ちなみに、ムービーは横位置(landscape)で再生されるのですが、縦位置(portrait)で再生したい場合は-90度回転させたムービーを作成すればよいです。(気がつくと当たり前なんですけど。。結構悩んだ)


iPhone UIImageViewのアニメ

  • Posted by: goron
  • 2010年4月22日 22:59
  • iPhone

ちょっとした気づき。
UIImageViewへUIImageの配列を渡すと、コマアニメしてくる。animationImagesプロパティ。
あまり高速ではないけど。


NSArray *imgset =[NSArray arrayWithObjects:img1,img2,img3,nil];
UIImageView *imgView = [UIImageView alloc]init];
imgView.animationImages = imgset;
imgView.animationDuration = 2.0;

とすると、2秒でimgset配列の3枚の画像を再生してくれる。
各画像の秒数を細かく設定はできないみたい。

[imgView startAnimating];
でアニメスタート

[imgView stopAnimating];
でアニメ停止

imgView.animationRepeatCount = 1;
とすると、1回再生して終了。

RepeatCountを設定すると、設定回再生すると最終フレームで止るのかとおもいきや、
画像は消えちゃう。例えば、最終フレームをそのままフリーズさせておきたい場合は、
imgView.image = UIImage 最終フレーム画像
をセットしておけばよい。これに気づくのに時間がかかった。。。


おまけのCore Animation
レイヤーでアニメーションの設定して、アニメーション終了後にレイヤーの状態が
初期状態にもどるため、画面が一瞬フラッシュするようになる。
(メモリが不足してもそうなるみたい)

CABasicAnimation.removedOnCompletion = NO;
CABasicAnimation.fillMode = kCAFillModeForwards;

上記の2つの設定をいれないと、パカっとなります。
CATransform3DMakeRotation等使うとよく分かります。


Index of all entries

Home

Profile

福島県白河市のホームページ制作・web制作:平野百貨店
福島県白河市を拠点に首都圏でホームページ制作・web制作をしている平野百貨店の店長個人の覚書です。
ご意見・ご感想などお問合せはコチラからどうぞ。

MyBook Shelf
Search
AppStore RANKING
RSS
リンク
のこぎりそうの日記

Return to page top