AppContainer

这个库允许你使用单个应用程序创建和管理多个环境,就像你正在交换容器一样。

当你想在暂存应用程序中测试多个账户时,这非常有用。

Github issues Github forks Github stars Github top language

语言切换: 日本語.

概念

通常,一个应用程序对应一个环境(目录、UserDefaults、Cookies、Cache,...)。为了调试或处理多个账户而拥有多个环境,必须安装多个相同的应用程序(使用不同的 bundle ID)。在调试中,可能存在通过反复登录和注销来检查账户的情况。
因此,我们认为可以在同一个应用程序内创建多个环境并轻松地在它们之间切换。 这就是我们创建名为 AppContainer 的这个库的原因。

演示

默认 调试1
Default Debug1
选择容器 容器列表 容器信息
Select List Info

文档

AppGroup

extension AppContainer {
    static let group = .init(groupIdentifier: "YOUR APP GROUP IDENTIFIER")
}

方法

创建新容器

let container = try AppContainer.standard.createNewContainer(name: "Debug1")

获取容器列表

原始容器名为 DEFAULT,UUID 为 00000000-0000-0000-0000-0000-0000-0000000000000000。 你可以使用 isDefault 属性来检查它。

let containers: [Container] = AppContainer.standard.containers

获取活动容器

let activeContainer: Container? = AppContainer.standard.activeContainer

激活容器

建议在调用此方法后重启应用程序。

try AppContainer.standard.activate(container: container)
try AppContainer.standard.activateContainer(uuid: uuid)

删除容器

如果要删除的容器正在使用中,请在删除之前激活默认容器。

try AppContainer.standard.delete(container: container)
try AppContainer.standard.deleteContainer(uuid: uuid)

清理容器

try AppContainer.standard.clean(container: container)
try AppContainer.standard.cleanContainer(uuid: uuid)

重置

恢复到使用此库之前的状态。 具体来说,将启用 DEFAULT 容器,并删除所有其他 AppContainer 相关的文件。

try AppContainer.standard.reset()

通知

您可以在切换容器时接收通知。 如果您想在切换之前和之后添加严格执行的额外处理,请使用如下所述的委托。

委托

委托可用于在切换容器时添加可选的处理。 这些操作按以下顺序执行。

// the `activate` method is called

// ↓↓↓↓↓↓↓↓↓↓


func appContainer(_ appContainer: AppContainer, willChangeTo toContainer: Container, from fromContainer: Container?) // Delegate(before container switch)

// ↓↓↓↓↓↓↓↓↓↓

// Container switching process (library)

// ↓↓↓↓↓↓↓↓↓↓

func appContainer(_ appContainer: AppContainer, didChangeTo toContainer: Container, from fromContainer: Container?) // Delegate (after container switch)

此库允许设置多个委托。 添加以下内容。

AppContainer.standard.delegates.add(self) // if self is AppContainerDelegate compliant

它以弱引用方式持有,并在对象释放时自动释放。 如果你想取消设置委托,请编写以下内容。

AppContainer.standard.delegates.remove(self) // if self conforms to AppContainerDelegate

设置切换容器时不要移动的文件

切换容器时,除了某些系统文件外,几乎所有文件都会被保存并恢复到容器目录。 您可以设置要从这些移动中排除的文件。

例如,以下是您想在所有容器中通用使用 UserDefault 的情况示例。 此文件在切换容器时不会被保存或恢复。

appcontainer.customExcludeFiles = [
    "Library/Preferences/<Bundle Identifier>.plist"
]

所有以 customExcludeFiles 内容结尾的文件路径都将从移动中排除。 例如,以下配置将排除所有目录下名为 XXX.yy 的文件。

appcontainer.customExcludeFiles = [
    "XXX.yy"
]

AppContainerUI

提供用于 AppContainer 的 UI。 支持 SwiftUI 和 UIKit。

SwiftUI

import AppContainerUI

// show Container List
ContainerListView(appContainer: .standard, title: String = "Containers")

// container info view
ContainerInfoView(appContainer: .standard, container: container)

UIKit

import AppContainerUI

// show Container List
ContainerListViewController(appContainer: .standard, title: String = "Containers")

// container info view
ContainerInfoViewController(appContainer: .standard, container: container)

许可证

MIT 许可证