Facebook SDKの統合 - アプリケーションデリゲートの代わりにビューコントローラを使用する

タイトルが示唆するように、私は今、新しいFacebook SDKを利用しています - ここ - - iOSアプリケーション内。

私はFacebook開発者サイトで紹介されたこのの紹介をたどりました。すべて動作します少なくともその実装に応じて、そうするべきです。

物事を行う彼らのやり方は、アプリケーションデリゲート内の一連のメソッドと呼び出しを介して、ユーザーにapplicationDidFinishLaunchingが呼び出された後に自分のアカウントをアプリに接続する選択肢が提示されることを意味します。

私は代わりに、アプリケーションの他の場所に埋め込まれたビューコントローラ内のボタンの選択時にのみこれを強制するのが好きです。つまり、私はapplicationDidFinishLaunchingが呼び出されたときに承認に対処したくありません - 私はそれを強制するビューコントローラで私自身のメソッドをしたいです。また、私はFacebookのクラスをいくつかの独自のView Controllerから参照することになります。

私は遠くに徹底的に調査し、これに対処するために完全に説明された解決策(または全く、まったく何か)を考え出すことはまだありません。誰かがこれについてどうやって行くかについてのアイデアがあるなら、私に知らせてください。 StackOverflowはほとんどの時間の最後の手段です:)

編集:ベリリウムが下に上がったので、私は単に、アプリケーションデリゲートにあるすべてのものを取り、それを個々のビューコントローラに取り込むことができます。それは機能しますが、これはこのユニークな状況を処理する最善の方法ですか、それともより良い実装があるのでしょうか?

ありがとうございました、

以下の関連コード:

sampleAppDelegate.h

@interface sampleAppDelegate : NSObject  {

Facebook *facebook;
}

@property (nonatomic, retain) Facebook *facebook;

@end

sampleAppDelegate.m

  @synthesize facebook;

      facebook = [[Facebook alloc] initWithAppId:@"102698856525645" andDelegate:self];

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:@"FBAccessTokenKey"] 
            && [defaults objectForKey:@"FBExpirationDateKey"]) {
            facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
            facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
        }

        if (![facebook isSessionValid]) {
            NSArray *permissions = [[NSArray alloc] initWithObjects:
                                    @"offline_access", 
                                    @"publish_stream",
                                    nil];
            [facebook authorize:permissions];
            [permissions release];   
        } 
    }
   //For 4.2+ support
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [facebook handleOpenURL:url]; 
    }

    - (void)fbDidLogin {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
        [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
        [defaults synchronize];

    } 
/*methods required by Facebook SDK to handle issues with connectivity--all currently empty*/

viewController.h

#import "FBConnect.h"
#import "sampleAppDelegate.h"

@class sampleAppDelegate;


@interface viewController : UIViewController  {
    Facebook *facebook;
        UnitedUpdatesAppDelegate *facebookSampleAppDelegate;


}
@property (nonatomic, retain) sampleAppDelegate *appDelegate;
@property (nonatomic, retain) Facebook *facebook;

viewController.m

-(void) facebookPost {
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:

                                   @"http://stackoverflow.com", @"link",
                                   @"Message name", @"name",
                                   @"Caption", @"caption",
                                   @"Description", @"description",
                                   @"Message",  @"message",
                                   nil];

    [sampleAppDelegate dialog:@"feed" andParams:params andDelegate: sampleAppDelegate];
}
2
appDelegateのコードをカットしてVCに挿入するには、Cmd + XとCmd + Vを試しましたか?
追加された 著者 beryllium,
ある場所で作業するコードは、別の場所でも正常に動作すると思います。だから、間違いなくコードを転送して何かを逃さないなら、すべてうまくいくでしょう。
追加された 著者 beryllium,
ベリリウム、それは最善の方法でしょうか?それは確かに機能する - 私は、元のポストのそれで私の以前の試みに言及することを怠ったが、どのようにそのような実装を処理する必要がありますか?これはFacebook APIの私の最初の使い方です、明らかに、彼らのシステムに関する私の知識はおそらく私が好きかもしれないほど大きくはありません。プロンプトをありがとう!
追加された 著者 Marc Matthews,

2 答え

私は、このFacebookのコードはView Controllerの一部ではないと考えています。私は、Facebookとのコミュニケーションを処理するためにSingletonクラスを作成することを好みます。このシングルトンは特定のインターフェイスに準拠しており、Twitterなどの他のサービスをアプリケーションに追加すると便利です(各サービスは共有インターフェイスに準拠した別個のシングルトンで処理できます)。

インターフェースは、 -login: -logout: -postMessage:のようなメソッドを定義することができます。

シングルトンは、デリゲートやブロックを使用して同様の方法でWebサービスの応答を処理することができます。デリゲート実装の場合、 -service:didSucceedWithStatus:または -service:didFailWithError:サービス委任メッセージを送信するサービスのタイプまたはシングルトンインスタンス)。

私は実際に上記の記述に従っていくつかのコードを書いていましたし、あなたが興味があればここに投稿することができました。

2
追加された
シングルトンコードを投稿することはできますか?私は今、この非常事に立ち往生しています。ありがとうございました
追加された 著者 hanumanDev,
コードはちょっと古いかもしれませんが、少しバグかもしれませんが、そのようなことを実装する方法に関する一般的なアイデアを与えるべきです: dl.dropbox.com/u/6487838/Facebook-Singleton.zip - 将来的に改善されたバージョンを作成できることを願っています(リンクされたコードは1 、5年前)。
追加された 著者 Wolfgang Schreurs,
こんにちはヴォルフガング、あなたが提供することができるすべてのすべての助けは、特にFacebook SDKが提示するトラブルに対処しているので、素晴らしいでしょう。私は確かに1つのクラスのすべてのFacebookを維持するあなたの考えが好きで、あなたがそれをどのように管理しているのか興味があります。私はあなたの援助に非常に感謝しています!
追加された 著者 Marc Matthews,

代理メソッドをAppDelegate以外の場所で使用することが可能かどうかを尋ねる場合は、答えはYESです。

私の考えは、FB用のすべてのものを含むクラスを準備し、ログインや認証をトリガーできるボタンを用意することです。

通常は、FBクラスが必要とするプロトコルをコントローラに適用させ、コールバックに応答するために委譲します。

私は同様のアプローチを試み、それは正常に動作します。

0
追加された
Ingconti、正しい方向に私をさらに導くかもしれない?これが説明されているところで私が逃したブログ記事はありますか?私は、すべてのアプリケーションデリゲートメソッドをそれ自身のクラスに変換する方法につまづいています。私はちょうどアプリのデリゲートにあることを意味するすべてのものをコピーしますか?それは本当に簡単ですか? :)
追加された 著者 Marc Matthews,