Hi-farm blog

ActionScript 3.0 , AIR , FLEXからCocoa, OpenGL

最近iOSのGameCenter、特にLeaderBoard周りに興味があって調べているのですが、はまりまくっている状態なので残しておきます。
iTunes ConnectでLeaderboardを作ってみて、一応アプリから表示はできるもののなぜかデータが登録できないなどある場合に意外に気づきませんでした。

iTunes ConnectでLeaderboardを作るだけではだめで、Manage Your Appsから対象となるアプリのVersionsにある View Details からGame Centerの横にあるグレーのボタンをクリックして、 ”Enabled for This Version”に変える必要があります。

赤く囲んでいるボタンをクリックします。
to_view_details

↓ここの赤枠で囲んでいるところがグレーの場合はクリックして画像の状態にしてください。
gamecenter_itunesconnect

その他についてはこちらのブログ記事が非常に参考になるのでご紹介します。
iOS Game CenterでLeaderboardのScore送信が反映しない « istb16 blog
http://istb16.wordpress.com/2011/09/13/ios-game-center_leaderboard_scoresend/

これには気づいたもののまだまだ解決できていないところがあるので解決できたらまた記事あげますね。。。

新しくMacBookを買ったりして、普通にLionがインストールされているだけの場合、macportsをインストールできないことがあります。

バイナリの場合は、「このMacにはインストールできません」といわれ、ソースコードの場合は ./install.shしたときに「no acceptable C compiler found in $PATH」といわれます。

この場合、XCodeをインストールすると問題なくインストールできるようになります。

連投すみません。

UINavigationControllerを使って階層化されたViewを使うときにはUITableViewと組み合わせる事もあると思うのですが、一つ前の画面に戻るときにデータを再読み込みさせたい時の方法が分からなかったのでメモ。

NSArray* naviary = [self.navigationController viewControllers];
    NSInteger current = [naviary count]-1;
    UITableViewController* prev = (UITableViewController*)[naviary objectAtIndex:current-1];
    [prev.tableView reloadData];

navigationControllerがviewControllersという配列で今までのUIViewControllerの参照を保持しているので、一つ前の階層なら最後から一つ前の要素の参照を取得し、reloadDataをすることで現在の画面で変更したデータを反映させた結果を表示する事も可能です。

今日はメモです。

iOSアプリ開発で、独自に作成したUITableViewCellをタップした時にデフォルトのUITableViewCellと同じように文字色を変えたかったのですが、見つかるまでに少し時間がかかったのでメモしておきます。

独自で作成したUITableViewCellのサブクラス内に

-(void)setHightlighted:(BOOL)highlighted animated:(BOOL)animated

というメソッドがあるので、それをオーバーライドしてhighlightの値を元に表示を切り替えると画面に触れたときに、文字色を変える事ができます。

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if(highlighted){
        [self setWhite];
    }else
    {
        [self setBlack];
    }
    [super setHighlighted:highlighted animated:animated];
}

※setWhite, setBlackは文字色を変更するための独自メソッドです。

時間が空いてしまいました。

さて、今回はCSS3アニメーションをjavascriptで設定、制御する例を残しておきます。
CSS3アニメーションはSafari(Windowsは未検証)、Mobile SafariではプロパティによってはGPUで動作するため、通常のアニメーションと比較すると非常に滑らかに動作します。

例えば矩形を動かしてみましょう。

css3アニメーションサンプル(webkit用) – jsdo.it – share JavaScript, HTML5 and CSS

idがrectであるdivをアニメーションさせています。

@-webkit-keyframes rectanimation
{
    0%{
	-webkit-transform: translate(0px, 0px) scale(0.5);
    }
    30%{
	-webkit-transform: translate(300px, 200px) scale(2);
    }
    100%{
	-webkit-transform: translate(300px, 100px) scale(1.0);
    }
}

#rect
{
    background-color: #f00;
    width: 100px;
    height: 100px;

    -webkit-animation-name: rectanimation;
    -webkit-animation-duration: 1400ms;
    -webkit-animation-iteration-count: 100;
    -webkit-animation-timing-funciton: ease-in-out;
}

では、これと同じコードをjsで書いてみましょう。せっかくなので、onclickでアニメーションを起動させてみましょう。
基本的には通常のcss->jsのルールと同様です。

CSS3アニメーション(javascriptで制御) – jsdo.it – share JavaScript, HTML5 and CSS

var tar = document.getElementById("rect");
    tar.style.webkitAnimationName = kfname;
    tar.style.webkitAnimationDuration = "1400ms";
    tar.style.webkitAnimationIterationCount = 100;
    tar.style.webkitAnimationTimingFunction = "ease-in-out";

iPhoneのSimulatorと実機での違い

iPhoneアプリの開発をしていてハマった事がまたありましたので残しておきます。

