2011-07-22 64 views
3

我在我的應用程序中使用最新的facebook ios sdk。爲了實現單點登錄,Facebook表示:如何實現使用facebook的單點登錄(SSO)ios sdk for iphone

修改您的應用程序的主AppDelegate類如下:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 

在這種方法中,調用應用程序的Facebook對象的handleOpenURL方法,確保在URL參數來傳遞。

我的查詢是:

  1. 什麼用上面的方法嗎?爲什麼打電話給它? 如果我將這個方法隱藏在Facebook演示應用中,只要它總是將我重複導向登錄頁面。如果我取消隱藏此方法,它將重定向到使用其他按鈕註銷選項(這是正確的)

  2. 現在,由於此方法在ApplicationDelegate.m文件中定義,因此我們必須調用其中的facebook對象。如何在此方法中引用facebook對象,因爲我的facebook對象是在視圖控制器類中定義的,該類是層次結構的4倍。

注:我已經嘗試中的demoApp。我不明白他們是如何引用AppDelegate.m文件中的facebook對象的,儘管在ViewController文件中聲明瞭facebook對象。

回答

6

該方法用於確定您的應用程序是否會「處理」傳遞給它的url。例如,您的應用程序可以處理特定的URL「方案」,然後在運行時選擇是否處理特定的URL。如果您返回NO,它將轉到其他也可能處理相同URL方案的應用程序。儘管在Facebook iOS SDK的情況下,您的應用程序將是處理URL方案的唯一應用程序。

當您嘗試登錄到Facebook時,SDK將值傳遞給Facebook應用程序或Facebook網站,並且它包含一個回調URL,以便授權過程可以完成。如果在應用程序委託中沒有此方法,則該回調將無法正常工作。

有關OAuth的更多信息,請參見:

http://developers.facebook.com/docs/authentication/

其次,這不僅僅是Facebook的SDK一個更大的問題。這與核心架構問題有關。您可以將Facebook對象包含在您的應用程序委託中,然後在視圖控制器中引用它。這是最簡單的方法。在視圖控制器,你可以只做到以下幾點:

Facebook *facebook = [(YourAppDelegate *)[UIApplication sharedApplication] delegate] facebook]; 

此選項始終不理想,因爲它使應用程序委託的傾銷地進行了大量的共享實例。

另一種選擇是讓應用程序委託在創建它時將Facebook對象傳遞給視圖控制器(視圖控制器將擁有Facebook對象的屬性 - 然後應用程序委託會在將它傳遞給視圖控制器之後在裏面)。

MyViewController *vc = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
vc.facebook = self.facebook; 

還有其他共享類的實例的選項,如Objection iOS框架,但這些更高級一些。