1

アプリにドロップボックスのコア API を正常に実装しましたが、データストア API の機能が必要であり、そこに問題が発生します。データストア API のドロップボックス フレームワークを追加しましたが、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

最近、コア API とデータストア API の両方を統合する必要がありました。ドロップボックス フォーラムで質問をしたり、既に与えられたいくつかの回答を確認したりして、同じプロジェクトで両方の SDK を正常に操作することができました。

次の手順は、成功するために行った手順です。問題が解決することを願っています。

これらの手順は、次のバージョンで機能します。

  • Dropbox コア 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 に属するその式を含む変数とクラス名のみを置き換えます。 useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] . これは NSURL クラスのメソッドであり、変更するとコードが壊れます。

7) ソース ファイルをプロジェクトにインポートします。Core SDK からインポートされたすべてのソース ファイルは、ARC では実行できません。このようにして、それらのファイルに対して無効にする必要があります。プロジェクトを選択し、ビルド フェーズ -> ソースのコンパイルに移動し、Core 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:

これらの変数の名前の末尾に「Old」を追加します。これらの変数へのすべての呼び出しが新しい名前で行われるように、コードを更新することを忘れないでください。

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

重要: この順序は必ず守ってください! 変更は 9) で行われるため、コア API からのhandleOpenURL呼び出しはデータストアの API の前に呼び出す必要があります。

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 に答える