我正在更新應用程序以使用最新的Facebook SDK以訪問iOS6原生Facebook支持。它目前使用Facebook SDK的一個漂亮的舊版本。使用[FBSession openActiveSessionWithPublishPermissions:..]時發生錯誤
該應用程序需要Facebook的「publish_actions」權限才能使用Facebook的唯一功能。
我最初認爲我可以使用[FBSession openActiveSessionWithPublishPermissions: ...]
,但是當用戶在iOS6設置中配置了Facebook時,iOS6會失敗。它失敗的,因爲這個要求,from the Facebook docs:
注意,使用iOS 6的本地身份驗證,應用程序需要改變他們的請求用戶 權限的方式 - 爲讀 和寫入權限的應用程序必須分開他們的請求。面向iOS的Facebook SDK支持這些 功能,並幫助開發人員使用它們構建適用於多個iOS版本和設備配置的應用程序,這些應用程序適用於 。
這是一個很大的PITA,IMO。我們希望提醒用戶一次獲得許可並完成它,但是每個Apple/Facebook的「新」理想是在需要但尚未授予的情況下提示特定權限。
目前的計劃是爲iOS5用戶和iOS6用戶保留我們以前的行爲,這些用戶沒有在設置中配置Facebook。並符合使用本地訪問的iOS6用戶的新雙提示。
問題是,要做到這一點的最佳方法是什麼?我該如何去檢測Facebook SDK是否會選擇iOS6原生登錄與後備機制?我忽略了一些明顯的東西?
編輯:
gerraldWilliam把我拉到正確的軌道。他的解決方案几乎可以工作,但ACAccountTypeIdentifierFacebook在iOS5中不可用。此外,如果用戶在應用程序中阻止FB訪問,則accountsWithAccountType調用將返回一個空數組。
通過詢問賬戶類型匹配標識符「com.apple.facebook」可以解決第一個問題 - 這將在iOS5上返回nil,在iOS6上返回一個真實賬戶類型對象。
但第二個問題是無法解決的。我的新計劃是始終在iOS6上打開具有隻讀權限的初始會話,並在稍後的上下文中根據需要提示發佈權限。在iOS5上,我仍會打開指定所需publish_actions權限的初始會話。下面的代碼:如果
ACAccountStore* as = [[ACAccountStore new] autorelease];
ACAccountType* at = [as accountTypeWithAccountTypeIdentifier: @"com.apple.facebook"];
if (at != nil) {
// iOS6+, call [FBSession openActiveSessionWithReadPermissions: ...]
} else {
// iOS5, call [FBSession openActiveSessionWithPublishPermissions: ...]
}
這幾乎工程。兩個問題是1)ACAccountTypeIdentifierFacebook在iOS5和2上不可用)如果用戶在設置中配置了FB但阻止了對調用應用程序的訪問,accountsWithAccountType將返回一個空數組。標記爲正確的答案,因爲它使我走上了最終解決方案的道路,我將在這個問題中提出。 – TomSwift
'accountsWithAccountType'爲我返回一個空數組,即使我在iOS 6中,Facebook集成已配置並且可以發佈。 – jowie
也是空的我,並得到這個惱人的錯誤com.facebook.sdk錯誤2 ...任何意見? – D33pN16h7