2012-09-21 71 views
5

由於山獅現在已經officialy Facebook的整合,我想打一點點與Accounts.framework和OS X.在OS X山獅訪問Facebook帳戶

我建立了一個應用程序在Facebook開發應用程序和使用的Social.framework下面的代碼請求訪問登錄的用戶的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"); 
    } 
}]; 

現在我總是當我從Xcode中啓動的應用程序出現錯誤Error Domain=XPCObjectsErrorDomain Code=2 "The operation couldn’t be completed. (XPCObjectsErrorDomain error 2.)"

第2-3次,OS X顯示確認對話框「XYZ想要訪問您的Facebook帳戶」,我點擊確定,我收到一個錯誤,說「應用程序尚未安裝」。現在這個錯誤「消失了」,我得到了上面提到的錯誤。

我的問題是:我是否必須在我的Xcode Project(Info.plist)或Facebook Developer App中配置一些特殊的東西來使其與OS X一起使用?或者我在代碼中丟失了什麼?有關這方面的示例和教程似乎非常罕見: -/

我已經觀看了有關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的代表我一個警告,我點擊確定和新出現的錯誤導致無法訪問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."

我已經修改的權限是公正email或只是user_likes但是這一切都導致了同樣的錯誤。如果我只請求read_stream訪問的訪問被授權,但結果在OAuth錯誤190的消息Error validating access token: User XXXXXX has not authorized application XXXXXX.

更新2:
我現在解決了我所有的問題,見我的回答如下。

回答

11

好吧,我終於解決了這個問題:-)

當你到一個用戶的Facebook賬號第一次請求訪問,你可能只在Facebook的權限參考"User and Friend permissions"下所列的用戶請求的權限。

一旦用戶授予訪問權限並且在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"); 
    } 
}]; 

希望這會幫助別人:-)

+0

嗨,可能你可以回答我的問題嗎? http://stackoverflow.com/questions/12644229/ios-6-facebook-posting-procedure-ends-up-with-permissions-alert-view – Stas

+0

雖然我嘗試了你在這裏發佈的所有內容 - 我的意思是不同類型的權限..結果是一樣的:( – Stas

+1

尼斯好好幹得好!..它也幫了我很多 – Warewolf

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. 

未能這樣做會導致相同的錯誤。