Кто-нибудь может помочь мне настроить Salesforce Mobile SDK для iOS?
Я испытываю ужасное время, что работает эта штука на всех. Я провел два дня, читая документацию на веб-сайте Salesforce, пример кода в распределенном SDK и просто бил головой о стену.
Самое неприятное, что я думаю, что мне просто не хватает экрана входа в систему, но я не могу найти ничего, что подскажет мне, как его сделать. Из того, что я могу сказать, это просто UIWebView, который указывает на страницу входа в SF.
Вот кем я был. удалось выяснить до сих пор:
- добавил SDK в мой проект (SalesforceSDK, SalesforceOAuth, RestKit) и связал со всеми библиотеками, упомянутыми в git readme.
- включено
"SFRestAPI.h"
в мой класс серверных коммуникаций, который я использую для отправки и получения данных с сервера. -
Вызывается SFRestRequest с использованием кода из шаблона XCode, распространяемого вместе с SDK:
SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:@"SELECT Name FROM User LIMIT 10"]; [[SFRestAPI sharedInstance] send:request delegate:self];
-
Добавил делегат методы:
#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 ответа:
Цели - > параметры сборки -> другие флаги компоновщика
Как указано в учебнике Rest Kit мы изменили добавили флаг под названием
-ObjC-all_load
теперь отредактируйте его, чтобы просто отобразить-ObjC
, и тогда приложение работает как шарм.Надеюсь, что это поможет тем людям, которые сталкиваются с этой проблемой в будущем.
Так что это более чем немного смущает, но я не хочу, чтобы люди продолжали пытаться ответить на эту проблему, поэтому здесь идет:
У меня было два экземпляра SFNativeAppDelegate.h добавлено в мое приложение. Я просматривал файлы, включенные в SF Mobile SDK, и, должно быть, пропустил его. Поэтому я добавил его во второй раз, и тогда начались мои проблемы.Теперь он у меня работает. Вот что я сделал:
- создание собственного приложения с помощью проекта SalesForce шаблон.
- перейдите в каталог вашего родного приложения в Finder. Скопируйте каталог
dependencies
в существующий проект .- откройте собственный проект в XCode и скопируйте настройки.набор в существующий проект. Захватите
SFAuthorizingViewController.xib
, пока вы там тоже. Закройте собственный проект. Тебе это больше не нужно.- откройте файл plist вашего существующего приложения. Добавьте ключ с именем
SFDCOAuthLoginHost
и задайте для него значение либо test.salesforce.com или login.salesforce.com- в вашем существующий делегат приложения, включая
SFNativeAppDelegate.h
,SFOAuthCoordinator.h
и ещеSFOAuthCredentials.h
Измените строку объявления интерфейса следующим образом:
@interface YourAppDelegate : UIResponder <UIApplicationDelegate>
... к этому:
@interface YourAppDelegate : SFNativeRestAppDelegate
Добавьте два свойства в YourAppDelegate:
@property (nonatomic, readonly) SFOAuthCoordinator *coordinator; @property (nonatomic, retain) SFAuthorizingViewController *authViewController;
Перейти к 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";
Добавьте также Эти методы (разрешающий координатор был секретным соусом, которого мне не хватало)
#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, я обычно делаю следующее действия:
- закройте Xcode.
- полностью уничтожьте DerivedData (
rm -rf ~/Library/Developer/Xcode/DerivedData/*
- это временные данные сборки, и они будут восстановлены при следующей сборке Xcode).- при необходимости удалите данные о состоянии проекта 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 наряду с этим??