SA_TwitterEngineでのログアウトについて

LINEで送る
Pocket

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

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 でもお気軽に突っ込んでください。

[メモ] UINavigationControllerのviewcontrollerを取得

LINEで送る
Pocket

連投すみません。

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をすることで現在の画面で変更したデータを反映させた結果を表示する事も可能です。

[メモ] カスタムUITableViewCellの選択時の文字色を変える

LINEで送る
Pocket

今日はメモです。

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と実機での違い

LINEで送る
Pocket

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

[iOS] UIViewの背景画像を設定する

LINEで送る
Pocket

iPadアプリを現在作っているのですが、背景画像の設定方法がわからなくて、Interface Builder上のいちばん下にUIImageViewを貼付けていたりしたのですが、他のパーツを動かすときにいちいち選択状態になって邪魔だったり、そもそも余分なインスタンスを持ってしまうのでバグが発生しやすくなるかも?という事でなるべく避けたかったので調べていたら、UIColorに画像を指定する方法を見つけました。
ほぼ100%こちらのブログを参考にさせていただいています。。すみません。

http://r-force.seesaa.net/article/164146136.html

使用方法はこんな感じです。background.pngってのは背景画像として使う画像ですよ。

UIImage *backgroundImage = [UIImage imageNamed:@”background.png”];
self.view.backgroundColor = [UIColor colorWithPatternImage:backgroundImage];
[backgroundImage release];

要するに、UIImageをUIColorのcolorWithPatternImage: を使う事で設定できる、という事ですね。
ActionScriptで言うところのbeginBitmapFill();みたいなものであり、
WPF/Silverlightで言う所のImageBrushって所でしょうかね。

これで簡単に背景画像を設定できるようになったので、リンク先にもあるようにどこまで応用できるかで外観のカスタマイズがどこまでできるか、というのが解りそうですね。

[iPhone]POSTでファイルアップロードもできるサンプルをアップしました。

LINEで送る
Pocket

現在作っているアプリでは、iPhoneからファイルとデータをアップロードする仕組みが必要になり調べてみたのですが、なかなか目的を達成してくれるクラスやライブラリが見つからなかったので自分で作ってみました。
ソースとテストで使ったPHPのファイルもgithubのここにおいています。
http://wiki.github.com/mmlemon/HTTPMultipartPost

ソースにはcopyrightとか書いていますが、改編などはご自由にどうぞ。ただし、こちらではいかなる責任も負いませんのでご了承下さい。

内容は、こんな感じです。

MultipartPostHelper:このクラスを使ってファイルのアップロードを行います。
実際の使い方は、HTTPPostSample2ViewController.mをご確認下さい。

使用する流れは下記の通りです:

  1. 送信先URLを設定する
  2. 文字列データ部分を作成する(Key用の配列と値用の配列が必要です。)
  3. バイナリデータ部分を作成する(このとき、data=実際のデータ:NSData、orgName:ファイル名、postName:Postで使われる名前。例:orgName=”file.txt”, postName=”postFile”の場合、PHPでは、$_FILES[“postFile”][“name”]とすると、”file.txt”が返されます。)
  4. 文字データをMultipartPostHelperに追加
  5. バイナリデータをMultipartPostHelperに追加
  6. sendで送信

以上です。