SObjectKit 0.39.4

SObjectKit 0.39.4

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年3月
SwiftSwift 版本3.0
SPM支持 SPM

Quinton Wall 维护。



SObjectKit 0.39.4

  • quintonwall

SObjectKit

SObjectKit 是一组有助于使用 Salesforce 数据类型和数据对象(SObjects)的实用类和函数。

SObjectKit 并非旨在成为 Salesforce 数据结构的完整面向对象/关系模型,它旨在解决80%的使用场景,即那些不知道 Salesforce API 或 SOQL 的开发者想要获取和绑定数据的情况。这通常模拟 Salesforce REST API 的方法,该方法不返回对象的所有相关记录,而是返回相关记录的id,你可以使用这些id来获取相关数据并将其存储在特定对象的集合变量中。我还正在考虑使 SObjects 适配 Realm,以便离线数据存储变得非常简单。目前 SObjectKit 仅提供只读访问。

SObjectKit 也将与 SalesforceViews 一起打包,提供一系列现成的 UIViews,作为 Xib 文件,你可以将其注册到你的应用程序中。

以下实现了以下标准对象

  • 账户
  • 机会
  • 机会行项目
  • 潜在客户
  • 联系人
  • 产品2
  • 价格单条目

示例

要运行示例项目,请首先克隆存储库,然后从 Example 目录运行 pod install

需求

安装

SObjectKit 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "SObjectKit"

使用

SObjectKit 提供了所有标准 Salesforce 对象(SObject)的实现。它不提供与 Salesforce 的任何通信或认证。开发者需要选择他们偏好的 SDK。许多开发者使用 Salesforce 提供的官方 SDK:Salesforce Mobile SDK。我也喜欢 SwiftlySalesforce,因为它使用了 Promises。这使得异步调用更加优雅。因此,包含在 pod 中的示例应用程序使用了 SwiftlySalesforce。

示例:获取数据并将其加载到表格单元格中

func loadData() {

  firstly {
    salesforce.query(soql: Account.soqlGetAllFields(nil))

  }.then {
   ( result) -> () in
     self.allAccounts = Account.populateToCollection(result.records as NSArray) as! [Account]
  }.always {
     self.tableView.reloadData()
     self.refreshControl?.endRefreshing()

  }.catch { error in
    //do some error handling
  }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCellWithIdentifier("accountcell", forIndexPath: indexPath) as! AccountTableCell
   cell.bind(allAccounts[indexPath.item])
   return cell
}

示例:使用SObjects

 public func bind(account : Account) {

    self.account = account
    accountNameLabel.text = account.Name
    tickerSymbolLabel.text = account.TickerSymbol

    //Using an SObjectKit extension on String to make date formatting easier
    lastUpdatedLabel.text = account.lastModifiedDate?.toShortPrettyString()

    OAuth2Manager.sharedInstance.credentials?.accessToken

    //photo url, obtained by connecting social accounts in your org, is only stored as a relative url in salesforce. eg: /services/images/photo/0013600000q8rb0AAA
    //you need to retrieve the hostname from your SDK that you are using to connect to salesforce, and append the accessToken...messy I know!

    //In this sample app, I am using SwiftlySalesforce and then storing it on my account object for convenience

 account.PhotoFullUrl = URL(string: "https://"+salesforce.authManager.configuration.loginHost+account.PhotoRelativeUrl!)?.protectedSalesforceURL((salesforce.authManager.authData?.accessToken)!)

    accountPhoto.sd_setImageWithURL(account.PhotoFullUrl, placeholderImage: UIImage(named: "account-placeholder"))


   //longitude and latitude values will only be auto added to standard address fields in salesforce if you
   // enable them in your org via Setup > Feature Settings > Data.com > Clean Rules.
   propertyLocation = CLLocation(latitude: account.BillingAddress.latitude, longitude: account.BillingAddress.longitude)
   centerMapOnLocation(propertyLocation!)
}

相关对象

Salesforce REST API不会获取相关子记录(当然,您也可以编写自己的SOQL来实现这一点)。SObjectKit模拟了这种方法,但提供了方便的集合变量,用于SObject类型。开发人员可以使用这些收集来轻松管理从Salesforce获取的相关数据。

