我正在使用FBConnect sdk爲了通過我的應用程序向用戶的個人資料發佈帖子。我遇到以下幾個問題:iOS上的Facebook FBConnect SDK問題
當相關代碼第一次在設備上運行時,用戶被重定向到Facebook應用程序/網站,並要求他授權它。如果用戶授權它,它將返回到應用程序,該應用程序彈出一個「連接到Facebook」視圖控制器,要求用戶登錄。這很奇怪,因爲用戶已經登錄,否則他怎麼可能授權應用程序?但我想這可能是好的,因爲他還沒有通過應用程序登錄。登錄後,它什麼都不做。只有第二次運行代碼後,他授權應用程序,用戶才能獲取發佈對話框。
如果用戶沒有授權該應用程序,當它在授權對話框後回到我的應用程序時,它會要求用戶登錄(就像他已經授權),並且在他登錄後不做任何事情。第二次代碼運行,授權對話框打開,optinos「授權」&「離開應用程序」,而不是「授權」&「不授權」/「允許」&「不允許」。另外,如果用戶通過他在Facebook上的帳戶設置刪除了他的授權,而不是隻是要求他重新授權,那麼會彈出一個facebook對話框(而不是發佈/授權對話框),並說:「An發生錯誤,請稍後再試。「以後嘗試不會有幫助。它會一直彈出,即使你重新啓動應用程序。讓它消失的唯一方法是重新安裝應用程序,這會導致它重新彈出授權對話框。
因此,這裏是我想達到的目標:用戶授權的應用程序
- 後,他就不必再次登錄。
- 在用戶授權應用程序後,發佈對話框將立即彈出,而不必重新運行代碼(這是通過按鈕觸發的)。
- 如果用戶未授權的應用程序,他將再次與授權對話框提示,而不是錯誤對話框
- 如果他拒絕授權,我將調用顯示錯誤/等功能。
下面是相關代碼:
MyViewController.m
- (void)shareOnFacebook
{
Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID];
[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook];
[facebook release];
facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
if (![facebook isSessionValid]) {
[facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]];
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
//Giving the dictionary some parameters for posting defaults
[facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs
}
MyAppDelegate.h
@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate>
{
Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here
}
@property (nonatomic, retain) Facebook *facebook;
@end
MyAppDelegate.m
- (void)fbDidLogin
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [self.facebook handleOpenURL:url];
}
是否有可能我在MyViewController上遺漏了一些委託函數?因爲我看到出於某種原因,我已經標記爲實現FBDialogDelegate協議,儘管他沒有從那裏實現任何功能。
如果你們能幫助我,我會很高興,因爲這對我來說是非常令人沮喪的。我在互聯網上找不到任何東西,我覺得我在這裏溺水了。
Tnx提前!
這可能不是您的問題的答案,但在我看來,您可能遇到的一個問題是每個共享上重新創建的Facebook實例。從文檔看來,Facebook實例通常添加到AppDelegate,並且在應用程序運行時從不重新分配。也許看看我爲我正在編寫的項目編寫的代碼,它可能更容易解決您的問題(它還不完美,但似乎就分享而言工作得很好):http://stackoverflow.com/questions/7085162/facebook-connect-class-with-singleton-access-token-issue/7085809#7085809 –