27

簡単な投稿手順を実行しようとしています。

- (IBAction)directPostClick:(id)sender {
    self.statusLabel.text = @"Waiting for authorization...";
    if (self.accountStore == nil) {
        self.accountStore = [[ACAccountStore alloc] init];
    }   
    ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray * permissions = @[@"publish_stream", @"user_checkins", @"publish_checkins", @"user_likes", @"user_videos"];
    NSDictionary * dict = @{ACFacebookAppIdKey : @"My app id here", ACFacebookPermissionsKey : permissions, ACFacebookAudienceKey : ACFacebookAudienceOnlyMe};
    [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
        __block NSString * statusText = nil;
        if (granted) {
            statusText = @"Logged in";
            NSArray * accounts = [self.accountStore accountsWithAccountType:facebookAccountType];
            self.facebookAccount = [accounts lastObject];
            NSLog(@"account is: %@", self.facebookAccount);
            self.statusLabel.text = statusText;
            [self postToFeed];
        }
        else {
            self.statusLabel.text = @"Login failed";
            NSLog(@"error is: %@", error);
        }
    }];
} 

編集済み: 問題は、alertViewの[OK]ボタンをクリックしても(許可しないことも機能しません)、何も起こらないことです。-このiOS6で変更されたこの動作 Facebookの投稿手順は「remote_app_idが保存されたIDと一致しません」になるため、「何も起こらない」ではなく、「Facebookサーバーはこのアクセス要求を実行できませんでした:remote_app_idは保存されたIDと一致しません」

ここに画像の説明を入力してください

したがって、アラートビューのクリックハンドラーは何も実行していないようです。私のcompletionHandlerが呼び出されることはありません。私はすでに同様の問題を抱えています:iOS 6ソーシャル統合-設定の問題に移動します そして、それはここでも同じ問題だと思います。あなたたちはそれについてどう思いますか?PS私は最新のxcode4.5(4G182)を搭載したMAC mini、OS X 10.8.1で実行しており、iPhone6.0シミュレーターを使用しています。

追加:Bjornの要求により、postToFeedメソッドが呼び出されることはありませんが、メソッドを追加します。

- (void)postToFeed {
    NSDictionary * parameters = @{@"message" : @"Hello world!"};
    NSURL * feedUrl = [NSURL URLWithString:@"https://graph.facebook.com/me/feed"];
    SLRequest * request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodPOST URL:feedUrl parameters:parameters];
    request.account = self.facebookAccount;
    [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.statusLabel.text = @"Posted!";
        });
    }];
}
4

2 に答える 2

97

また、Accounts Framework と Facebook の統合を使用する際にも、いくつかの問題が発生しました。これが私が学んだことと、それをどのように機能させたかです。

1. Facebook でアプリを正しくセットアップしたことを確認してください アプリが Facebook
と統合する方法をネイティブ iOS アプリに設定し、指定されたフィールドにアプリのバンドル ID を入力する必要があります。(編集: バンドル ID は大文字と小文字が区別されることに注意してください) 今のところ、iTunes ID を 0 に設定できます。Facebook ログインを有効にし、詳細設定タブでアプリの種類をNative/Desktopに設定します。
また、クライアントのアプリ シークレットNoに設定します。

これらのオプションの 1 つ以上が正しく設定されていない場合、エラーが発生する可能性が非常に高くなりますThe Facebook server could not fulfill this access request: remote_app_id does not match stored id

(編集: サンドボックスが無効になっていることも確認する必要があります。)

2. Facebook アプリを
初めてインストールする iOS (および Mac OS X も) にネイティブの Facebook 統合を介してアプリを初めてインストールするときは、基本的な読み取り許可のみを要求する必要があります。ここではemail,以外は許可されていません。Facebook のドキュメントによると、基本的な読み取り権限でもあるを使用しても機能しません。以前に Facebook JavaScript SDK または Facebook PHP SDK を使用したことがある場合、これはかなり混乱します。これは、何もしなくてもデフォルトで基本的なアクセス許可を要求するためです。Facebook はまた、iOS 6 で新しい Facebook SDK を使用する方法に関する簡単なステップバイステップ ガイドでドキュメントを更新しました。user_birthdayuser_locationuser_about_me

3. 追加のパーミッションを要求
する 読み取りと書き込みのパーミッションを同時に要求することはできないことを知っておくことが重要です。これは、経験豊富な Facebook SDK 開発者が混乱する可能性があることでもあります。read_streamパーミッションと共にパーミッションをリクエストpublish_streamすると、リクエストが失敗し、エラーAn app may not aks for read and write permissions at the same time が発生します。

Facebook はPermission Referenceで読み取り/書き込み権限を実際には区別していないため、書き込み権限を自分で識別する必要があります。通常は、接頭辞、manage_*または接尾辞が付いています。publish_*create_**_management

Facebook は、基本的な権限を取得した直後に追加の権限を要求することも推奨していません。ドキュメントには、「現在、読み取りと公開のアクセス許可を個別に (そしてその順序で) 要求する必要があります。ほとんどの場合、アプリの起動時とユーザーの最初のログイン時に、パーソナライゼーションのために読み取りアクセス許可を要求します。後で、必要に応じて、あなたのアプリは Facebook にデータを投稿するときに公開許可を要求できます [...] 2 つのタイプを別々に要求すると、ユーザーが公開許可を付与する可能性が大幅に向上します。最も可能性が高いのは、ユーザーがより強い意図を持っている場合です。」

4. サンプル コード
次のサンプル コードは、iOS および Mac OS X で動作するはずです。

ACAccountType * facebookAccountType = [self.accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

// At first, we only ask for the basic read permission
NSArray * permissions = @[@"email"];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"My app id here", ACFacebookAppIdKey, permissions, ACFacebookPermissionsKey, ACFacebookAudienceOnlyMe, ACFacebookAudienceKey, nil];

[self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
    if (granted && error == nil) {
        /** 
        * The user granted us the basic read permission.
        * Now we can ask for more permissions
        **/
        NSArray *readPermissions = @[@"read_stream", @"read_friendlists"];
        [dict setObject:readPermissions forKey: ACFacebookPermissionsKey];

        [self.accountStore requestAccessToAccountsWithType:facebookAccountType options:dict completion:^(BOOL granted, NSError *error) {
            if(granted && error == nil) {
                /**
                * We now should have some read permission
                * Now we may ask for write permissions or
                    * do something else.
                **/
            } else {
                NSLog(@"error is: %@",[error description]);
            }
        }];
    } else {
        NSLog(@"error is: %@",[error description]);
    }
}];
于 2012-10-02T08:58:38.500 に答える