Hi-farm blog

ActionScript 3.0 , AIR , FLEXからCocoa, OpenGL

Archive for the ‘iPhone’ Category

試行錯誤した後のコードをもとに書いているので無駄なコードがあるかもしれません。ご了承ください。。。

iOS5からはOSベースでのTwitter連携のサポートがありますが、2012年1月現在だとまだiOS4にも対応させたいですよね。

そんな時の便利なライブラリとしてこちらがあります。
https://github.com/bengottlieb/Twitter-OAuth-iPhone

サンプルコードもついていて、サンプルをビルドするとすぐに挙動が確認できて、テスト投稿なんかも簡単にできてしまいます。
この取っ付きやすさはライブラリを使う際に「簡単なんだ」と思う事ができてやる気をあげてくれます。

ただ、このライブラリはログアウトの事はあまり考えていないようで、ログアウトしてアカウントを切り替えるなどしたい場合は結構大変です。

僕は下記の方法をとりました。あくまで一例ですのでご容赦ください。


SA_OAuthTwitterEngine.m

- (BOOL) logout
{
	BOOL res = NO;

	NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
	[defaults removeObjectForKey:@"authData"];
	res = [defaults synchronize];
	[self clearAccessToken];
	[_accessToken release];
	_accessToken = [[OAToken alloc] initWithKey: nil secret: nil];

	return res;
}

アクセストークンもクリアしてるしこれで問題ないはずなのですが、これだけだとキャッシュデータが残ってしまっているようで、ログアウトして再度認証画面を呼んでもテキストの入力ができません。

なのでSA_OAuthTwitterEngineを保持しているクラスで認証画面を呼ぶ処理でこの用に書きました。

if (_engine){	return;}
_engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
_engine.consumerKey = kOAuthConsumerKey;
_engine.consumerSecret = kOAuthConsumerSecret;

[_engine setClearsCookies:YES];

_authorizeViewController = [[SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self] retain];

[_engine setClearsCookies:NO];

_authorizeViewControllerを初期化する前に

[_engine setClearsCookies:YES];

を呼んでキャッシュをクリアできるようにしておき、初期化後に

[_engine setClearsCookies:NO];

としてデフォルトのNOに値を戻します。
これでログアウト後に再度ログイン用の認証ダイアログを呼んでも新たにアカウントを入力する画面が表示されたはずです。

ちなみに、iOS5以降は送信先URLがhttpではなく、httpsでないとうまく認証できないのでご注意を。ちなみにhttpsにするとiOS4でも問題ないので修正しておくと良いと思います。

ちなみに「強火で進め」様のサイトが詳しいです。
http://d.hatena.ne.jp/nakamura001/20100519/1274287901

ちゃんと精査して書ききれていない記事ですみませんが、同じようにはまる方の助けになればと思います。

何かありましたらコメント欄でも twitterの @mmlemon でもお気軽に突っ込んでください。

iOSアプリの開発で、adlantisの広告を入れて試すにはlibz.dylibが必要なのですが、プロジェクトにファイルを追加するのを横着して、間違ってsdk4.3のものを追加してしまった後、ビルドするとわけのわからないエラーが出て、どれだけ戻してもエラーが解消されなかったのですが、下記の画像のように Library Search Pathsに赤枠の”DeviceSupport/4.3.5″が追加されていることが原因でした。

これが現行のsdkと衝突して問題を起こしていたのかな?

library_searchpath

この赤枠の参照を外すと無事動作するようになりました。

最近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/

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

連投すみません。

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は文字色を変更するための独自メソッドです。

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にインストールして無事に実機へ転送する事ができました。

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

    殆どこちらのサイトに書いている通りなんですが。。。すみません。
    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へメールを送る
  • 0 Comments
  • Filed under: PHP, iPhone
  • iPhone 3GにAndroidを入れました。

    最近はiOS4.3に関する噂が聞こえてきて、どうやらiPhone3Gのサポートが終了するという事を聞いて、iPhone3Gがそろそろ用済みになるかも、ってことで早速Androidを突っ込んでみました。

    手順を簡単に書いておくと、こんな事をしました。

    1. iPhone 3GをPwnageTool_4.1.2を使ってJailbreakしました。
    2. CydiaからBootlaceをインストール
    3. BootlaceでOpeniBootをインストール
    4. BootlaceでiDroidをインストール

    まずはJailbreakをするわけですが、なにでJailbreakするかによってAndroidを入れられるか入れられないかなどの違いがあるみたいなので、PwnageToolを使いました。iPhoneの.ispwファイルを手に入れるのに少し苦労しましたが、その後の流れ自体はすごく簡単にできました。やりかたは丁寧に説明して下さっているサイトが沢山ありますので僕も参考にさせていただきました。
    (http://ameblo.jp/bigsun927/theme-10012868554.html)
    Bootlaceから”Extract Multitouch Firmware”, “Download WiFi Firmware”を入れておくとマルチタッチやWifiに対応できる様です。

    取りあえずWifi経由でインターネットしている所をYoutubeにアップしました。

    雑感:

    動画まで撮ってみたものの、iPhone3Gだからか解らないですが、やっぱり動作がもっさりしています。また、Wifiが使えるようになるまでのハードルや、Android2.2でありながらもAndroid Marketが入っていないためFlashを入れるのが難しかったりと、障壁が高いので、費やした時間のわりにはメリットが少ないな、なんて思ってます。
    Android MarketなどのGoogleのアプリが入っていないのは、それらがGoogle固有のアプリだから、だそうです。
    Wifiに関しては、なかなかうまく行かなかったですが、Firmwareを数回インストールしていると無事動作するようになりました。
    余ったiPhoneをもてあましていれば試してみるのもよいでしょうね。

    ただし、自己責任で!!

    利用ツール:

    ・PwnageTool (http://blog.iphone-dev.org/)
    ・Bootlace (http://www.idroidproject.org/wiki/Bootlace)

  • 0 Comments
  • Filed under: Android, iPhone
  • [iOS] OSStatusの結果について

    オーディオとかMIDIとかの場合は良くOSStatus err
    とかして処理が成功しているかを確認すると思うのですが、エラーを出したときにいつも検索して調べてたので自分のために残しておきます。
    せっかくなので、日本語にしておきました。ちょっと翻訳が怪しいところもあるので突っ込みがあれば頂けると助かります。

    errSecSuccess = 0
    成功(エラーなし)
    errSecUnimplemented = -4
    関数か操作が実装されていない
    errSecParam = -50
    関数に送っている一つ以上のパラメーターが不正。
    errSecAllocate = -108
    メモリの確保に失敗
    errSecNotAvailable = -25291
    利用可能なキーチェーンが存在しない。コンピューターの再起動をすすめます。(翻訳が怪しいかも?)
    errSecDuplicateItem = -25299
    特定のアイテムが既にキーチェーンに存在する
    errSecItemNotFound = -25300
    特定のアイテムがキーチェーンの中に見つけられなかった
    errSecInteractionNotAllowed = -25308
    ユーザーインタラクションが許されていない
    errSecDecode = -26275
    与えられたデータをデコードできない

    完全にこちらのサイトを見させていただいて書きました。ありがとうございます。
    http://d.hatena.ne.jp/feb-hare/20100729/1280359887