4

iOS開発初心者です。Facebook API をアプリに統合するときに fbDidLogin が呼び出されないという問題が発生しました。メイン ビュー コントローラー (つまり、アプリ デリゲートが呼び出すもの) から API を呼び出すと、すべてが完全に機能しますが、私の場合は、設定ビュー コントローラーの下にあります。私は文字通り、コードをメインビューコントローラー(機能した場所)から設定ビューコントローラーにコピーして貼り付けましたが、機能しませんでした。

私はこのメソッドをアプリデリゲートに追加しましたが、これはほとんどの人にとって問題であると理解していますが、私の場合、問題は他の場所にあると思います...どんな助けも素晴らしいでしょう.

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[settingsvc facebook] handleOpenURL:url];

}

アプリのデリゲート ヘッダーの場所:

@property (strong, nonatomic) Settings *settingsvc;
4

2 に答える 2

6

いくつかのこと。

-アプリケーション全体の 1 か所に fbDidLogin を実装するだけで済みます。facebook を使用する各ビュー コントローラーには実装しません。

- Facebook の iOS ドキュメントの入門手順に従っていると仮定すると、Facebook オブジェクトはアプリ デリゲートのプロパティとして存在します。そして、あなたの fbDidLogin メソッドはあなたのアプリデリゲートだけにあります。これは、Facebook 変数を宣言するコード内の唯一の場所でもあります。つまり、コード内の他の場所から facebook にアクセスするときはいつでも、次のようにします。

ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate.facebook someMethod];

-アプリ デリゲートの handleOpenURL メソッドと openURL メソッドは、投稿したコードとは異なり、Facebook のサンプル ドキュメントとまったく同じように見える必要があります。

-個人的には、Facebook オブジェクトをアプリ デリゲートからシングルトン ヘルパー クラスに移動することを好みますが、初心者の場合、これはおそらく必要以上に高度です。

更新された情報回答コメント:

-someMethod は、呼び出そうとしている Facebook メソッド (ウォールへの投稿、認証など) です。

- すべての FBSessionDelegate メソッドをアプリのデリゲートに配置する必要があります

- Facebook に投稿するビュー コントローラーに FBDialogDelegate を実装する必要があります。

-次に、ユーザーのウォールに投稿したい場合は、View Controller で次のようにします。

- (void)postToWall {
    ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
    if (appDelegate.facebook.isSessionValid) {
       //we're logged in so call the post dialog
       [self doPost:nil];
    } else {
        //we're not logged in so call the login and then do the post when it's done
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doPost:) name:@"FBLoginComplete" object:nil]; 
        NSArray *permissions = [[NSArray alloc] initWithObjects: 
                                 @"offline_access",
                                 @"publish_stream",
                                 nil];
        [appDelegate.facebook authorize:permissions];
        [permissions release];

    }
}

-(void)doPost:(NSNotification *) notification {
    ProjectNameAppDelegate *appDelegate = (ProjectNameAppDelegate *)[UIApplication sharedApplication].delegate;
    if (appDelegate.facebook.isSessionValid) {
        NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       something, @"app_id",
                                       something, @"link",
                                       something, @"picture",
                                       something, @"name",
                                       something, @"caption",
                                       something, @"description",
                                       nil];
        [appDelegate.facebook dialog:@"feed" andParams:params andDelegate:self];
        [params release];
    } 
    [[NSNotificationCenter defaultCenter] removeObserver:self];       
}

-上記を機能させるには、ログインが完了するたびに (成功または失敗)、NSNotificationCenter メッセージ「FBLoginComplete」を送信する必要があります。

-注: 上記のコードは、コンパイルもテストもせずに書いたので、完璧ではないかもしれません (しかし、通常は :)

-注意: ポップアップするダイアログなしで、ユーザーのウォールに直接投稿することはできません。ユーザーは、壁にぶつかる前に投稿を編集することができます。

于 2012-04-29T18:16:47.327 に答える
1

MainViewControllerではない委任FBRequestDelegateをすでに実装しましたか?yourViewController.h

FBRequestDelegateなどの多くの便利なFacebookリクエストハンドラが含まれています。

//Called just before the request is sent to the server.
- (void)requestLoading:(FBRequest *)request;

//Called when the server responds and begins to send back data
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response;

//Called when an error prevents the request from completing successfully.
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error;

/** 
  *Called when a request returns and its response has been parsed into
  *an object.
  *The resulting object may be a dictionary, an array, a string, or a number,
  *depending on thee format of the API response.
  */
- (void)request:(FBRequest *)request didLoad:(id)result;

/** 
  *Called when a request returns a response.
  *The result object is the raw response from the server of type NSData
  */
- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data;

それがあなたを助けることができることを望みます!

于 2012-04-29T16:09:27.327 に答える