表现为模糊音勾上后 在返回去看 勾都被取消了
只好装 gboard 代替了
]]>ios26 正式版发布了,前几天已经升级,个人感觉比刚开始的版本还是流畅一点,但是卡顿掉帧,进入桌面图标空白等性能问题依然存在,特别是肉眼可见的掉帧。不知道当初喷我的人有没有同感。当时我的看法如下,我觉得升级到正式版之后依旧成立
我反对的是为了过度(且效果并不好)的 ui 动画消耗太多硬件资源,导致系统卡顿。这大概率不会因为 public beta 或者正式版就完全解决。在我看来这种做法或者趋势本身就是有问题的。
今天不骂苹果了,上次被喷惨了怕了。但是苹果的阳谋是成功的,现在在犹豫要不年年焕新换一个 17 或者 17pro ,应该不会这么卡了吧...
]]>据 ios18 以来的经验,此开关会在某些系统更新后被重置。当 v 站又上下滑动卡卡的就要去看看是否被重置了
]]>网上开启教程很少,折腾了半天才发现需要更改机器语言和 Siri 语言到英语,当然 ai 是必须要打开的,开启新的 workout 就出现提示了
今天兴冲冲的准备跑步试试这个 feature ,结果 apple watch 提示我“需要连接 iPhone 才能使用”…虽然我懂这个是基于 ai 的需要手机算力,但是谁户外跑步带手机啊。可能更适合跑步机吧,但是跑步机也不需要它鼓励我吧。
]]>试了下切换“显示与亮度”里的“浅色”、“深色”模式也不行,不管哪种模式,字体都是黑色。
问了 AI ,Google 了一遍,也没解决办法以及相似的问题。
]]>ios26 又流畅顺滑,又不费电
我估计是 UI 代码彻底重构了的原因
UI 屎山代码从 ios7 到 ios18 多少年了,越来越卡。
ios26 终于彻底重构了,感恩产品经理
]]>最近几个月一直在不停地弹通知,叫我同意和云上贵州相关的协议。但是不同意也能正常使用,网页端检查了 https://account.apple.com/account/manage/section/information 确认自己不在国区,看了 https://www.icloud.com/ 也找不到云上贵州字样。
手机为美版,账号为台区。
]]>作为一名 iOS 开发者,我一直被两个问题困扰:重复的网络请求浪费资源,缓存策略难以精确控制。最近两个月,我决定用 AI 辅助编程的方式来彻底解决这些问题,最终开发出了一个名为Monstra的 Swift 性能框架。
整个过程让我重新思考了"编程"这个概念,也让我对 AI 协作开发有了全新的认识。今天想分享一下这次 AI 辅助开发的完整经历,包括遇到的坑、解决方案,以及一些意外的收获。
相信很多 iOS 开发者都遇到过这种情况:
// 场景:多个 ViewController 同时需要用户数据 class UserProfileViewController { func viewDidLoad() { API.fetchUserProfile { result in // 处理结果 } } } class SettingsViewController { func viewDidLoad() { API.fetchUserProfile { result in // 重复请求! // 处理结果 } } } class NotificationViewController { func viewDidLoad() { API.fetchUserProfile { result in // 又一个重复请求! // 处理结果 } } }
结果:3 个页面同时加载,发出 3 个完全相同的网络请求。浪费流量,增加服务器负担,用户体验还差。
iOS 开发中的缓存问题同样让人头疼:
面对这些痛点,我决定开发一个专门的框架来彻底解决这些问题。但这次,我想尝试一种全新的开发模式:AI 辅助编程。
经过思考,我制定了一个明确的分工策略:
这样分工的好处是:我专注于最需要创造性思维的部分,AI 帮我处理那些重复性、规范性的工作。
基于对问题的分析,我设计了两个核心组件:
// 创建一个处理用户资料获取的任务 let userProfileTask = MonoTask<UserProfile>( resultExpireDuration: 300.0 // 5 分钟缓存 ) { callback in // 实际的网络请求逻辑 API.fetchUserProfile { result in callback(result) } } // 多个地方同时调用,只会执行一次网络请求 Task { let profile1 = await userProfileTask.asyncExecute() // 发起网络请求 let profile2 = await userProfileTask.asyncExecute() // 返回缓存结果 let profile3 = await userProfileTask.asyncExecute() // 返回缓存结果 }
// 批量获取用户帖子,自动合并重复 ID let postManager = KVLightTasksManager<String, Post>( config: .init( dataProvider: .asyncMultiprovide(maximumBatchCount: 10) { postIDs in return try await API.fetchPosts(ids: postIDs) } ) ) // 三个 ViewModel 请求重叠的帖子 ID ,自动批处理 postManager.fetch(keys: ["101", "102", "103"]) { id, result in // 处理单个帖子结果 }
// 大文件下载,支持进度跟踪和取消 let downloadManager = KVHeavyTasksManager<URL, Data, Progress, CustomProvider>( config: .init( maxNumberOfRunningTasks: 2, // 最多同时 2 个下载 maxNumberOfQueueingTasks: 64 ) ) // 多个下载请求,自动队列管理 downloadManager.fetch( key: fileURL, customEventObserver: { progress in print("下载进度: \(progress.fractionCompleted)") }, result: { result in // 处理下载结果 } )
let cache = MemoryCache<String, UIImage>( configuration: .init( // 内存限制 memoryUsageLimitation: .init(capacity: 1000, memory: 500), // 500MB // TTL 配置 defaultTTL: 3600.0, // 正常数据 1 小时过期 defaultTTLForNullElement: 300.0, // 空值 5 分钟过期 // 雪崩保护:随机化过期时间 ttlRandomizationRange: 60.0, // ±60 秒随机 // 内存成本计算 costProvider: { image in guard let cgImage = image.cgImage else { return 0 } return cgImage.bytesPerRow * cgImage.height } ) ) // 优先级缓存 cache.set(element: profileImage, for: "user-123", priority: 10.0) // 高优先级 cache.set(element: thumbnail, for: "thumb-456", priority: 1.0) // 低优先级 cache.set(element: nil, for: "missing-789") // 缓存"未找到" // 智能获取 switch cache.getElement(for: "user-123") { case .hitNonNullElement(let image): // 找到有效图片 displayImage(image) case .hitNullElement: // 找到"未找到"记录 showPlaceholder() case .miss: // 缓存未命中 loadImageFromNetwork() case .invalidKey: // 键值验证失败 handleInvalidKey() }
使用 Cursor 进行 AI 辅助开发最大的感受是:AI 比我想象的更"理解"代码。
当我写完核心逻辑后,Cursor 会提出改进建议:
我的原始代码:
func removeExpiredElements() { for key in keys { if isExpired(key) { remove(key) } } }
Cursor 的优化建议:
func removeExpiredElements() -> Int { let keysToRemove = keys.filter { isExpired($0) } keysToRemove.forEach { remove($0) } return keysToRemove.count // 返回清理数量,便于监控 }
这种优化不仅提高了性能,还增加了实用功能,完全是我没想到的角度。
最让我惊讶的是 AI 生成的单元测试。我只写了基本的功能测试,但 AI 补充的测试用例覆盖了很多我忽略的边界情况:
// AI 生成的边界测试 func testConcurrentAccessWithSameKey() { // 测试多线程同时访问同一个 key } func testMemoryPressureEviction() { // 测试内存压力下的驱逐策略 } func testTTLRandomizationPreventsStampede() { // 测试 TTL 随机化防止缓存雪崩 } func testNullValueCaching() { // 测试空值缓存的各种场景 }
在开发过程中,我尝试了多个 AI 模型,发现它们确实有不同的"专长":
经过两周的深度协作,我总结出几个关键的协作技巧:
❌ 模糊的描述:
"我写了一个缓存, 帮我 review 一下"
✅ 精确的描述:
"我写了一个线程安全的内存缓存,支持 TTL 过期,优先级 LRU 淘汰策略,能够缓存 nil 值,防止缓存雪崩,并且可以设置内存使用上限, 请帮我 review 一下代码逻辑正确性 public API 的规范性以及合理性"
不要指望 AI 一次性生成完美代码,而是通过多轮对话逐步优化:
第 1 轮:实现基本功能 第 2 轮:添加异常处理 第 3 轮:优化性能 第 4 轮:完善文档 第 5 轮:添加单元测试
对于关键代码,我会让不同的 AI 模型都 review 一遍,综合它们的建议:
为了验证框架的实用性,我开发了 5 个真实场景的示例:
// 应用启动时的配置加载,支持重试和永久缓存 let cOnfigManager= AppConfigurationManager() configManager.initializeModule { result in switch result { case .success: print("配置加载成功") case .failure(let error): print("配置加载失败: \(error)") } }
// 单用户资料管理,支持 TTL 刷新和强制更新 let profileManager = UserProfileManager() profileManager.setUser(firstName: "Alice") { result in // 设置完成后自动刷新缓存 }
// 三个 ViewModel 同时请求重叠的帖子 ID ,自动批处理 let repository = PostRepository() repository.getPostsBatch(ids: ["101", "102", "103"]) { results in // 批量处理结果 }
// Alamofire + AFNetworking 双 Provider 支持,断点续传 let downloadManager = AlamofireManager(config: .init()) let result = await downloadManager.asyncFetch( key: fileURL, customEventObserver: { progress in updateProgressBar(progress.fractionCompleted) } )
// ZIPFoundation 集成,进度跟踪 let unzipManager = UnzipManager(config: .init()) unzipManager.fetch( key: zipFileURL, customEventObserver: { event in switch event { case .progress(let percent): print("解压进度: \(percent * 100)%") } } )
// 10 个并发请求测试 let startTime = CFAbsoluteTimeGetCurrent() await withTaskGroup(of: Void.self) { group in for i in 0..<10 { group.addTask { let result = await userTask.asyncExecute() print("Task \(i) completed: \(result)") } } } let duration = CFAbsoluteTimeGetCurrent() - startTime print("总耗时: \(duration)s, 网络请求次数: 1")
结果:10 个并发请求,只发出 1 个网络请求,所有回调都收到相同结果。
// 缓存命中率测试 let cache = MemoryCache<String, Data>(capacity: 1000) // 写入 10000 个条目 for i in 0..<10000 { cache.set(element: randomData(), for: "key\(i)") } // 随机访问测试 var hitCount = 0 for _ in 0..<1000 { let key = "key\(Int.random(in: 0..<10000))" if case .hitNOnNullElement= cache.getElement(for: key) { hitCount += 1 } } print("缓存命中率: \(Double(hitCount) / 1000.0)")
通过这次深度的 AI 协作开发经历,我对程序员这个职业有了新的思考:
我认为未来的编程将是**"人机协作"**模式:
程序员 = 产品经理 + 架构师 + 质量把控者 AI = 编码助手 + 测试工程师 + 文档工程师
程序员的价值将更多体现在创造性思维和判断决策上,而不是纯粹的编码技能。
这个项目现在已经在 GitHub 开源:**github.com/yangchenlarkin/Monstra**
Swift Package Manager:
dependencies: [ .package(url: "https://github.com/yangchenlarkin/Monstra.git", from: "0.1.0") ]
CocoaPods:
pod 'Monstra', '~> 0.1.0'
这次 AI 辅助开发的经历让我深刻体会到:AI 不是要取代程序员,而是要让程序员变得更强大。
通过合理的分工协作,我们可以:
如果你还没有开始尝试 AI 辅助编程,我强烈建议你现在就开始。这不仅仅是一个工具,更是编程思维的升级。
Examples/
目录包含 5 个完整示例关于作者:iOS 开发工程师,专注于移动端性能优化和架构设计。这是我第一次深度尝试 AI 辅助开发,也是第一个开源项目。如果这个项目对你有帮助,欢迎在 GitHub 上给个⭐️,也欢迎提出改进建议!
如果你有任何问题或想要交流 AI 辅助开发的经验,欢迎在评论区讨论,或者在 GitHub 上提 Issue 。让我们一起探索编程的未来!
上面的内容都是 Cursor 写的(甩锅 ing), 我这里补充几点:
岗位要求: ===================== 1 、5 年以上 iOS APP 开发经验,计算机相关专业本科以上学历。 2 、熟悉 iOS App 开发技术,熟练使用 iOS 开发工具及测试工具。 3 、系统掌握网络、多线编程等基础知识。 4 、精通 Objective-C/Swift 开发经验或有 Flutter 开发项目经验。 5 、积极乐观,责任心强,做事认真细致,有良好的团队沟通协作能力。 6 、热爱移动产品研发,学习能力强,有较强的好奇心、求知欲和进取心,能关注和学习行业内最新的移动开发技术。 7 、熟悉 App Store 上架规则,懂混淆技术,有解决 4.3 上架 App Store 产品者优先。 有意者请发简历到 hr.celeste.seamobi@gmail.com 谢谢
]]>最近这个崩溃出现概率很高,有大佬们遇到过吗。版本主要集中在 iOS 18 。有大佬解决过吗,求助哇。
]]>如果是因为“更好看”或者“显得高级”,那 iOS 自带的相册、App Store 、设置这些系统应用,其实大量界面也都是原生控件。像个人中心、设置列表这类界面,用原生控件看起来并不会显得 low 或者不高级。
大家觉得,一般 APP 更少用原生控件的主要原因是什么?
]]>全流程帮内推,跟进进度,有意向可以加我好友发简历。
Base 杭州 西湖区黄龙国际中心
薪资 20-40k ,16 薪,双休六险一金,12%公积金,1-5 年经验,基本不加班,福利待遇好对标大厂。
iOS 最好有 swift 经验 有大厂经验最好,没有大厂经验学历一定要卡 985/头部 211
欢迎大佬们 wx:Laplan_d
要求如下:
IOS:
负责 iOS 平台应用/游戏研发: 负责软件质量,修正 Bug ,提出优化方案并实施 : 负责设计和完善产品技术架构; 负责跟进移动平台终端技术,了解相关行业的行业动态,并推进在产品中的应用: 负责调研竞品技术方案,参与产品方向讨论。 任职要求
计算机或相关专业全日制本科以上学历,2 年以上 iOS 开发经验; 熟悉 iOS 平台特性,熟练使用常见第三方库: 有良好的编码习惯,能够熟练的使用 OC 、Swift 语言; 具备扎实的面向对象思想、对常见设计模式有深入了解; 有网络开发经验;熟悉多线程,数据库 对软件性能优化有一定的经验: 具备较强的设计能力、沟通能力: 英语良好,具有一定的英文文档阅读能力
]]>切一下后台再回去声音能正常 1 秒钟,接着又变成像是只从底部扬声器出声的效果,玩游戏听的很难受
有没与同样遇到这个问题的
]]>国行版 美版 都有这个现象
我非常明确 我是关闭“欺骗性网站警告”的开关
不知道过了几个月 不知道什么时候 一看设置又自动打开了
不确定是不是与苹果升级 ios 有关
有遇到这样的情况吗
]]>为此,我上班摸鱼写了一个 加密中转服务( Go 自托管 / Cloudflare Worker 两种版本)来代替米家 App 完成签名、Cookie 注入。快捷指令只需向中转服务发送一段 JSON ,就能在后台控制米家,包括设备控制和场景触发。
/login/qrcode
,用米家 App 扫码,获得userId / ssecurity (securityToken) / deviceId / serviceToken
四个关键参数。 https://api.io.mi.com
。 示例请求体:
{ "userId": "123456789", "serviceToken": "xxx", "deviceId": "abc123", "securityToken": "Q0eQ7tKq...", // 即 ssecurity "data": { "did": "xxx", "method": "set_props", "params": [ ["power", 1] ] } }
因此直接填写 GCJ-02 坐标会出现数百米偏差,导致自动化难以触发。
解决办法:先用快捷指令读取 GCJ-02 → 在线或本地转换为 WGS-84 ,再把转换后的坐标写到自动化里。
我做了一个快捷指令转换示例:https://www.icloud.com/shortcuts/5161a59573f248399e58a8584eb93468
https://gist.github.com/Zayrick/62701850c833c4051356268fa9afc3ff 其中包含一个 sever.go ( Go 版本)和 worker.js ( Cloudflare Worker 版本)
部署详情参照 gist 中的 README.md
风险 | 说明 |
---|---|
账号安全 | 扫码登录使用真实米家账号,存在被封或 Cookie 泄露风险 |
网络安全 | 中转服务需走 HTTPS ,防止中间人窃听;同时禁止公网暴露调试接口 |
设备权限 | serviceToken/ssecurity 拥有完整设备控制权限,请加密存储 |
隐私泄露 | 服务器可访问全部家庭与设备信息,建议专号 + 内网部署 |
操作 | 请求方式 |
---|---|
读取设备属性 | POST https://api.io.mi.com/app/miotspec/prop/get |
设置设备属性 | POST https://api.io.mi.com/app/miotspec/prop/set |
执行动作 | POST https://api.io.mi.com/app/miotspec/action |
获取设备列表 | POST https://api.io.mi.com/app/home/home_device_list |
获取家庭列表 | POST https://api.io.mi.com/app/v2/homeroom/gethome_merged |
获取场景列表 | POST https://api.io.mi.com/app/appgateway/miot/appsceneservice/AppSceneService/GetSceneList |
💡 设备控制 API 查这里:https://home.miot-spec.com
免责声明:自己玩可以,别滥用,风险自负 🫡
]]>