Кто-нибудь может помочь мне настроить Salesforce Mobile SDK для iOS?


Я испытываю ужасное время, что работает эта штука на всех. Я провел два дня, читая документацию на веб-сайте Salesforce, пример кода в распределенном SDK и просто бил головой о стену.

Самое неприятное, что я думаю, что мне просто не хватает экрана входа в систему, но я не могу найти ничего, что подскажет мне, как его сделать. Из того, что я могу сказать, это просто UIWebView, который указывает на страницу входа в SF.

Вот кем я был. удалось выяснить до сих пор:

  1. добавил SDK в мой проект (SalesforceSDK, SalesforceOAuth, RestKit) и связал со всеми библиотеками, упомянутыми в git readme.
  2. включено "SFRestAPI.h" в мой класс серверных коммуникаций, который я использую для отправки и получения данных с сервера.
  3. Вызывается SFRestRequest с использованием кода из шаблона XCode, распространяемого вместе с SDK:

    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);
}
[6]}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 2

4 ответа:

Цели - > параметры сборки -> другие флаги компоновщика

Как указано в учебнике Rest Kit мы изменили добавили флаг под названием -ObjC-all_load теперь отредактируйте его, чтобы просто отобразить -ObjC, и тогда приложение работает как шарм.

Надеюсь, что это поможет тем людям, которые сталкиваются с этой проблемой в будущем.

Так что это более чем немного смущает, но я не хочу, чтобы люди продолжали пытаться ответить на эту проблему, поэтому здесь идет:

У меня было два экземпляра SFNativeAppDelegate.h добавлено в мое приложение. Я просматривал файлы, включенные в SF Mobile SDK, и, должно быть, пропустил его. Поэтому я добавил его во второй раз, и тогда начались мои проблемы.

Теперь он у меня работает. Вот что я сделал:

  1. создание собственного приложения с помощью проекта SalesForce шаблон.
  2. перейдите в каталог вашего родного приложения в Finder. Скопируйте каталог dependencies в существующий проект .
  3. откройте собственный проект в XCode и скопируйте настройки.набор в существующий проект. Захватите SFAuthorizingViewController.xib, пока вы там тоже. Закройте собственный проект. Тебе это больше не нужно.
  4. откройте файл plist вашего существующего приложения. Добавьте ключ с именем SFDCOAuthLoginHost и задайте для него значение либо test.salesforce.com или login.salesforce.com
  5. в вашем существующий делегат приложения, включая SFNativeAppDelegate.h, SFOAuthCoordinator.h и еще SFOAuthCredentials.h
  6. Измените строку объявления интерфейса следующим образом:

    @interface YourAppDelegate : UIResponder <UIApplicationDelegate>
    

    ... к этому:

    @interface YourAppDelegate : SFNativeRestAppDelegate
    
  7. Добавьте два свойства в YourAppDelegate:

    @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.

Спасибо всем, кто пытался помочь. Опять же, очень смущен.

Давайте начнем с проблем SFNativeRestAppDelegate, так как в конечном счете вы хотите наследовать от этого класса, так что вы можете получить аутентификацию "бесплатно".

Предполагая, что вы на самом деле не определяете SFNativeRestAppDelegate где-то в вашем разработанном приложении, похоже, что у вас могут быть проблемы с состоянием сборки, которые вызывают конфликты, которые вы видите. Когда я вижу проблемы с дублированием символов между ссылочной статической библиотекой и случайными символами в папке DerivedData, я обычно делаю следующее действия:

  1. закройте Xcode.
  2. полностью уничтожьте DerivedData (rm -rf ~/Library/Developer/Xcode/DerivedData/* - это временные данные сборки, и они будут восстановлены при следующей сборке Xcode).
  3. при необходимости удалите данные о состоянии проекта Xcode для моего приложения (rm -rf MyProjectDir/MyProjectDir.xcodeproj/project.xcworkspace/ MyProjectDir/MyProjectDir.xcodeproj/xcuserdata/), просто чтобы убедиться, что состояние моего проекта Чистое.

Когда вы можете наследовать от SFNativeRestAppDelegate, все связи аутентификации должны происходить за кулисами, включая настройку [SFRestAPI sharedInstance] с учетными данными, которые он использует. необходимо сделать аутентифицированные звонки в службу. Похоже, что неспособность наследовать от SFNativeRestAppDelegate-это суть вашей проблемы. После этого шаблон, который вы описали для доступа к REST API, выглядит правильно.

Если у вас есть дополнительные вопросы, вы также можете проконсультироваться с людьми на мобильной доске по адресу developerforce.com.

Установил ли u класс с помощью делегата SFRestAPI??

@interface GSK_SFADataSyncManager : NSObject

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

Попробуйте очистить путь поиска в настройках сборки... есть ли у вас еще какие-нибудь lib наряду с этим??