2014-04-24 25 views
0

爲了某種目的,我創建了一個單獨的組件,通過這個新對象組織所有使用dropbox的作品。iOS dropbox api oauth_token錯誤

所以我旁邊單用如下初始化代碼:

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.cloudName = @"Dropbox"; 

     DBSession* dbSession = [[DBSession alloc] initWithAppKey:DP_App_KEY 
                 appSecret:DP_App_SECRET 
                  root:ROOT]; 

     [DBSession setSharedSession:dbSession]; 

     self.restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]]; 
     self.restClient.delegate = self; 
    } 
    return self; 
} 

如果你能看到我在單身init方法直接初始化DBSession。該應用程序調用init方法,似乎一切都應該很好。

所以,當我在應用程序登錄打開網址方法調用此:

if ([[DBSession sharedSession] isLinked]) 

,在這裏應用程序輸出Dropbox的鏈接,但是當我試圖獲得元數據根@「/」文件夾中(文件列表),並調用這個方法:

[self.restClient loadMetadata:folder]; 

APP輸出這個錯誤:

[WARNING] DropboxSDK: error making request to /1/metadata/dropbox - (403) Parameter not found: oauth_token 
2014-04-25 00:30:15.652 PDF-Notes[75257:70b] Error loading metadata: Error Domain=dropbox.com Code=403 "The operation couldn’t be completed. (dropbox.com error 403.)" UserInfo=0xb666600 {path=/, error=Parameter not found: oauth_token} 

但是,當我RER一次通過Xcode的應用程序一切正常。另外,如果我在應用程序委託中設置DBSession,它也可以工作。我真的不明白爲什麼它在單例中不起作用,因爲調用方法的工作方式是相同的,但只有當我們在應用程序中初始化DBSession時,它才能正常工作。

回答

2

首先 - 您必須在會話成爲鏈接後創建REST客戶端 - 這將確保您將DBRestClient連接到實際會話。

其次 - 如果您的應用程序在設備上安裝了Dropbox應用程序,則可能出現問題。在這種情況下,您的應用程序會將身份驗證推送到數據庫應用程序。

第三 - 你的類的實現 - (id)init不是一個單例。單身是一種模式,當你的對象只住在一個共同的對象中,並且不能完成任何娛樂。我Objective C中,我們還必須考慮保留計數(在no-Arc代碼中,被重寫的內存管理方法)。但無論如何你init方法(通常稱爲共享實例)應該看起來像:

static Singleton * sharedInstance= nil; 
+(Singleton *) sharedInstance 
{ 

    static dispatch_once_t once_token = 0; 
    dispatch_once(&once_token,^
        { 
         sharedInstance = [Singleton new]; 
        }); 
    return sharedInstance ; 
} 

希望這將幫助你整合DB

+0

是的,謝謝。我還通過另外一種方式修復了它。起初,我得到了會話,然後初始化休息客戶端,因爲在我的問題中,其餘客戶端使用與有效或授權的會話不相對應的會話初始化。似乎按行來說沒問題,但通過調用類型它是錯誤的。我已經跳過了單例初始化和演示問題的init方法。 –