Objective-Cで、
例えばクラスAの@interface部で@protectedとして宣言していた変数aをサブクラスで呼ぶ場合、通常であればそのまま使えるはずなのですが、実機に向けてビルドするときにはエラーになってしまいました。

これは調べてみるとどうやら、
・シミュレータではデフォルトの設定が@protected
・実機ではデフォルトが@private
と言う事に原因がある様です。(そういった差が生まれないように@で明示的に宣言したつもりだったのですが)

最善の解決策ではないですが、-(id)gethoge;といったメソッドを作成しました。
カプセル化がしっかりできていないとは思うのですが、これでひとまずはエラー出ずにビルドし、問題なく動作するようになりました。

参考URL(StackOverflow:英語):
http://stackoverflow.com/questions/5513605/inheritance-working-on-simulator-but-not-on-iphone

iPhoneの実機に転送できない

開発中のアプリをiPhoneの実機に転送できなくて、はまっていました。
根本的な解決をしたわけではないですが、あまり情報がみつからなかったので同じようにはまった人の助けになればとおもって残しておきます。

まず、僕が出会ったエラーは

The executable was signed with invalid entitlements.

The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile.

というものでした。
こちらのサイト様(iPhoneアプリ開発の備忘録)ではクリーンビルドする方法を示されていましたが、僕のサイトではそれでは解決しませんでした。

僕の場合はiOSのバージョンをあげた事が原因なのか(4.3.5にアップしました。)provisioningファイルがiPhone実機とあっていなかったみたいなので、Provisioning Portalから再度Provisioningファイルを作成し、Organizerにインストールして無事に実機へ転送する事ができました。

先日からMacをOSX 10.7 Lion にしたのですが、どうやらSnow Leopardの時に比べると画面が動かなくなる事が多くなりました。

あまりにも頻繁にこの現象が怒るからアクティビティモニタで調べてみると、helpdというプロセスがメモリを圧迫していました。(実メモリで800MB程度、仮想メモリで1GB以上)

で、helpdってなに?と思って調べてみると、どうやらLionでも同じ現象が発生しているようで、Appleのサポートコミュニティにも投稿がありました。

なにかのソフトのヘルプで使ってるらしいです。
僕の環境ではXCodeのヘルプでAPIをみる事が多いのでそれも原因だった可能性があります。
これは僕のマシンはそろそろ対象外、というか古い機種になったって事なんでしょうね。。。

Appleのサポートコミュニティ記事はこちらです。
https://discussionsjapan.apple.com/message/100606044#100606044

先日添付ファイルを扱うメールフォームの仕事があったのですが、その時に気になった事があったので残しておきます。

殆どこちらのサイトに書いている通りなんですが。。。すみません。
iPhone Safariから画像を投稿する方法 – Shin x blog

まず、PCではフォームのファイルアップロード機能

を使っていたのですが、PCではもちろんOKでも、iPhoneでは使う事はできません。じゃあどうするの?ってなったのですが、
これはまあ知っていたのですが、対策方法について、mailto: とか使えば普通に添付できるかというと、そんな事はありません。iPhoneのmail.appでは添付する事ができません。

ではどうするか?というと、sms経由で送信する方法です。
smsを起動するには、mailto:のかわりにsms:にするだけです。

以下、サンプルをおいておきますので実際に試してみて下さい。

通常のフォーム
mailto:による送信方法(宛先はダミーです)
xxxx@xxx.comへメールを送る
smsで送信する(宛先はダミーです)
xxxx@xxx.comへメールを送る

KinectをOpenNIを使えばunstable版ではありますが、Macでも使う事ができます。
で、普段のWebやPC、Mobileのアプリとは異なりハードウェア的な観点で注意しないと行けない事があり、ちょっとハマってしまった事があったので書いておきます。

今までまったくもって普通に動いていたアプリが突然すごくカクカクと動いてしまっていたのですが、ソースコード上の無駄をどれだけそぎ落としても、Kinectのデータ更新を別スレッドで行うようにしてもカクつきがまったく改善されなく、原因がわからなくて途方に暮れていたところ、試しにUSBの差し口を変更した所今までどおり高速に動作するようになりました。
どうやら状態によって通信速度が変わる事が考えられます。

MacBook ProのUSBポートは内部的には同じもののはずだからどちらに差したからと言って通信速度が変わることはないと思っていたのですが、そんな事も無かったです。

Kinect自身はUSBでPCと繋いでデータを受信します。KinectはXtion Proなどのデバイスとは違い、USBだけでは正しく動作しないのでコンセントにさす必要もあるのですが、電気の供給が不足しているときにも動きがカクカクしてしまう事がありました。

USBを差し替える前後の違いが分かるように動画をアップしましたので気になる方はご覧下さい。

はまりどころを抜けて、こんな感じのサンプルを作りました。