【iPhone SDK】Facebook SDKをカスタマイズ

久々のiPhoneプログラムネタです。

Facebookと連携するアプリを開発する際、
Facebook公式のSDKを使うことで簡単に開発ができるのですが、
SDKをDLしてそのまま使用するとアプリによってはあまりよろしくない設定がされているので
ソースをカスタマイズしてみようと思いました。

幸いライブラリ化はされておらず、ヘッダとソースが存在しているので簡単にカスタマイズができます。
■Facebookログイン認証をアプリ内で実行する

アプリからSDKのログイン処理を実行すると
初期設定では、Facebook公式アプリがコールされます。
そして開発しているアプリにURLスキームを設定しておくことで
公式アプリからログイン完了後にアプリがコールされて戻ってきます。

でも、これってバックグランド対応していないといけなくてめんどくさいです。

仮にアプリがインストールされていなかったらSafariが起動して同じ事を処理されます。

まずこれをアプリ内でログインダイアログを表示して処理を行うようにしましょう。

SDKの「Facebook.m」の
278行目、324行目、331行目に明記されている

[self authorizeWithFBAppAuth:YES safariAuth:NO];
のところYESをすべてNOにしましょう

ログイン処理実行メソッドは275行目のここの処理になります。

- (void)authorize:(NSArray *)permissions {
self.permissions = permissions;

[self authorizeWithFBAppAuth:YES safariAuth:NO];
}
あまり意味はないと思いますが
298行目以降のメソッドはFacebookアプリからコールバックで返ってきたとき用の処理っぽいので
こちらは放置しててもいいかも

ちなみにログインダイアログは以下のように表示されます。
IMG_0359.PNG

■ログインダイアログで処理中なのかを表示したい
さきほどの対応で、ログイン処理をアプリ内でダイアログ表示して対応することができました。

このままログインを実行しても画面に変化がなく、サーバーからレスポンスがくると
コールバック関数の処理が実行されます。

でも、この間3秒ちょっとあり、ユーザーからみると固まっているようにみえ
ログインボタンを複数回連打される恐れがあります。
ちなみにログインボタン連打するとエラーになってログイン処理がうまく実行されなくなりました。

アクティビティインジケータでも表示されればいいのになっと思っていたのですが、
実はこのWebViewの画面にはアクティビティインジケータが登録されていました。

しかし、表示がされないのはなぜかと思い調べたところ
以下の部分を修正すれば表示されるようです。

FBDialog.mファイルの
327〜328行目にて、アクティビティインジケータの初期化がされていますが、
ここを以下のように修正します。

        _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
UIActivityIndicatorViewStyleWhiteLarge];

  ↓
        _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
UIActivityIndicatorViewStyleGray];

インジケータのスタイルを特大白からグレーに変更

これは表示されるログイン画面などの背景が白いため、
目立たないというのがひとつの理由です。

405行目の以下の処理をコメントアウトします。

    _spinner.hidden = YES;
hiddenプロパティがYESになり、非表示になってしまいますが、
そもそもアクティビティインジケータをstopAnimationメソッドを実行すると自動的に非表示になるため(初期設定で)
この処理を実行されるとどこかでhidden = NO;としないと表示がされません。

また、この処理が実行される箇所が

- (void)webViewDidFinishLoad:(UIWebView *)webView

とUIWebViewのデリゲートとなっています。
Webサイトの読み込みが完了時にコールされる箇所なのでアクティビティインジケータを非表示にする処理が実行されています。

一つ上のメソッドにてWebViewの読み込み開始時のコールバックが定義されています。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
  navigationType:(UIWebViewNavigationType)navigationType

なので369行目あたりに以下の処理を追加します。

[_spinner startAnimating];
これでログインダイアログ表示時、ログインボタン押下時の通信開始時にアクティビティインジケータが表示され、
読み込み完了時に非表示になるようになります。


IMG_0358.PNG

Facebookに投稿するにはこのSDKを使うと本当に簡単ですね。


この記事へのコメント

  • 王超

    お世話になっております。
     Digiarty Softwareの王超と申します
     先日メールを送っていただき、早春キャンペーンということ報告しました、ヒイロ様にもっと詳しい情報をお伝えるようにメール再送致します、ご迷惑をかけていたら、申し訳ありません。
     今度のキャンペーンが昔との最大の違いところといえば、すべての贈り物が最新バージョンのソフトウェアである。ブルーレイ、DVDバックアップソフトウェア、HDビデオ変換ソフトウェア、
    iphone,ipad,androidに対応ビデオストリーミング、など、様々なソフトウェアがユーザー達の最新需要を満たすようにアップグレードされています。
     ゲームを遊んで無料にソフトウェアをゲットするチャンスがあります、読者達にとってきっと役に立つ情報と思います。貴サイトで推奨いただければと存じます。
     よろしくお願い致します。
     連絡メールarision@winxdvd.com
    王超より

    2012年02月28日 11:13

この記事へのトラックバック