2014-04-24 23 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方法。 –