普通视图

发现新文章,点击刷新页面。
昨天 — 2025年7月25日掘金 iOS

ABCenterConfig AB开关配置组件

2025年7月25日 17:56

概述

ABCenterConfig 是基于 Firebase Remote Config 的封装类,提供了远程配置的初始化、拉取激活及多类型读取接口,方便在 iOS 项目中统一管理远程参数。


主要组成

1. 枚举类型 RemoteConfigFetchAndActivateStatus

定义远程配置拉取与激活的状态:

状态 说明
successFetchedFromRemote 成功从远程获取并激活配置
successUsingPreFetchedData 使用预先拉取的本地缓存配置
error 拉取或激活过程中发生错误

2. 类 ABCenterConfig

单例实例

  • shared:全局单例访问点。

属性

  • remoteConfig:Firebase Remote Config 实例。

初始化

  • 私有构造函数 init(),调用 setUpConfig() 初始化 Remote Config。

公开方法

方法名 功能描述
setup() 公开初始化接口,预留额外初始化操作
fetchAndActivate(completionHandler:) 异步拉取并激活远程配置,带状态及错误回调
string(forKey:) 获取字符串类型的配置值
number(forKey:) 获取数字类型的配置值
data(forKey:) 获取 Data 类型的配置值
bool(forKey:) 获取布尔类型的配置值
jsonValue(forKey:) 获取 JSON 类型的配置值

私有方法

  • setUpConfig():配置 Remote Config 实例,设置最小拉取间隔及默认值。

使用示例

1. Pod 导入

pod 'ABCenterConfig'

2. 代码示例

import ABCenterConfig

// 获取单例
let config = ABCenterConfig.shared

// 初始化(可选)
config.setup()

// 拉取并激活远程配置
config.fetchAndActivate { status, error in
    switch status {
    case .successFetchedFromRemote:
        print("配置成功从远程拉取")
    case .successUsingPreFetchedData:
        print("使用预先拉取的本地配置")
    case .error:
        print("拉取配置出错:(error?.localizedDescription ?? "未知错误")")
    }
}

// 读取配置
let welcomeText = config.string(forKey: "welcome_message") ?? "默认欢迎语"
let maxCount = config.number(forKey: "max_count")?.intValue ?? 0
let isFeatureEnabled = config.bool(forKey: "feature_enabled")

结构流程图

classDiagram
    class ABCenterConfig {
        - RemoteConfig? remoteConfig
        + static shared: ABCenterConfig
        - init()
        + setup()
        - setUpConfig()
        + fetchAndActivate(completionHandler)
        + string(forKey)
        + number(forKey)
        + data(forKey)
        + bool(forKey)
        + jsonValue(forKey)
    }

    class RemoteConfigFetchAndActivateStatus {
        <<enum>>
        + successFetchedFromRemote
        + successUsingPreFetchedData
        + error
    }

    ABCenterConfig o-- RemoteConfig : uses
    ABCenterConfig ..> RemoteConfigFetchAndActivateStatus : returns status

仓库地址

GitHub

快来生成属于自己的emoji小人,【超详细教程】包含视频玩法

2025年7月25日 15:50

最近被玩疯了的emoji小人,你给自己整上了吗?

先来看看效果:

图片

如果你也想给自己安排上一套自己的emoji表情,那么接下来就跟着阿群一起来动手开工~

手机端操作

第一步 打开应用

下载RoboNeo

应用可以直接从安卓和iOS商城下载。

第二步 emoji贴纸头像

1.导入图片,输入对应需求(提示词)

对应提示词:

学习苹果 ios 系统表情风格,将照片中的人生成为此风格的 3D 贴纸头像。模仿形体、脸型、肤色、五官表情。服饰、配饰、表情、姿势保持一致。背景白底,只要完整人物,确保最终图像看起来像官方的 iOS 表情符号贴纸

2.等待生成

3.导出emoji贴纸

4.如果你想让小人动起来,这个时候只要跟它说动起来

它就吭哧吭哧的分析做视频

5.最后会生产衣蛾合起来的视频。当然它这边合起来的位置有些时候不符合你的心意,你可以导入到剪映中自己调整。

比如这个视频的位置就不好,就需要手动去剪映中操作!

第三步 醒图合成图片

1.导入原始照片作为背景

2.点击背景旁边的导入图片,导入emoji贴纸

3.点击emoji贴纸,智能抠图

4.调整到合适的位置,导出

恭喜你成功学完了手机版的emoji图片小人制作。

如果你对网页端感兴趣,可以接着把它学完~

网页端教程

第一步 进入官网

官网地址:www.roboneo.com/

第二步 导入图片

第三步 生成emoji贴纸导出

第四步 抠图

我这边用的是稿定设计

第五步 合成生成图片

动态视频

如果你想让你的视频动起来,直接跟他说动起来就可以了。

然后也会输出合成的视频

哎,在有些时候,emoji小人在视频中生成的位置不好的话。我们就需要自己手动合成。

但是不要害怕,这个也很简单。

咱们接着往下看,累了点一下关注!

剪辑合成视频教程

1.导入原始照片和视频

2.智能抠图

3.配音导出

