T21EnvironmentSwift 2.0.1

T21EnvironmentSwift 2.0.1

Marcos MoleroSalvador Martin 维护。



 
依赖
T21Notifier~> 2.0.2
T21LoggerSwift~> 2.0.0
 

  • Eloi Guzman Ceron

T21Environment

处理部署相关问题的辅助方法。

Carthage compatible CocoaPods compatible Swift compatible Platform compatible License

这个类提供处理与 app 部署相关问题的辅助方法,例如构建配置依赖变量以及语言运行时管理支持。

iOS 原生管理应用语言,但这个类提供了在应用内部(在运行时)更改语言的可能性,设置不同于当前操作系统的语言。众所周知,这不是标准方法,但我们发现有一些客户有这种需求。

入门

以下说明将帮助您在本地计算机上创建项目的副本,以便用于开发和测试。

安装

T21Environment 可通过 CarthageCocoaPods 使用。

Carthage

使用 Carthage 安装 T21Environment,请向您的 Cartfile 添加以下行。

github "worldline-spain/T21EnvironmentSwift"

然后运行carthage update --no-use-binaries命令或简onClick:=run carthage update 命令。有关Carthage的安装和使用详细信息,请访问其项目页面

CocoaPods

要使用CocoaPods安装T21Environment,请将以下行添加到您的Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0' 
use_frameworks!

pod 'T21EnvironmentSwift'

然后运行pod install命令。有关CocoaPods的安装和使用详细信息,请访问其官方网站

如何使用

配置您的项目

为了加载构建配置依赖的变量,您需要在项目info.plist中添加以下条目

  • 配置 : ${CONFIGURATION} (字符串类型)

添加了这一行后,T21Environment类将能够检索编译应用程序时使用的当前构建配置。

加载环境信息

为了添加新的构建配置依赖变量或支持的新语言,使用一个Dictionary提供所需信息。

所需格式如下

  • 根对象
    • "languages" (数组)
      • es (字符串)
      • ca (字符串)
      • en (字符串)
      • ...
    • "configurations" (字典)
      • "Release" (字典)
        • 环境变量名称 1 (var : value)
        • 环境变量名称 2 (var : value)
      • "Debug" (字典)
        • 环境变量名称 1 (var : value)
        • 环境变量名称 2 (var : value)
      • ...

语言指定如下:使用:ISO 639-1:双字母代码。

JSON格式

配置环境的一个简单方法是用一个遵循所需格式的JSON文件,即environments.json

{
	"languages": ["en","es","ca"],
	"configurations": {
		"appstore" : {
			"base_url" : "www.app.com/appstore"
		},
		"Debug" : {
			"base_url" : "www.app.com/devel"
		},
		"pro" : {
			"base_url" : "www.app.com/pro"
		},
		"test" : {
			"base_url" : "www.app.com/test"
		},
		"Release" : {
			"base_url" : "www.app.com/uat"
		}
	}
}

上一个例子使用了3种不同的语言

  • 英语(en)
  • 西班牙语(es)
  • 加泰罗尼亚语(ca)

还有根据构建配置变化的 base_url 变量。

使用方法

初始化 T21Environment 类

首先我们需要创建 T21Environment 类。构造函数接收一个 Dictionary 类型的参数,在这种情况下是从 environments.json 文件中加载的。

let environmentsFilePath = Bundle.main.path(forResource: "environments", ofType: "json")

if let path = environmentsFilePath {
	let url = URL(fileURLWithPath: path)
	do {
		let jsonData = try Data(contentsOf: url)
		let j = try JSONSerialization.jsonObject(with: jsonData, options: [])
		if let json = j as? Dictionary<String,Any> {
			environment = T21Environment(json)
		} else {
			// manage error
		}
	} catch {
		// manage error
	}
}

查询环境变量

假设我们正在使用之前的 JSON 文件。要获取 base_url 值,就像这样做。

let baseURL: String? = environment.configuration()["base_url"] as? String

当然,你可以省略可选内容或创建一个外观类,这取决于你。

let baseURL = environment.configuration()["base_url"] as! String

管理语言

当 T21Environment 类初始化时,它会获取设备的偏好语言并尝试使用它,如果可用(它会检查语言数组)。如果一切配置正确,使用语言就像这样。

// Assume our iOS Device is using spanish language.

var helloString = environment.localizedString("hello") // helloString -> "Hola"

environment.setAppLanguage("en") // switch to english language

helloString = environment.localizedString("hello") // helloString -> "Hello"

语言会自动保存,所以下次应用启动时会使用上次使用的语言。

为了提供字符串本地化,必须创建并添加 strings 文件作为目标包资源。在前面的示例中,我们需要两个文件

EN.strings

"hello" = "Hello";
"good_morning" = "Good morning!"
"goodbye" = "Goodbye"

ES.strings

"hello" = "Hola";
"good_morning" = "Buenos días!"
"goodbye" = "Adiós"

语言变更通知

客户端可以订阅语言变更通知。当更新 UI 以响应接收到的新的语言时,非常实用。

public protocol T21EnvironmentNotifications : class {
	func languageUpdated( _ language: String)
}

public func addEnvironmentObserver( _ observer: T21EnvironmentNotifications)
public func removeEnvironmentObserver( _ observer: T21EnvironmentNotifications)

观察者存储为 弱引用,因此无需在释放时取消订阅。

有用提示

全局实例

**T21Environment** 类不是单例类。为了提供一种方便的从任何类访问环境实例的方式,您可以创建一个单例类或一个静态变量来持有 **T21Environment** 实例。

加密和解密 **environments.json** 文件

在每一个应用中都必须考虑安全性,加密 **environments.json** 是确保与应用相关的环境信息不被任何检查应用内容的人轻易获取的一种简单方法。一个可能的解决方案是在构建阶段使用第三方库加密 json 文件,然后在应用运行时对其进行解密。

在一些私有项目中我们使用了以下工具: RNCryptor。我们创建了一个 简单的命令行可执行文件,它使用 RNCryptor 库,这样我们就可以在 XCode 构建阶段(执行一个 shell 脚本)中使用它。然后在代码中,生成了一个加密的 environments.bin 文件,并使用它。可执行程序项目不属于这个库。

前一图显示了使用的密码 XXXXXXXXXX,输入文件 environments.json 和输出文件 environments.bin

在代码中,我们有

let path = Bundle.main.path(forResource: "environments", ofType: "bin")!
let url = URL(fileURLWithPath: path)
let data = try Data(contentsOf: url)
let decryptor = RNCryptor.DecryptorV3(password: "XXXXXXXXXX")
let jsonData = try decryptor.decrypt(data: data)
let json = try JSONSerialization.jsonObject(with: jsonData, options: [])

使用

  • T21Notifier - 强制观察者实现具体的协议的 customize NotificationCenter,有利于在通知接收器中增加一些秩序。
  • T21Logger - 为 SwiftyBeaver 公开第三方日志库包的封装类。

作者

  • Eloi Guzman Ceron - 初始工作
  • Edwin Peña - 初始工作
  • 萨尔瓦多·马丁 - 初始工作
  • 帕特里西娅·德·拉·里卡 - 卡提加集成
  • 马科斯·莫莱罗 - 卡提加集成

参阅参与此项目的贡献者列表

许可协议

本项目的许可协议为MIT许可 - 有关详情请参阅LICENSE.md文件。

致谢

  • 致世界在线iOS开发团队。