2012-06-26 68 views
0

我想給Facebook的iOS SDK集成在我的應用程序,在我的應用程序委託頭我做了以下內容:我的Facebook應用程序崩潰,驗證畫面駁回

#import <UIKit/UIKit.h> 
#import "Facebook.h" 
#import "FBConnect.h" 

@class ViewController; 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 
Facebook *facebook; 
} 

@property (nonatomic,strong) Facebook *facebook; 

@property (strong, nonatomic) UIWindow *window; 

@property (strong, nonatomic) ViewController *viewController; 

@end 

,並在實現文件的方法didFinishLaunchingWithOptions方法:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init]; 
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate]; 

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; 
if([userDefault objectForKey:@"FBAccessTokenKey"] && [userDefault objectForKey:@"FBExpirationDateKey"]) 
{ 
    facebook.accessToken = [userDefault objectForKey:@"FBAccessTokenKey"]; 
    facebook.expirationDate = [userDefault objectForKey:@"FBExpirationDateKey"]; 

} 

if(![facebook isSessionValid]) 
{ 
    NSArray *permision = [[NSArray alloc]initWithObjects:@"read_stream",nil] ; 
    [facebook authorize:permision]; 
} 

其中MyFacebooDelegate類是我實現Facebook的代表像FBSessionDelegate等。

我也處理的handleOpenURL和的OpenURL過,當我運行的應用程序,我得到了Facebook在Safari瀏覽器進行身份驗證屏幕,然後按「好」屏幕開除,回到我的應用程序,但有些時候的應用程序崩潰和退出而這裏是編譯器告訴我的錯誤:

- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate { 
self.accessToken = token; 
self.expirationDate = expirationDate; 
[_lastAccessTokenUpdate release]; 
_lastAccessTokenUpdate = [[NSDate date] retain]; 
[self reloadFrictionlessRecipientCache]; 
if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) { 
    [self.sessionDelegate fbDidLogin]; 
} 

具體的編譯器指示該行:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) { 

任何幫助將不勝感激

+0

sessionDelegate指的是什麼類型的值?這是一個弱或強大的財產?你會得到什麼樣的錯誤? –

+0

崩潰的具體錯誤是什麼? –

+0

你的明確錯誤是什麼? – brush51

回答

3

穆罕默德

下面一行是錯誤的:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) { 

它應該是這樣的:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin:)]) { 
2

當你實例化您的會議代表:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init]; 
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate]; 

你不保留它以任何其他方式。如果您查看Facebook SDK文件​​,您會看到sessionDelegate屬性的類型爲assign。這意味着您必須負責確保委託對象在發送消息時存在。

爲了解決這個問題,添加您AppDelegate.h文件:

@property (strong, nonatomic) MyFacebooDelegate *controllerDelegate; 

而在didFinishLaunchingWithOptions:,而不是在我的後上方的代碼,這樣做:

self.controllerDelegate = [[MyFacebooDelegate alloc] init]; 
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:self.controllerDelegate]; 

這樣,強大的引用將維護到您的委託對象,並且不會過早釋放。

希望這會有所幫助!如果您有任何問題,請告訴我。