3

私はこのことをまったく機能させるのにひどい時間を過ごしています。私はSalesforceのWebサイトのドキュメント、分散SDKのサンプルコードを読んで、一般的に壁に頭をぶつけて2日間過ごしました。

最も苛立たしいのは、ログイン画面が表示されていないことですが、ログイン画面の作成方法を教えてくれるものが見つかりません。私の知る限り、SFログインページを指すのはUIWebViewだけです。

これが私がこれまでに理解できたことです:

  1. SDKをプロジェクト(SalesforceSDK、SalesforceOAuth、RestKit)に追加し、 Gitreadmeに記載されているすべてのライブラリに対してリンクしました。
  2. "SFRestAPI.h"サーバーとのデータの送受信に使用しているサーバー通信クラスに含まれています。
  3. SDKで配布されているXCodeテンプレートのコードを使用してSFRestRequestを呼び出しました。

    SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:@"SELECT Name FROM User LIMIT 10"];
    [[SFRestAPI sharedInstance] send:request delegate:self];
    
  4. デリゲートメソッドを追加しました:

#pragma mark - Salesforce REST API delegate methods

- (void)request:(SFRestRequest *)request didLoadResponse:(id)jsonResponse
{
    NSLog(@"%@", jsonResponse);
}

- (void)request:(SFRestRequest *)request didFailLoadWithError:(NSError*)error
{
    NSLog(@"%@", error);
}

- (void)requestDidCancelLoad:(SFRestRequest *)request
{
    NSLog(@"%@", request);
}

- (void)requestDidTimeout:(SFRestRequest *)request
{
    NSLog(@"%@", request);
}

5.コンソールでこれを見ました:

`2012-09-11 10:23:44.128 ClientApp[39697:c07] SFRestAPI::send: <SFRestRequest 0xd4a9cb0 
endpoint: /services/data 
method: GET 
path: /v23.0/query 
queryParams: {
  "q" : "SELECT Name FROM User LIMIT 10"
}`

SFRestRequestのデリゲートメソッドは呼び出されませんでした。

うまくいかなかったものは次のとおりです。

アプリのデリゲートをSFNativeRestAppDelegateのサブクラスにする

これにより、約12の重複シンボルエラーが発生しました。

duplicate symbol _OBJC_CLASS_$_SFNativeRestAppDelegate in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFNativeRestAppDelegate.o)
duplicate symbol _OBJC_IVAR_$_SFNativeRestAppDelegate._authViewController in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFNativeRestAppDelegate.o)
duplicate symbol _OBJC_IVAR_$_SFNativeRestAppDelegate._viewController in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFNativeRestAppDelegate.o)
duplicate symbol _OBJC_IVAR_$_SFNativeRestAppDelegate._window in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFNativeRestAppDelegate.o)
duplicate symbol _OBJC_METACLASS_$_SFNativeRestAppDelegate in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFNativeRestAppDelegate.o)
duplicate symbol _kDefaultLoginHost in:
    /Volumes/Wallace/Users/gromitt/Library/Developer/Xcode/DerivedData/ClientApp-bpccblcllzkzvudxtwutuqliagld/Build/Intermediates/ClientApp.build/Debug-iphonesimulator/ClientApp.build/Objects-normal/i386/SFNativeRestAppDelegate.o
    /Volumes/Wallace/Users/gromitt/Documents/Out to Lunch/ iOS Apps/ClientApp/ClientApp/dependencies/SalesforceSDK/libSalesforceSDK.a(SFAccountManager.o)
ld: 6 duplicate symbols for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

どんな助けでも大歓迎です。前もって感謝します。

4

4 に答える 4

3

ターゲット->ビルド設定->その他のリンカーフラグ

Rest Kitチュートリアルで指定されているように、-ObjC-all_load今すぐ編集というフラグを追加して表示するだけ-ObjCで、アプリケーションがチャームのように機能するように変更しました。

これが将来この問題に直面している人々に役立つことを願っています。

于 2012-11-19T11:36:02.533 に答える
2

ですから、これは少し恥ずかしいことではありませんが、人々がこの問題に答えようとし続けることを望まないので、ここに行きます:

SFNativeAppDelegate.hのコピーを2つアプリに追加しました。SF Mobile SDKに含まれているファイルを調べていたので、スキップしたに違いありません。それで私はそれをもう一度追加しました、そしてそれは私の問題が始まったときです。