firstly {
   salesforce.query(soql: Opportunity.soqlGetOpportunitiesForAccount(accountid))

}.then {
  ( result) -> () in
     self.account.opportunities = Opportunity.populateToCollection(result.records as NSArray) as! [Opportunity]
}.always {
 //do something
}.catch { error in
//do some error handling
}

查询数据

默认情况下,SObjectKit使用SOQL语句来获取所有标准字段。(我将在不久的将来通过扩展标准对象来添加自定字段示例)您有三种获取标准字段的方式

获取sobject类型的所有字段

 let soqlstmt = Opportunity.soqlGetAllFields(nil)

获取特定记录的所有字段

 let soqlstmt = Opportunity.soqlGetAllFields(recordId)

编写仅包含您想要的字段的查询

  //Using SwiftlySalesforce to handle comms with Salesforce
   salesforce.query(soql: "Select Id, Name, NextStep From Opportunity")

处理标准对象上的自定义字段

可以通过创建一个新的类来支持自定义字段,该类实现了CustomSObject协议,并重写了customFieldNames()函数,同时实现init函数以将JSON结果映射到字段。此外,建议重写populateToCollection函数,以便在您的下游代码中使用它更加方便。

虽然这可能会感觉像是额外的努力(与只提供一个传递自定义字段名的函数相比),但这种方法提供了方便的到强类型对象的映射。(这也是SObjectKit的整个目的)这大大节省了开发时间,因为它限制了在整个代码中字段名称的扩散,并减少了处理多个位置的JSON解析的重复代码。

示例应用程序包括一个AccountCustomSObject,它为Account对象提供了对2个自定义字段的支持。

import Foundation
import SObjectKit
import SwiftyJSON

class AccountCustomSObject : Account, CustomSObject {

  var GlassdoorRating : Int?
  var IsNonProfit : Bool?


  override init(json: JSON) {
    super.init(json: json)

    let fieldnames = AccountCustomSObject.customFieldNames()
    GlassdoorRating = json[fieldnames[0]].int
    IsNonProfit = json[fieldnames[1]].boolValue
  }

  // Description: customsobject protocol requires you to implement this method
  static func customFieldNames() -> [String] {
    return ["GlassdoorRating__c, IsNonProfit__c"]
  }

  //
  // Description: This func is not required to be overridden for custom objects, but it makes it easier for downstream usage
  //
  override class func populateToCollection(records : NSArray)  -> [SObject] {
    var allrecords : [AccountCustomSObject] = []

    let j = JSON(records)
    for (_, subJson) in j {
       allrecords.append(AccountCustomSObject(json: subJson))
    }

    return allrecords
  }
}

SObjectKit会自动将您的自定义字段包含在soqlGetAllFields函数调用中,以便轻松执行等效的“select *”语句。以下片段将检索在AccountCustomObject中定义的自定义字段以及Account上定义的所有标准字段

 salesforce.query(soql: AccountCustomObject.soqlGetAllFields(nil))

实现自定义对象

实现自定义对象可以通过创建一个新的SObject类来实现。请参考Account作为实现的坚实基础示例。

使用扩展

SObjectKit包含了许多扩展,使处理Salesforce数据变得更加容易。以下两个函数可能是最常用的。请查看API文档以获取更多示例。

Salesforce数据格式

Salesforce使用RFC3339格式(yyyy-MM-dd’T'HH:mm:ss.S'Z')表示系统日期,这通常不是您在应用程序中希望显示的内容。大多数情况下,您想要类似于MM/DD/YY的格式。

  createdDateLabel.text = account.createdDate.toShortPrettyString()

Salesforce受保护URLs

Salesforce中的一些信息(尤其是照片URL,以相对URL返回)可以通过直接URL和有效的身份验证令牌进行访问。以下示例演示了如何使用SwiftlySalesforce和NSURL扩展简化对受保护URL的调用。注意:在非HTTPS URL上调用NSURL.protectedSalesforceURL将在运行时抛出一个断言失败错误,因为所有Salesforce受保护URL都必须通过HTTPS访问。

account.PhotoFullUrl = NSURL(string: "https://"+OAuth2Manager.sharedInstance.hostname+account.PhotoRelativeUrl!)?.protectedSalesforceURL((OAuth2Manager.sharedInstance.credentials?.accessToken)!)

作者

Quinton Wall

许可证

SObjectKit在MIT许可证下提供。有关更多信息,请参阅LICENSE文件。