Skip 开源:从“卖工具”到“卖信任”的豪赌 -- 肘子的 Swift 周报 #120
本期聚焦 Skip 全面开源,转换商业模式,其他内容涵盖 SwiftData 数据迁移、SwiftUI 架构、Swift 嵌入式进展、AI 客户端和 Agent 管理工具等。
看似一个平平无奇的周末,却让做AI Video Generator的开发者天塌了。
好消息:竞品家的都嘎了!
坏消息:自己家的也嘎了!
此次以Video关键词检索,共计21款相关产品。有单纯上架海外市场,也有全体地区分发。
所以集中下架的行为,不只是单纯的某些国家或地区。大概率是集中触发了苹果的查杀。(法国佬口音:我要验牌!)
在众多被标记了下架的产品中,随机抽选了2家APP。单纯从应用市场的截图入手。
从AppStore市场图,就能明显发现存在社交风格的市场截图,充斥着袒胸露乳的行为。基本上都带勾!
基本上随机抽查的产品中或多或少都存在此类问题。从应用截图就充斥着擦边行为!,莫非是社交类大佬集体转型?
为了更好的解释这种集中下架行为,特意在Developer审核指南,匹配对应内容审核的条款。
不出意外 1.1.4 - 公然宣传黄色或色情内容的材料 (这一概念的定义是:“对性器官或性活动的露骨描述或展示,目的在于刺激性快感,而非带来美学价值或触发情感”),其中包括一夜情约会 App 和其他可能包含色情内容或用于嫖娼或人口贩卖和剥削的 App。
当然,这种集中行为大概率苹果算法升级【或者通过鉴黄系统】,从AppStore净化入手,简单纯粹的一刀切!
遵守规则,方得长治久安,最后祝大家大吉大利,今晚过审!
附:更多文章欢迎关注同名公众号,By-iOS研究院。
借助AI能力分析。
mach_msg_header_t - Mach 消息头这是 Mach 消息的头部结构,用于在 macOS/iOS 的进程间(或线程间)传递消息。
typedef struct {
mach_msg_bits_t msgh_bits; // 消息标志位
mach_msg_size_t msgh_size; // 消息总大小(字节)
mach_port_t msgh_remote_port; // 目标端口(收信人)
mach_port_t msgh_local_port; // 本地端口(回信地址)
mach_port_name_t msgh_voucher_port; // 追踪端口(调试用)
mach_msg_id_t msgh_id; // 消息ID(自定义)
} mach_msg_header_t;
形象比喻(信封):
| 字段 | 对应信封上的 | 说明 |
|---|---|---|
msgh_remote_port |
收件人地址 | 消息发往哪个端口 |
msgh_local_port |
回信地址 | 如果需要回复,发到这里 |
msgh_size |
信件大小 | 包括信封和内容 |
msgh_bits |
邮寄方式 | 挂号信、平信等 |
msgh_id |
信件编号 | 用于区分不同类型的信 |
msgh_voucher_port |
追踪单号 | 用于追踪和调试 |
// 构造消息头
mach_msg_header_t header;
header.msgh_remote_port = rl->_wakeUpPort; // 发往唤醒端口
header.msgh_local_port = MACH_PORT_NULL; // 不需要回复
header.msgh_size = sizeof(mach_msg_header_t); // 只有头,无内容
header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
header.msgh_id = 0;
// 发送(唤醒 RunLoop)
mach_msg(&header, MACH_SEND_MSG, ...);
// 准备缓冲区
uint8_t buffer[3 * 1024];
mach_msg_header_t *msg = (mach_msg_header_t *)buffer;
msg->msgh_local_port = waitSet; // 在哪个端口等待
msg->msgh_size = sizeof(buffer); // 缓冲区大小
// 阻塞等待(线程休眠)
mach_msg(msg, MACH_RCV_MSG, ...);
// 被唤醒后,检查消息来源
if (msg->msgh_local_port == _wakeUpPort) {
// 手动唤醒
} else if (msg->msgh_local_port == _timerPort) {
// 定时器到期
}
mach_msg_header_t 是 Mach IPC 的核心:
完整消息结构:
┌──────────────────────┐
│ mach_msg_header_t │ ← 消息头(必需)
├──────────────────────┤
│ 消息体(可选) │ ← 实际数据
├──────────────────────┤
│ trailer(可选) │ ← 附加信息
└──────────────────────┘
RunLoop 的简化消息:只有头部,无消息体(称为 "trivial message"),足以唤醒线程。