1

我已经在我的应用程序中成功实现了 Dropbox 的核心 api,但是我需要数据存储 api 的功能,这就是问题所在。我已经为数据存储 api 添加了 Dropbox 框架,但是当我使用 dbaccountmanager 和 dbaccount 时,我收到了链接器命令错误。它说有重复的符号_kdbdropboxapihost,_kdbdropboxapiversion等。问题是我只有在添加数据存储api和dbaccount等方法时才会出现这个错误。有人可以帮我摆脱这个错误吗?

错误:

duplicate symbol _kDBDropboxAPIVersion in:
/Users/.../Desktop/.../DropboxSDK.framework/DropboxSDK
/Users/.../Desktop/.../Dropbox.framework/Dropbox(DBConstants.o)
duplicate symbol _kDBDropboxAPIHost in:
/Users/.../Desktop/.../DropboxSDK.framework/DropboxSDK
/Users/.../Desktop/.../Dropbox.framework/Dropbox(DBConstants.o)
duplicate symbol _kDBDropboxAPIContentHost in:
/Users/.../Desktop.../DropboxSDK.framework/DropboxSDK
/Users/.../Desktop/.../Dropbox.framework/Dropbox(DBConstants.o)
duplicate symbol _kDBDropboxWebHost in:
/Users/.../Desktop/.../DropboxSDK.framework/DropboxSDK
/Users/.../Desktop/.../Dropbox.framework/Dropbox(DBConstants.o)
duplicate symbol _kDBSDKVersion in:
/Users/.../Desktop/.../DropboxSDK.framework/DropboxSDK
/Users/.../Desktop/.../Dropbox(DBConstants.o)
ld: 5 duplicate symbols for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation)
4

1 回答 1

3

最近我需要集成 Core 和 Datastore API。通过在 Dropbox 论坛中提问以及检查已经给出的一些答案,我成功地在同一个项目中使用了两个 SDK。

以下步骤是我为了取得成功而执行的步骤。我希望它能解决你的问题。

这些步骤适用于以下版本:

  • Dropbox Core iOS SDK v.1.3.11(2014 年 3 月 31 日)
  • Dropbox 数据存储/同步 v.2.1.2(2014 年 4 月 16 日)

一旦您获得源代码,所有修改都在 Dropbox Core SDK 中完成。

脚步

1) 删除所有特定于 OSX 的文件

DBAuthHelperOSX.m
DBKeychain-OSX.m
DBRestClient+OSX.m
DBAuthHelperOSX.h
DBRestClient+OSX.h
DropboxOSX.h
DropboxOSX-Info.plist
DropboxOSX-Prefix.pch
MPOAuthCredentiaIConcreteStore+KeychainAdditionsMac.m

2) 将文件 DBAccountInfo(.m 和 .h)重命名为 DBAccountInfoOld。在 SDK 的类中查找所有出现的 DBAccountInfo 并替换为新名称。

3) 在 DBError.h 中,将 DBErrorCode 替换为 DBErrorCodeOld

4) 将文件 DBConnectController(.m 和 .h)重命名为 DBConnectControllerOld。在 SDK 的类中查找所有出现的 DBConnectController 并替换为新名称。

5) 将类 DBKeychain 和 DBKeychain-iOS 分别重命名为 DBKeychainOld 和 DBKeychainOld-iOS。在 SDK 类中查找所有出现的 DBKeychain,并将其替换为 DBKeychainOld。

6) 查找所有出现的“redential”并将它们替换为“redentialOld”。也更新类的名称。警告:仅替换包含该表达式的变量和类名,这些表达式属于 Core SDK。不要替换, for例如,在以下情况下: useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] . 这是 NSURL 类中的一个方法,修改它会破坏代码。

7) 将源文件导入您的项目。从 Core SDK 导入的所有源文件都无法使用 ARC 运行。这样,必须为这些文件禁用它。选择项目并转到构建阶段 -> 编译源,选择所有关于核心 SDK 的文件,双击它们并插入-fno-objc-arc.

8) 如果你编译项目,你会发现一些重复的符号:

duplicate symbol _kDBDropboxAPIVersion in:
duplicate symbol _kDBDropboxAPIHost in:
duplicate symbol _kDBDropboxAPIContentHost in:
duplicate symbol _kDBDropboxWebHost in:
duplicate symbol _kDBSDKVersion in:
duplicate symbol _DBErrorDomain in:
duplicate symbol _DBStringFromLogLevel in:
duplicate symbol _DBLogFilePath in:
duplicate symbol _DBSetupLogToFile in:
duplicate symbol _DBLogSetLevel in:
duplicate symbol _DBLogSetCallback in:
duplicate symbol _DBLog in:
duplicate symbol _DBLogInfo in:
duplicate symbol _DBLogWarning in:
duplicate symbol _DBLogError in:
duplicate symbol _DBLogFatal in:

将“旧”附加到这些变量名称的末尾。不要忘记更新代码,以便对这些变量的所有调用都使用它们的新名称。

9) 为了管理在两个 SDK 中链接您的 Dropbox 帐户,请转到 Core 的 DBSession+iOS.m 并在handleURL方法内部并注释以下行:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:kDBLinkNonce];
[[NSUserDefaults standardUserDefaults] synchronize];

10) 在application:openURL:sourceApplication:annotation:您的 App Delegate 的方法中插入以下代码:

[[DBSession sharedSession] handleOpenURL:url];//Core API
[[DBAccountManager sharedManager] handleOpenURL:url]; //Datastore API

重要提示:必须遵守此命令!handleOpenURLfrom Core API 必须在 Datastore 之前调用,因为在 9 中完成了修改)

11)在application:didFinishLaunchingWithOptions:插入以下代码:

    //Datastore API
    DBAccountManager *mgr =
    [[DBAccountManager alloc] initWithAppKey:DROPBOX_APP_KEY secret:DROPBOX_APP_SECRET];
    [DBAccountManager setSharedManager:mgr];

    //CoreAPI
    DBSession *dbSession = [[DBSession alloc]initWithAppKey:DROPBOX_APP_KEY
                                                  appSecret:DROPBOX_APP_SECRET
                                                       root:kDBRootDropbox];
    [DBSession setSharedSession:dbSession];

12)为了触发链接过程使用[[DBAccountManager sharedManager] linkFromController:self];

13) 要取消链接,请使用以下行

[[DBAccountManager sharedManager] linkedAccount] unlink];
[[DBSession sharedSession] unlinkAll];
于 2014-05-26T10:04:10.183 回答