测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年3月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Quinton Wall 维护。
SObjectKit 是一组有助于使用 Salesforce 数据类型和数据对象(SObjects)的实用类和函数。
SObjectKit 并非旨在成为 Salesforce 数据结构的完整面向对象/关系模型,它旨在解决80%的使用场景,即那些不知道 Salesforce API 或 SOQL 的开发者想要获取和绑定数据的情况。这通常模拟 Salesforce REST API 的方法,该方法不返回对象的所有相关记录,而是返回相关记录的id,你可以使用这些id来获取相关数据并将其存储在特定对象的集合变量中。我还正在考虑使 SObjects 适配 Realm,以便离线数据存储变得非常简单。目前 SObjectKit 仅提供只读访问。
SObjectKit 也将与 SalesforceViews 一起打包,提供一系列现成的 UIViews,作为 Xib 文件,你可以将其注册到你的应用程序中。
以下实现了以下标准对象
要运行示例项目,请首先克隆存储库,然后从 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
}
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语句来获取所有标准字段。(我将在不久的将来通过扩展标准对象来添加自定字段示例)您有三种获取标准字段的方式
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使用RFC3339格式(yyyy-MM-dd’T'HH:mm:ss.S'Z')表示系统日期,这通常不是您在应用程序中希望显示的内容。大多数情况下,您想要类似于MM/DD/YY的格式。
createdDateLabel.text = account.createdDate.toShortPrettyString()
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)!)
SObjectKit在MIT许可证下提供。有关更多信息,请参阅LICENSE文件。