我有一个可怕的时间让这件事情起作用。我花了两天时间阅读Salesforce网站上的文档,分布式SDK中的示例代码,并且一般都是在墙上敲打着。
最令人沮丧的是,我认为我只是错过了登录界面,但我找不到任何可以告诉我如何制作登录界面的内容。据我所知,它只是一个指向SF登录页面的UIWebView。
到目前为止,这是我能够弄清楚的:
"SFRestAPI.h"
我正在用来从服务器发送和接收数据。使用随SDK一起分发的XCode模板中的代码调用SFRestRequest:
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);
}
- (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.在控制台中看到这个:
没有调用SFRestRequest的委托方法。
这是没有用的:
这创建了大约12个重复的符号错误:
`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"
}`
感谢任何帮助。提前谢谢。
答案 0 :(得分:3)
Targets-&GT;构建设置 - &gt;其他链接标志
正如Rest Kit Tutorial中所指定的,我们更改了一个名为-ObjC-all_load
的标志,现在编辑它以显示-ObjC
然后应用程序就像一个魅力。
希望这可以帮助那些将来面临这个问题的人。
答案 1 :(得分:2)
所以这不仅有点尴尬,而且我不希望别人继续尝试回答这个问题,所以这里有:
我已将两个SFNativeAppDelegate.h副本添加到我的应用程序中。我正在浏览SF Mobile SDK中包含的文件,我必须跳过它。所以我第二次添加它,这就是我的问题开始的时候。
我现在正在工作。这是我做的:
dependencies
目录复制到现有项目中。SFAuthorizingViewController.xib
。关闭Native项目。你不再需要了它。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身份验证页面。
感谢所有试图提供帮助的人。再次,超级尴尬。
答案 2 :(得分:0)
让我们从SFNativeRestAppDelegate
问题开始,最终,您希望从该类继承,以便您可以“免费”获得身份验证。
假设您实际上没有在开发的应用程序中的某处定义SFNativeRestAppDelegate,看起来您可能已经构建了导致您所看到的冲突的状态问题。当我在DerivedData文件夹中看到引用的静态库和随机符号之间出现重复符号问题时,我通常会采取以下操作:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
- 这是临时构建数据,将使用您的下一个Xcode构建重新生成。)rm -rf MyProjectDir/MyProjectDir.xcodeproj/project.xcworkspace/ MyProjectDir/MyProjectDir.xcodeproj/xcuserdata/
)的Xcode项目状态数据,以确保我的项目状态是干净的。当您能够从SFNativeRestAppDelegate继承时,所有身份验证链接都应在幕后进行,包括设置[SFRestAPI sharedInstance]
以及对服务进行身份验证调用所需的凭据。看起来无法从SFNativeRestAppDelegate继承是您问题的症结所在。完成后,您为REST API访问描述的模式看起来是正确的。
如果您还有其他后续问题,也可以咨询developerforce.com上the Mobile board的人员。
答案 3 :(得分:0)
您是否使用SFRestAPI委托设置了类?
@interface GSK_SFADataSyncManager:NSObject &lt; SFRestDelegate&gt;
SFRestRequest *request = [[SFRestAPI sharedInstance] requestForQuery:query];
[[SFRestAPI sharedInstance] send:request delegate:self];
尝试从Build设置清除搜索路径...你还有其他lib吗?