任何人都可以帮我设置适用于iOS的Salesforce Mobile SDK吗?

时间:2012-09-11 14:41:20

标签: ios mobile sdk salesforce

我有一个可怕的时间让这件事情起作用。我花了两天时间阅读Salesforce网站上的文档,分布式SDK中的示例代码,并且一般都是在墙上敲打着。

最令人沮丧的是,我认为我只是错过了登录界面,但我找不到任何可以告诉我如何制作登录界面的内容。据我所知,它只是一个指向SF登录页面的UIWebView。

到目前为止,这是我能够弄清楚的:

  1. 将SDK添加到我的项目(SalesforceSDK,SalesforceOAuth,RestKit)并链接到Git readme中提到的所有库。
  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. 添加了委托方法:

  5. #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的委托方法。

    这是没有用的:

    让我的应用委托SFNativeRestAppDelegate

    的子类

    这创建了大约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"
    }`
    

    感谢任何帮助。提前谢谢。

4 个答案:

答案 0 :(得分:3)

Targets-&GT;构建设置 - &gt;其他链接标志

正如Rest Kit Tutorial中所指定的,我们更改了一个名为-ObjC-all_load的标志,现在编辑它以显示-ObjC然后应用程序就像一个魅力。

希望这可以帮助那些将来面临这个问题的人。

答案 1 :(得分:2)

所以这不仅有点尴尬,而且我不希望别人继续尝试回答这个问题,所以这里有:

我已将两个SFNativeAppDelegate.h副本添加到我的应用程序中。我正在浏览SF Mobile SDK中包含的文件,我必须跳过它。所以我第二次添加它,这就是我的问题开始的时候。

我现在正在工作。这是我做的:

  1. 使用SalesForce项目模板创建Native应用程序。
  2. 转到Finder中的Native应用程序目录。将dependencies目录复制到现有项目中。
  3. 在XCode中打开Native项目,并将Settings.bundle复制到现有项目。当你在那里时抓住SFAuthorizingViewController.xib。关闭Native项目。你不再需要了它。
  4. 打开现有应用的plist文件。添加名为SFDCOAuthLoginHost的密钥,并将其设置为test.salesforce.com或login.salesforce.com
  5. 在现有的应用代理中,添加SFNativeAppDelegate.hSFOAuthCoordinator.hSFOAuthCredentials.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;
        }
    
  10. 现在您已准备好使用SFRestAPI拨打电话。如果用户尚未登录,则首次尝试使用时会出现SalesForce身份验证页面。

    感谢所有试图提供帮助的人。再次,超级尴尬。

答案 2 :(得分: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项目状态数据,以确保我的项目状态是干净的。
  4. 当您能够从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吗?