BMLTiOSLib
注意:此库的详细、丰富的技术讨论可在本网站上找到[链接]。
BMLTiOSLib 位于 BMLT Root 服务器语义接口 和您的 iOS 应用之间
此项目是一个 iOS 共享框架,旨在简化将 BMLT Root 服务器集成到 iOS 客户端的过程(它也可能适用于 MacOS,但我们还没有达到那里)。BMLTiOSLib 是一个仅 Swift 的框架。它不支持 Objective-C。BMLTiOSLib/Framework 目录包含了相关的导出类。BMLTiOSLib/Test Harness Project 目录实现了一个相当复杂的程序,我们用它来测试库。由于 Apple 现在要求 iOS 应用只能与 SSL 服务器交互,测试变得略微复杂。我们不想通过允许连接到自签名证书来妥协安全性,所以我们无法使用 localhost 进行测试。
提示:我们使用 Charles Proxy 来检查模拟器和服务器之间的交互。 可以将 Charles 设置为“中间人”,以解密 SSL 交互。
为了便于测试,您可以通过SSL连接到BMLT测试服务器,该服务器使用SSL。由于这是我们的主要测试平台,数据库会发生变化,但它始终具备通过SSL访问的能力。《BMLTiOSLib测试器》应用程序界面并不美观。它并不需要美观。它是一个供我们按各种按钮的太空船驾驶舱程序。《BMLTiOSLib测试器》应用程序在操作中存在一些问题,但坦白地说,这些问题不是修复的重点,因为我们现在有多个“真实世界”的应用,它们对BMLTiOSLib的测试程度要比这只丑陋的小鸭子多得多。《BMLTiOSLib》是一个用于iOS设备库的文档页面。
安装
CocoaPod
作为要将它作为CocoaPod使用,只需将以下内容添加到您的Podfile
pod 'BMLTiOSLib'
接下来,您需要切换到项目目录,并在命令行上执行pod install
或pod update
。
然后,您需要通过在将访问库的源文件中添加以下内容来导入模块:
import BMLTiOSLib
Swift Package
作为您可以通过引用其GitHub仓库的URI(SSH:[email protected]:bmlt-enabled/BMLTiOSLib.git 或 HTTPS:https://github.com/bmlt-enabled/BMLTiOSLib.git)来使用Swift包管理器包含BMLTiOSLib。
然后,您需要通过在将访问库的源文件中添加以下内容来导入模块:
import BMLTiOSLib
Carthage
使用要使用Carthage,只需将以下内容添加到您的Cartfile
github "bmlt-enabled/BMLTiOSLib"
然后,您应该在项目目录下执行 cd
命令,并在命令行上运行 carthage update
。
然后,您需要通过在将访问库的源文件中添加以下内容来导入模块:
import BMLTiOSLib
需要注意的是,Carthage可能与应用商店的配置问题相关,因此您可能需要自己构建框架,以避免这些问题。
直接
您还可以直接从其作为GitHub仓库的位置访问此项目,并将其包含到您的项目中。
底面
BMLTiOSLib使用BMLT JSON语义接口与Root服务器通信。管理通过BMLT管理语义接口(也是JSON格式)完成。整个想法是完全从应用程序开发过程中抽象化通信层。BMLTiOSLib提供了BMLT的简单、检查错误的函数接口。与BMLTiOSLib的交互通过Apple的代理模式来完成。当您实例化BMLTiOSLib的一个实例时,您将您的应用程序注册为BMLTiOSLibDelegate代理实例,并将接收事件。然后您使用功能接口来操作连接。
基本用法
BMLTiOSLib类表示对BMLTiOSLib框架的公共接口。此类需要使用一个有效的根服务器的URI(用于登录的同一线URI)和BMLTiOSLibDelegate代理实例进行实例化。实例化将立即开始通信过程,并在代理的bmltLibInstance(_ inLibInstance: BMLTiOSLib, serverIsValid: Bool)回调中反映结果。如果此实例无法连接到有效的根服务器,则应将其删除并重新实例化以建立新的连接。建立连接后,HTTP会话将在实例取消实例化之前保持不变。需要保持会话以进行语义管理。您不能在多个BMLTiOSLib实例之间共享会话。
基本服务器信息
一旦您成功连接(建立会话)到根服务器,这个实例将关于该服务器的某些基本信息可用。当连接成功时(`serverIsValid`为true),将调用您的代表者的bmltLibInstance(_ inLibInstance: BMLTiOSLib, serverIsValid: Bool)方法。此信息可以通过调用以下BMLTiOSLib实例属性来访问
-
distanceUnits和distanceUnitsString(这是服务器使用的距离单位 - 公里或英里)。
-
availableMeetingValueKeys(包含可以访问各种会议属性的字典键字符串)。
-
emailMeetingContactsEnabled(如果服务器设置为允许向会议联系人发送电子邮件,则为true)。
-
emailServiceBodyAdminsEnabled(如果这些电子邮件将CC服务机构的机构管理员以及会议联系人 - 他们可能是相同的电子邮件地址,则为true)。
-
changeDepth(每个会议保存的更改数量)。
-
googleAPIKey(根服务器的Google Maps API密钥 - 对于大多数其他服务器可能没有用)。
-
delegate(将是一个对象 - 实现了在实例创建时作为代表传递的BMLTiOSLibDelegate协议)。
-
versionAsString和versionAsInt(服务器版本)
-
isAdminAvailable(如果语义管理可用,则为true)。
-
defaultLocation(根服务器的默认中心位置)。
-
serviceBodies(这是服务机构的“平坦”数组,没有层次结构)。
-
hierarchicalServiceBodies(这绘制出在根服务器上占有的服务机构层次结构,这是一个只有子节点但没有父节点或服务机构的节点)。
-
allPossibleFormats(可用格式对象的数组 - 可能不是所有会议都使用)。
-
availableServerLanguages(语言对象的数组)。
您可以通过查看必需的 bmltLibInstance(_ inLibInstance: BMLTiOSLib, serverIsValid: Bool) 调用中的 serverIsValid
参数值来确定连接是否成功
public func bmltLibInstance(_ inLibInstance: BMLTiOSLib, serverIsValid: Bool) {
if serverIsValid {
•
•
•
•
}
}
如果发生任何错误,会调用必需的 bmltLibInstance(_ : BMLTiOSLib, errorOccurred: Error) 调用
public func bmltLibInstance(_ inLibInstance: BMLTiOSLib, errorOccurred: Error) {
•
•
•
•
}
以下是简图,展示 BMLTiOSLib 在建立连接时的行为
会议搜索
使用此类进行会议搜索的方法是获取实例的搜索条件对象,并使用其各种属性设置所需的搜索。完成后,调用此类的 performMeetingSearch(_:BMLTiOSLibSearchCriteria.SearchCriteriaExtent) 方法,指明您是否只想搜索会议、只想搜索搜索结果中会议使用的格式,或者两者都要。搜索完成后,此类将调用您的代理例程。
-
bmltLibInstance(_:BMLTiOSLib,meetingSearchResults:[BMLTiOSLibMeetingNode]) 将被调用,返回会议搜索结果。
-
bmltLibInstance(_:BMLTiOSLib,formatSearchResults:[BMLTiOSLibFormatNode],isAllUsedFormats:Bool) 将被调用,返回格式搜索结果。
这可能会或可能同时调用,取决于您在调用 performMeetingSearch(_:BMLTiOSLibSearchCriteria.SearchCriteriaExtent) 时的请求。如果没有结果,它们将被调用为空数组。您可以使用这些两个 BMLTiOSLibDelegate 调用来获取会议搜索结果、为给定会议搜索使用的格式,或两者都要。
public func bmltLibInstance(_ inLibInstance: BMLTiOSLib, meetingSearchResults: [BMLTiOSLibMeetingNode]) {
•
•
•
•
}
public func bmltLibInstance(_ inLibInstance: BMLTiOSLib, formatSearchResults: [BMLTiOSLibFormatNode], isAllUsedFormats: Bool) {
•
•
•
•
}
如果 isAllUsedFormats 为 false,则返回的格式 仅限于 搜索中指定的会议集中使用的格式。如果 isAllUsedFormats
为 true,则格式集合包含服务器上所有可用的格式;无论这些格式是否被任何会议使用(基本上等同于 allPossibleFormats 实例属性的表项)。
会议变更
您可以查询会议变更,包括已删除的会议 (如果您是授权管理员,您还可以恢复已删除的会议)。您可以通过调用以下方法之一来完成此操作:
-
getAllMeetingChanges(fromDate:Date?,toDate:Date?,meetingID:Int?)
-
getAllMeetingChanges(fromDate:Date?,toDate:Date?,serviceBodyID:Int?)
-
getAllMeetingChanges(fromDate:Date?,toDate:Date?,serviceBodyID:Int?,meetingID:Int?)
-
getAllMeetingChanges(fromDate:Date?,toDate:Date?,serviceBodyID:Int?,meetingID:Int?,userID:Int?)
-
getDeletedMeetingChanges(fromDate:Date?,toDate:Date?,serviceBodyID:Int?)
-
getDeletedMeetingChanges(fromDate:Date?,toDate:Date?,serviceBodyIDs:[Int]?)
在调用上述方法之一后,您的代理将使用bmltLibInstance(_:BMLTiOSLib,changeListResults:[BMLTiOSLibChangeNode])方法进行回调;该方法将包含所需变更对象的数组。您可以使用这些对象来回滚会议或恢复已删除的会议。
public func bmltLibInstance(_ inLibInstance: BMLTiOSLib, changeListResults: [BMLTiOSLibChangeNode]) {
•
•
•
•
}
向会议联系人发送消息
在某些根服务器上,管理员可以选择启用用户向指定的会议联系人(或负责会议的行政管理部门)发送消息的功能。在这种情况下,收到的消息是以电子邮件的形式,但发送者并没有发送电子邮件。相反,他们使用BMLTiOSLibMeetingNode类的sendMessageToMeetingContact(fromAddress:String,messageBody:String)方法。消息在后台发送。当消息发送完成后,您的代理将使用bmltLibInstance(_:BMLTiOSLib,sendMessageSuccessful:Bool)方法进行回调。
管理
为了对根服务器进行管理,您需要使用 adminLogin(loginID:uint,password:uint) 方法进行登录。登录将保持有效,直到此对象(及其连接会话)的生命周期结束或调用 adminLogout() 方法。会议搜索的结果可能会返回以 BMLTiOSLibEditableMeetingNode 为实例的会议对象,而不是 BMLTiOSLibMeetingNode(只要您以管理员身份登录并且有足够的权限编辑会议)。它将取决于登录为此特定会议具有的编辑权限。如果您不能编辑会议,则实例将是 BMLTiOSLibMeetingNode,而不是 BMLTiOSLibEditableMeetingNode。如果实例是 BMLTiOSLibEditableMeetingNode 输出,则 isEditable 属性将返回 true。如果实例是 BMLTiOSLibEditableMeetingNode 类,则可以将其显式转换为该类,并操作公开属性。一旦设置属性,可以对实例调用 saveChanges() 方法,会议将保存。在调用 saveChanges() 方法之前,会议的更改不会发送到服务器。会议被保存后,您的代理将收到对其 bmltLibInstance(_:BMLTiOSLib,adminMeetingChangeComplete:BMLTiOSLibChangedMeeting!) 方法的调用,该对象将包含会议更改的任何字段,包含“之前”和“之后”的值(总是字符串)。您还可以通过调用 delete() 方法来删除会议(删除是立即发生的)。如果您删除会议,代理将调用 bmltLibInstance(_:BMLTiOSLib,deleteMeetingSuccessful:bool) 方法。如果您调用 restoreToOriginal() 方法,您对会议对象所做的任何更改将恢复到服务器上会议的状态。不会向服务器发送任何内容。您还可以使用 revertMeetingToBeforeThisChange(_:BMLTiOSLibChangeNode) 方法将会议回滚到给定更改记录之前的状态。不会向服务器发送任何内容。如果更改不适合会议,则调用将返回 false。如果它是成功的,会议的状态将回滚到更改记录中的状态,但尚未发送到服务器。您仍然需要调用 saveChanges()。
撤消和恢复删除会议
选择更改的 saveMeetingToBeforeThisChange() 方法或可编辑会议对象,将使用语义管理界面(只要您以管理员身份登录,并且拥有足够的权限编辑会议)的恢复删除或回滚功能。我们允许您获取会议的“前面”记录(在 json_data
JSON响应中找到,或在更改记录对象的 beforeObject 属性中找到),并将其保存。这允许您添加新的更改(与简单地接受回滚中的整个更改相比,您可以只选择某些更改),同时也提供了更准确的会议历史更改记录。而不是简短的“会议已回滚到先前版本”,现在您将拥有一份确切的改动字段列表。请记住,更改记录对象的 beforeObject 和 afterObject 属性是完整的会议对象,如果可编辑,则可以保存,这会覆盖数据库中的当前内容(这与保存更改为会议记录完全一样)。您可以通过调用更改记录对象的 revertMeetingToBeforeThisChange() 方法来撤销会议。这是相当简单的。
新建会议
创建新的会议很简单(只要您以管理员身份登录,并且拥有足够的权限创建会议)。您创建一个具有 ID 0(默认值)的 BMLTiOSLibEditableMeetingNode 实例。然后,当您调用 saveChanges() 时,它将创建一个新的会议。当您创建新的会议或恢复已删除的会议时,您的代理将通过 bmltLibInstance(_:BMLTiOSLib,newMeetingAdded:BMLTiOSLibEditableMeetingNode) 方法调用。`newMeetingAdded` 参数将包含表示新创建的会议的对象(包括如果是全新会议,其新 ID)。
至 2017 年 12 月
待办事项
-
使任务可中断,而不会终止会话。目前,终止任务的方式是终止会话。这对搜索引擎应用来说非常好,但对管理应用来说并不太好,因为会话承载着登录信息。如果你终止了会话,就会强迫用户重新登录。
-
使库具有多任务处理能力。目前,该库以单线程方式工作。它应该能够处理多个同时任务。
好想有
-
针对简单的TVOS Swift应用进行测试
-
针对简单的MacOS Swift应用进行测试