LGV_MeetingSDK

一个可适应的 SDK,用于查找和列出定期发生的、已安排的活动。

概述

The Project Icon

该 SDK 提供了一个(主要)基于协议的 SDK 定义,该定义可以应用于底层服务器连接,当服务器提供有关定期安排的(每周)活动的信息时。

该信息被“商品化”为一个相对简单的结构,因此具有不同行为的不同类型的服务器可以在一个公共外观后面被抽象出来。

该 SDK 解决了什么问题?

有很多数据库和 API 可用于在线安排会议,开发到所有这些数据库和 API 的连接器可能非常令人生畏。

此 SDK 是一个“基线”平台,可以将其扩展和专门化为离散的、重点突出的连接器,这些连接器可以“混合和匹配”,并返回一个单一、一致的数据结构。

它还允许使用现代的、平台无关的 Swift,以“原生”Swift 方式处理这些连接器。

要求

这是一个仅限 Swift 的 SDK,旨在供原生 Swift Apple 实现使用。它适用于所有 Apple 平台(iOSiPadOSWatchOSMacOSTVOS)。

该 SDK 没有依赖项,但 测试工具应用程序有一些依赖项

什么是“会议”?

就本 SDK 而言,会议是在某个物理位置或虚拟场所(或两者)定期发生的事件。频率是每周一次。

有针对“一次性”活动的规定,但这些活动最好由日历或调度系统处理。

会议与“组织”相关联。

什么是“组织”?

开发此 SDK 的目的是专门为了满足传播 12 步康复组织(如 AANA)的日程安排信息的需要,但是,它不需要局限于这些类型的互助会。 它也可以用来“混合和匹配”来自不同组织的会议。

SDK 结构

SDK 的基本结构是 SDK 的一个实例,该实例专门针对某个 API(例如,BMLT API),它将被分配一个组织。 该组织将被分配一个“传输”,该“传输”负责查询服务器并解析响应。它通过“发起者”和“解析器”来完成此操作。

The System Diagram

在上图中,我们看到 SDK 用作到 BMLT 服务器的连接器。

搜索由 SDK 的用户通过提供 搜索类型搜索细化来启动。 这些定义了搜索的参数。

然后,SDK 从其 组织实例获取 传输实例,并要求它执行搜索。

传输实例具有 发起者实例,以及 解析器实例,它们将负责与会议列表服务器(在本例中,是一个 BMLT 服务器实例)的实际交互(在本例中为 HTTPS)。

发起者知道如何将通用的搜索类型(以及可能的细化)转换为服务器查询,并向会议列表服务器发送满足所请求搜索参数的请求。

服务器用查询的答案(在本例中为 JSON 数据)进行响应,发起者将其发送到 解析器,后者将其呈现为将传递给 SDK 用户的基本对象模型。

每个 会议实例可以附加多个 格式实例。 这些是定义会议各种属性的元数据。 它还将至少有一个 物理场所,或至少一个 虚拟场所。 它可以同时具有这两种类型的场所(称为“混合”会议)。

给用户的 响应Swift 完成块中返回。

响应包含初始搜索请求参数,以及满足请求的任何找到的会议。 遇到的任何错误也会在闭包中返回。

内置连接器

目前,唯一的专门连接器适用于 BMLT,这是一个用于 NA 会议的现代全球 API,以及 LGV_MeetingServer 通用会议聚合器后端(它也聚合 BMLT 端点)。

示例

SDK 使用的示例可在 单元测试测试工具中找到。

从哪里获取

Swift 包管理器 (SPM)

Carthage

您可以通过在您的 Cartfile 中添加以下行来实现它

`github "LittleGreenViper/LGV_MeetingSDK"`

用法

您需要拥有 LGV_MeetingSDK_Protocol 的具体实现。 目前,只有一个:LGV_MeetingSDK_BMLT 类。 以下示例将使用该类。

实例化该类以及任何设置和/或参数(每个具体实现都有自己的规则),并调用 LGV_MeetingSDK_Protocol.meetingSearch(type:refinements:refCon:completion:) 方法。

首先,实例化 SDK

// We specify the worldwide TOMATO server, for this example.
guard let rootServerURL = URL(string: "https://tomato.bmltenabled.org/main_server") else { return }
let sdkInstance = LGV_MeetingSDK_BMLT(rootServerURL: rootServerURL)