私は今それを動かしています。これが私がしたことです:

  1. SalesForceプロジェクトテンプレートを使用してネイティブアプリを作成します。
  2. Finderでネイティブアプリのディレクトリに移動します。dependenciesディレクトリを既存のプロジェクトにコピーします。
  3. XCodeでネイティブプロジェクトを開き、Settings.bundleを既存のプロジェクトにコピーします。SFAuthorizingViewController.xibあなたがそこにいる間もつかみなさい。ネイティブプロジェクトを閉じます。もう必要ありません。
  4. 既存のアプリのplistファイルを開きます。、という名前のキーを追加SFDCOAuthLoginHostし、test.salesforce.comまたはlogin.salesforce.comのいずれかに設定します
  5. 既存のアプリデリゲートに、、を含めSFNativeAppDelegate.hますSFOAuthCoordinator.hSFOAuthCredentials.h
  6. インターフェイス宣言行を次のように変更します。

    @interface YourAppDelegate : UIResponder <UIApplicationDelegate>
    

    ...これに:

    @interface YourAppDelegate : SFNativeRestAppDelegate
    
  7. YourAppDelegateに2つのプロパティを追加します。

    @property (nonatomic, readonly) SFOAuthCoordinator *coordinator;
    @property (nonatomic, retain) SFAuthorizingViewController *authViewController;
    
  8. YouAppDelegate.mにアクセスします。次の行を追加します。

    // Fill these in when creating a new Remote Access client on Force.com
    static NSString *const RemoteAccessConsumerKey = @"...yourConsumerKeyGoesHere...";
    static NSString *const OAuthRedirectURI = @"https://test.salesforce.com/services/oauth2/success";
    
  9. これらのメソッドも追加します(承認コーディネーターは私が見逃していた秘密のソースでした)

      #pragma mark - Salesforce.com login helpers
    
        - (NSString*)remoteAccessConsumerKey {
            return RemoteAccessConsumerKey;
        }
    
        - (NSString*)oauthRedirectURI {
            return OAuthRedirectURI;
        }
    
        -(NSString *)oauthLoginDomain {
            return @"test.salesforce.com";
        }
    
        -(void)login{
           [self.coordinator authenticate];
        }
    
        - (void)logout {
            [self.coordinator revokeAuthentication];
            [self.coordinator authenticate];
        }
    
        - (void)loggedIn {
            //provide the Rest API with a reference to the coordinator we used for login
            [[SFRestAPI sharedInstance] setCoordinator:self.coordinator];
            //[[SFRestAPI sharedInstance] setApiVersion:@"24.0"];
        }
    
        - (UIViewController*)newRootViewController {
            NSLog(@"You must override this method in your subclass");
            [self doesNotRecognizeSelector:@selector(newRootViewController)];
            return nil;
        }
    
        - (SFOAuthCoordinator*)coordinator {
            //create a new coordinator if we don't already have one
            if (nil == _coordinator) {
    
                NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
                NSString *loginDomain = [self oauthLoginDomain];
                NSString *accountIdentifier = [self userAccountIdentifier];
                //here we use the login domain as part of the identifier
                //to distinguish between eg  sandbox and production credentials
                NSString *fullKeychainIdentifier = [NSString stringWithFormat:@"%@-%@-%@",appName,accountIdentifier,loginDomain];
    
    
                SFOAuthCredentials *creds = [[SFOAuthCredentials alloc]
                                             initWithIdentifier:fullKeychainIdentifier
                                             clientId: [self remoteAccessConsumerKey] encrypted:NO ];
    
    
                creds.domain = loginDomain;
                creds.redirectUri = [self oauthRedirectURI];
    
                SFOAuthCoordinator *coord = [[SFOAuthCoordinator alloc] initWithCredentials:creds];
                coord.scopes = [[self class] oauthScopes];
    
                coord.delegate = self;
                _coordinator = coord;
            }
    
            return _coordinator;
        }
    

これで、 SFRestAPIを使用して電話をかける準備ができました。ユーザーがまだログインしていない場合は、SalesForce認証ページを初めて使用するときに表示されます。

助けてくれたみんなに感謝します。繰り返しますが、非常に恥ずかしいです。

于 2012-09-20T13:18:19.837 に答える
0

SFNativeRestAppDelegate最終的には、「無料で」認証を取得できるように、そのクラスから継承したいので、問題から始めましょう。

開発したアプリのどこかに SFNativeRestAppDelegate を実際に定義していないと仮定すると、表示されている競合の原因となっているビルド状態の問題があるように見えます。参照された静的ライブラリと DerivedData フォルダー内のランダム シンボルとの間で重複シンボルの問題が発生した場合は、通常、次のアクションを実行します。

  1. Xcode を閉じます。
  2. DerivedData を完全に吹き飛ばします ( rm -rf ~/Library/Developer/Xcode/DerivedData/*— これは一時的なビルド データであり、次の Xcode ビルドで再生成されます)。
  3. rm -rf MyProjectDir/MyProjectDir.xcodeproj/project.xcworkspace/ MyProjectDir/MyProjectDir.xcodeproj/xcuserdata/必要に応じて、プロジェクトの状態がクリーンであることを確認するためだけに、アプリ ( ) の Xcode プロジェクトの状態データを吹き飛ばします。

SFNativeRestAppDelegate から継承できる場合は[SFRestAPI sharedInstance]、サービスへの認証呼び出しを行うために必要な資格情報の設定を含め、すべての認証リンケージが舞台裏で行われる必要があります。SFNativeRestAppDelegate から継承できないことが問題の核心であるようです。それが完了すると、REST API アクセス用に説明したパターンが正しいように見えます。

さらに追加の質問がある場合は、developerforce.comのモバイル ボードのメンバーに相談することもできます。

于 2012-09-11T19:02:53.270 に答える
0

SFRestAPIデリゲートでクラスを設定しましたか??

@interface GSK_SFADataSyncManager : NSObject < SFRestDelegate >

SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:query];
[[SFRestAPI sharedInstance] send:request delegate:self]; 

ビルド設定から検索パスをクリアしてみてください...これと一緒に他のライブラリがありますか??

于 2012-09-19T16:26:23.033 に答える