真棒,学到这里你已经全部学完,接下来就是实操了。

期待大家的作业哦~

更多精彩推荐

数据分析必备的工具,用来佐证你的分析

AI也能做数据分析,那要怎么用呢?

什么是智能体?下半年各大行业比追的潮流

智能体开发者必看!补齐智能体创作最后一公里~

震惊!这是我见过最详细的微调模型教程——连我妈都学会了

Embedding竟是AI理解世界的密码?1分钟揭秘大模型如何"读懂"人类语言!

大公司都在用!大模型问答居然可以这样优化?RAG系统避坑指南

我保证!这是全网最简单的Dify部署指南!没有之一

企业知识库检索不准?这篇数据清洗攻略请收好!新手友好

2025 年了,是否该全面拥抱 Swift 6?

作者 iOS新知
2025年7月25日 14:20

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

随着苹果公司去年发布 Xcode 16,Swift 6 编译器也随之推出。我们在之前也写过一些介绍的文章。

Swift 6 正式发布:从应用到嵌入式,Swift 的新征程!

Swift 6 新特性(一):count(where:) 方法带来的从复杂到简洁变化

这意味着我们可以利用 Swift 6 及其编译时数据竞态保护来创建新项目。但对于许多开发者而言,最大的疑问是:2025 年是否可以全面使用 Swift 6?还是应当继续使用 Swift 5?

在这篇博客中,我不会给出确切的答案,而是分享我的见解和思考,以帮助你决定是否适合在你的项目中采用 Swift 6。这一决定取决于诸多考量,比如如你的项目类型、团队情况以及你对 Swift Concurrency(并发特性)的理解程度。

Xcode 16、现有项目和 Swift 6

如果你在 Xcode 16 中打开一个现有项目,可能不会注意到任何变化。虽然 Xcode 16 默认对所有新项目使用 Swift 6 编译器,但对于老项目,默认依然是 Swift 5 语言模式。

Swift 6 编译器兼容 Swift 5 模式,使其在不强制执行 Swift 6 严格规则的情况下正常运行。

比如,在 Swift 5 语言下,编译时数据竞态保护功能是关闭的。

因此,当我们讨论是否使用 Swift 6 时,我们实际上是在谈论是否选择 Swift 6 语言模式。在 Xcode 16 中打开的老项目会自动使用 Swift 5 语言模式,这就是为什么老项目依然可以编译成功的原因。

新项目的情况

在 Xcode 16 中创建的新项目也默认采用 Swift 5 语言模式。然而,通过 Swift 6 工具链创建的Swift 包 默认使用的是 Swift 6 语言模式,除非被明确配置为其他方式。这一区别非常重要,因为创建新包时,它们的语言模式不同于项目(这是完全可行的做法)。

如果你想要为你的项目开启 Xcode 16 中的并发警告,可以前往 Build Settings,在搜索栏中键入 Strict Concurrency,然后将其改为 Complete:

image.png

当你使用 SPM 创建自定义的包时也可以开启严格并发,只需要在 swiftSettings 中加上 enableExperimentalFeature("StrictConcurrency"):

let packagePackage(
    name"AppCore",
    platforms: [.iOS(.v17)],
    products: [
        .library(
            name"AppCore",
            targets: ["AppCore"]),
    ],
    targets: [
        .target(
            name"AppCore",
            swiftSettings: [
                .enableExperimentalFeature("StrictConcurrency")
            ]
        )
    ]
)

全面使用 Swift 6 的问题和挑战

切换到 Swift 6 语言模式可能会导致原本使用 Swift 5 没有报错的项目编译直接报错,或者运行时崩溃。比如,你可能会遇到关于捕获非可发送参数、可发送闭包和 actor 隔离的问题。

一些问题的修复相对简单,比如将不可变对象明确标记为可发送,或将异步函数中使用的对象重构为 actor。但其他的问题,尤其是涉及跨隔离边界的情况,可能会更加棘手。

比如,为了解决可发送性(sendability)错误而添加 actor 往往需要将同步代码重构为异步代码,这会在整个代码库中产生连锁反应。即使是与 actor 的简单交互也需要 await,即使对于非异步函数也一样,因为 actor 在其独立的隔离上下文(isolation contexts)中执行。

使用 @MainActor 解决错误

常见的解决办法是大量使用 @MainActor 注解。虽然这通过将大部分代码强制运行在主线程上减少了并发相关错误,但并不总是合适的解决方案。这算是一种比较粗暴的解决方案,应谨慎使用。

所以,我们是否应该全面使用 Swift 6?

对于现有项目,我建议谨慎一点。依然使用 Swift 5,除非下边两种情况:

  1. 你的项目比较小且易于迁移。

  2. 你对并发概念有较强理解,并有比较多的时间来做适配。

因为 swift 6 是 swift 语言的趋势和未来,与其逃避不如主动去适应,所以对于新项目,可以从一开始就使用 Swift 6 语言模式,但需要做好心理准备,尤其是与那些还没有完全支持并发的苹果框架交互时。

如果你已经开始全面使用 Swift 6 了,我非常想听听你的经验!可以在下边留言分享。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

❌
❌