然后,通过实例化 LGV_MeetingSDK_Meeting_Data_Set.SearchConstraints 的一个实例来指定搜索类型

// Search around Central Park, in New York City, for 10 meetings, at a maximum distance from the search center, of 20 Km.
let searchCenter = CLLocationCoordinate2D(latitude: 40.7812, longitude: -73.9665)
let searchType = LGV_MeetingSDK_Meeting_Data_Set.SearchConstraints(.autoRadius(centerLongLat: searchCenter,
                                                                               minimumNumberOfResults: 10,
                                                                               maxRadiusInMeters: 20000
                                                                               )
                                                                   )

您还可以指定各种搜索约束,例如是否查找在每周的某些天聚会的会议,您可以通过实例化 LGV_MeetingSDK_Meeting_Data_Set.Search_Refinements 的一个实例来指定

// Look for meetings on the weekend.
let searchRefinements = LGV_MeetingSDK_Meeting_Data_Set.Search_Refinements(.weekdays([.sunday, .saturday]))

最后,您需要有一个回调完成块,它被定义为 LGV_MeetingSDK_SearchInitiator_Protocol.MeetingSearchCallbackClosure

注意:这很可能在非主线程中被调用。

func completionBlock(_ inSearchResults: LGV_MeetingSDK_Meeting_Data_Set_Protocol?, _ inError: Error?) {
    if let error = inError {
        print("There was an error!\n\t\(error.localizedDescription)")
    } else if let searchResults = inSearchResults {
        print("These are the search results:\n\t\(searchResults.debugDescription)")
    } else {
        print("This should not happen! Nothing was returned!")
    }
}

然后,使用这些参数调用 LGV_MeetingSDK_Protocol.meetingSearch(type:refinements:refCon:completion:) 方法

sdkInstance.meetingSearch(type: searchType, refinements: searchRefinements, completion: completionBlock)

当然,因为这是 Swift,我们可以“快捷”一切,如下所示

guard let rootServerURL = URL(string: "https://tomato.bmltenabled.org/main_server") else { return }
LGV_MeetingSDK_BMLT(rootServerURL: rootServerURL)
    .meetingSearch(type: LGV_MeetingSDK_Meeting_Data_Set.SearchConstraints(.autoRadius(centerLongLat: searchCenter, minimumNumberOfResults: 10, maxRadiusInMeters: 20000)),
                   refinements: LGV_MeetingSDK_Meeting_Data_Set.Search_Refinements(.weekdays([.sunday, .saturday]))
                   ) { (_ inSearchResults: LGV_MeetingSDK_Meeting_Data_Set_Protocol?, _ inError: Error?) in
                         if let error = inError {
                            print("There was an error!\n\t\(error.localizedDescription)")
                         } else if let searchResults = inSearchResults {
                            print("These are the search results:\n\t\(searchResults.debugDescription)")
                         } else {
                            print("This should not happen! Nothing was returned!")
                         }
                     }

截至 2.1.0

findNextMeetingsSearch() 函数

我们引入了“查找我的下一次会议”搜索。 它的作用很像自动半径搜索,但是,我们不是简单地查找一般的会议,而是开始查找从现在开始到未来最多七天的会议,并返回可用的第一个(在时间和日期上优先,而不是位置优先)会议。

sdkInstance.findNextMeetingsSearch(centerLongLat: CLLocationCoordinate2D, minimumNumberOfResults: UInt, maxRadiusInMeters: CLLocationDistance, refinements: Set<LGV_MeetingSDK_Meeting_Data_Set.Search_Refinements>, refCon: Any?, completion: LGV_MeetingSDK_SearchInitiator_Protocol.MeetingSearchCallbackClosure)

我们仍然可以指定细化条件,例如工作日和时间范围。 该搜索需要一个搜索中心和一个可选的最大半径。

许可

该 SDK 以 MIT 许可的代码提供。

版权所有 2022 Little Green Viper Software Development LLC

特此授予任何获得本软件及相关文档文件(“软件”)副本的人员免费许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人员这样做,但须满足以下条件

上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。

本软件按“原样”提供,不附带任何形式的明示或暗示保证,包括但不限于适销性、适用于特定目的和不侵权的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他方面,因本软件或本软件的使用或其他交易引起的或与之相关的任何诉讼、侵权行为或其他责任。