5

Mountain Lion が正式に Facebook と統合されたので、OS X で少し遊んでみたいと思いましたAccounts.frameworkSocial.framework

Facebook 開発者アプリでアプリをセットアップし、次のコードを使用して、ログインしているユーザーの Facebook アカウントへのアクセスを要求しました。

ACAccountStore *acStore = [[ACAccountStore alloc] init];
ACAccountType *accType = [acStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:FB_APP_ID, ACFacebookAppIdKey, @"read_stream, publish_stream", ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];


[acStore requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
    if (granted) {
        NSLog(@"Accounts: %@", acStore.accounts);
        NSLog(@"Access granted");
    } else {
        NSLog(@"Access denied");
    }
}];

今、私は常にエラーが発生しますError Domain=XPCObjectsErrorDomain Code=2 "The operation couldn’t be completed. (XPCObjectsErrorDomain error 2.)"

最初の 2 ~ 3 回、Xcode からアプリを起動すると、OS X に「XYZ が Facebook アカウントへのアクセスを要求しています」という確認ダイアログが表示され、[OK] をクリックすると、「アプリケーションがまだインストールされていません」などのエラーが表示されました。このエラーは「消え」、上記のエラーが発生しています。

私の質問は、OS X で動作させるために、Xcode プロジェクト (Info.plist) または Facebook 開発者アプリで特別なものを構成する必要がありますか? または、コードに何か不足していますか? これに関するサンプルとチュートリアルは非常にまれなようです :-/

Twitter/Facebook の統合に関する WWDC 2012 のビデオは既に見ましたが、使用したコードはほぼそのまま使用されています。

どんな助けでも大歓迎です:-)

乾杯、ビョルン

更新
問題を解決しました。ドキュメントを十分に注意深く読んでいませんでした;-)パーミッションを文字列ではなくNSArrayとして渡す必要があります。オプション ディクショナリを次のように変更しました。

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: FB_APP_ID, ACFacebookAppIdKey, [NSArray arrayWithObjects:@"read_stream", @"publish_stream", @"email", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];

OS X に、自分に代わってアプリが Facebook に投稿することを許可するかどうかを尋ねるアラートが表示されます。[OK] をクリックすると、Facebook アカウントにアクセスできないという新しいエラーが表示されます。

Error Domain=com.apple.accounts Code=7 "The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time."

パーミッションを justemailまたは justに変更しuser_likesましたが、すべて同じエラーが発生しました。アクセスへのアクセスのみをリクエストするとread_stream、アクセスは許可されますが、OAuth エラー 190 とメッセージが表示されますError validating access token: User XXXXXX has not authorized application XXXXXX.

更新 2:
すべての問題を解決しました。以下の回答を参照してください。

4

2 に答える 2

11

わかりました、私はついにそれを解決しました:-)

ユーザーの Facebook アカウントへのアクセスを最初にリクエストするときは、Facebook のアクセス許可リファレンスの「ユーザーと友達のアクセス許可」に記載されているユーザーにのみアクセス許可をリクエストできます。

ユーザーがアクセスを許可し、Facebook にアプリケーションをインストールしたら、アプリに必要な追加のアクセス許可を要求できます。読み取り権限書き込み権限を同時に要求しないことが重要です。そのため、同じリクエストで許可をリクエストしても機能しません。read_streampublish_stream

これは基本的に私が使用したコードです:

self.store = [[ACAccountStore alloc] init];

ACAccountType *accType = [self.store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];

NSMutableDictionary *options = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                    FB_APP_ID, ACFacebookAppIdKey,
                                    [NSArray arrayWithObjects:@"email", @"user_about_me", @"user_likes", nil], ACFacebookPermissionsKey, ACFacebookAudienceFriends, ACFacebookAudienceKey, nil];    

[self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
    if (granted && error == nil) {
        self.accounts = self.store.accounts;    
        [options setObject:[NSArray arrayWithObjects:@"read_stream, read_mailbox, read_requests", nil] forKey:ACFacebookPermissionsKey];
        [self.store requestAccessToAccountsWithType:accType options:options completion:^(BOOL granted, NSError *error) {
            if (granted && error == nil) {
                completionHandler(granted, error);
            } else {
                NSLog(@"Access denied 2");
                NSLog(@"%@", [error description]);
            }
        }];
    } else {
        NSLog(@"Error: %@", [error description]);
        NSLog(@"Access denied");
    }
}];

これが誰かを助けることを願っています:-)

于 2012-09-25T16:00:10.107 に答える
2

Facebookのドキュメントに追加の警告があることを付け加えたいと思います。

// if a user has *never* logged into your app, you MUST include one of
// "email", "user_location", or "user_birthday".  Other read 
// permissions can also be included here.

これを行わないと、同じエラーが発生します。

于 2012-12-11T23:22:24.590 に答える