如何开发一个 Safari 插件
背景由于常用浏览器是Safari,而 Safari 浏览器的插件比不上 Chrome,所以就有了自己开发常用的 Safari 插件的想法。 打算开发当前页面生成二维码的 Extension,因为网络原因,AirDrop 有时候搜不到手机,所以有了这个需求,而且打算这个也比较简单,所以从这个开始。 调研苹果的官方文档safari_web_extensions给出了步骤,看了好几遍,还是不知道如何下手。虽然新建项目的时候苹果帮忙把框架已经都建好了,但是还是有疑惑,疑惑的点在于: 主APP的作用是什么? Extension的作用是什么? 代码应该写在哪里? manifest.json支持的配置项有哪些,哪里可以看到,应该设置哪些? content.js、background.js分别是干什么用的,什么时候用? popup.html、popup.css、popup.js 又是指的哪部分? content.js、background.js、popup.js中操作 tab 的方法有哪些?哪里可以看到? 这些疑惑一度导致开发计划搁浅,因为没有文章来解释这些问题。于是转而去 Githu...
iOS16.4 Webview 不能用Safari调试
背景Xcode 升级到 14.3后,模拟器是iOS 16.4 的,想通过Safari -> Developer -> Web Inspector查看,结果发现查看不了 修改一开始以为是设置 Safari 中 Advanced没开启,去查看后,发现开关已开启。 搜索后发现,从 iOS16.4 之后,如果想要通过Web Inspector查看,需要设置如下代码: 12345if #available(iOS 16.4, *) { webView.isInspectable = true} else { // Fallback on earlier versions} 设置之后,重新运行,再通过 Safari 查看,就可以看到了。 参考 Mark the webview as inspectable in iOS 16.4
Xcode 创建项目默认文案修改
背景最近需要修改Xcode创建项目默认文案修改,就是每次创建最上面默认生成的注释说明。想起来之前看原Raywenderlich(现在是Kodeco)网站下载的代码时,每个已存在的文件里都有一长串自定义的说明,而且新建文件的时候也是带有同样的自定义的说明,有过疑惑,但是没有仔细研究,今天研究下怎么实现的: Kodeco文件自定义的说明如下: 实现通过Customize text macros和Text macros reference 可以看出,Xcode默认头部文字注释默认定义如下: 12345678// ___FILENAME___// ___PACKAGENAME___//// Created by ___FULLUSERNAME___ on ___DATE___.// ___COPYRIGHT___// 然后参考Customizing the file header comment and other text macros in Xcode 9 可以确定修改的步骤是: 创建IDETemplateMacros.plist 添加或修改Root对应的type为...
Xcode 14.3 Archive 失败
背景由于手机升级了iOS 16.4,想要真机调试,Xcode 也要升级到 14.3, 于是就升级了一下。 升级Xcode 14.3之前,Debug 和 Archive 都没问题;升级 Xcode 14.3之后,Debug 没问题,Archive 就报错。错误信息如下: 123456789building file list ... rsync: link_stat "/Users/xxx/.../AFNetworking.framework" failed: No such file or directory (2)donesent 29 bytes received 20 bytes 98.00 bytes/sectotal size is 0 speedup is 0.00rsync error: some files could not be transferred (code 23) at /AppleInternal/Library/BuildRoots/9e200cfa-7d96-11ed-886f-a23c4f261b56/Librar...
导出iPhone所有短信到Excel
导出iPhone所有短信到Excel打算找一些短信,用于作为样本训练识别。 一开始打算网上找到垃圾短信样本,但找了好久没找到,于是就想到用自己和家人手机里的短信,毕竟手机里短信一般不删除,也有小几千条,而且垃圾短信、推销、广告之类的应有尽有。 所以问题就变成了,如何导出 iPhone 短信? 这里笔者也查了好久,找到的第三方软件基本都是需要收费,最终发现了一个免费导出的方案。 首先不加密备份手机到电脑,如下图,选中Back up all the data on your iPhone to this Mac,点击Back Up Now,等待备份完成,备份完成后,再点击Manage Backups Manage Backups点击后,界面如下,可以看到已备份的记录,右键选择Show In Finder,在文件夹中打开 然后可以看到备份所在目录已打开,这时候需要找到文件名为3d0d7e5fb2ce288813306e4d4636395e047a3d28的文件,这个文件就是短信备份的数据库文件。然后问题来了,怎么找呢?看到备份目录一个个文件夹是不是懵,这怎么找,很简单,搜索,点...
Safari中使用NewBing
NewBing 的权限已经有了,但是想在 Safari 中使用 NewBing,因为不想日常开三个浏览器,Safari、Chrome、Edge,电脑内存不允许。。。 首先说步骤: Safari 安装 Microsoft Bing for Safari插件,并登录,能使用NewBing的账号 修改 Safari 的 UserAgent 为 Edge 的 UserAgent 修改默认搜索引擎为Bing 第一步很简单,就打开商店搜索安装即可,安装完成后,打开 bing并登录有NewBing权限的账号; 麻烦的是第二步,网上搜索到大部分是,打开Safari -> Develop -> User Agent -> Microsoft Edge,如下图: 但是这种方法只能在当前Tab页生效,打开新的页面后,就失败了,每个新 Tab 都单独设置一次,想想就不可能。所以有没有一种可以永久设置Safari的 UserAgent的方法? 当然有了,设置方法如下,设置之后,每次打开新的页面,UserAgent也会一直保持; 永久设置 Safari 的 UserAgent 1d...
iOS推送播放语音播报更新
iOS推送播放语音播报更新接上篇如何让iOS推送播放语音,之前的结论是iOS如果需要送审商店只能播放本地的mp3文件,这里更新一下: 更新语音的播放,最终调用的方法是UNNotificationSound(named: xxx),而这个方法官方文档注释如下: 12// The sound file to be played for the notification. The sound must be in the Library/Sounds folder of the app's data container or the Library/Sounds folder of an app group data container. If the file is not found in a container, the system will look in the app's bundle. public convenience init(named name: UNNotificationSoundName) 注释里说,语音文件会从这三个地方...
玩转OpenAI和ChatGpt
背景之前在其他平台就看到有大佬分享自己的ChatGPT的使用, 比如: 自力hzlzh, 但一直也没弄. 昨天突然看到 OpenAI 在商店有很多应用, 下载了一个发现里面接口都是失败的, 但是界面和方向感觉很有意思, 打算自己做一个自用的. 注册 OpenAI注册过程参考超详细注册OpenAI接口账号的教程, 很详细, 按照步骤一步步来即可, 要注意的国内的手机号收不到验证码, 所以需要国外的手机号或者通过接码平台(需付费), 验证码的接收我选用的US的手机号, 花费了 7.1元, 一次就成功了. 简单的说: 首先要能打开openAI的注册页面, 然后注册, 到接收验证码界面 如果有国外的手机号, 直接输入, 接收验证码; 如果没有, 再去注册一个接码平台, 选择语言为中文, 然后就都能看懂了, 然后充值 1 美元, 可以用支付宝支付, 然后搜索openai的接码, 选择一个, 耐心等待, 收到分配的号码之后 再去openAI的验证码界面, 输入分配的号码, 发送验证码, 然后等待, 在接码平台就会显示收到的验证码, 输入就可以注册成功. 如何使用OpenAI注册完...
CABasicAnimation进入二级界面再回来不生效
背景发现之前同事写的某个界面有个动效, 起初进入的时候是生效的, 进入二级界面再返回动效就没了, 动画用的是CABasicAnimation, 添加在 layer 上面. 解决看代码没有问题, 毕竟第一次就生效了, 以为是在页面消失时做了什么操作, 查了之后发现, 页面消失时并没有操作. 再回过来看代码, 代码动画部分是在didMoveToWindow中实现的, 大致如下: didMoveToWindow方法在页面消失和出现的时候都会调用, 难道是添加多次导致不生效了, 改成只添加一次之后发现效果一样, 进入二级页面再返回就不生效了. 1234567891011override func didMoveToWindow() { layer.addSublayer(gradientLayer) let basicAnim = CABasicAnimation(keyPath: "animateLocation") basicAnim.fromValue = [xxx] basicAnim.toValue = [xx...
base64加密出现的问题
背景项目中仿QQ闪照功能, 图片的发送逻辑是, 先转base64, 然后加密, 最后加密后的字符串作为文件发送; 在处理接收的时候, 按照先下载文件, 然后读取文件内容, 再解密, 然后按照 base64 字符串的方式生成图片, 却一直失败. 解决方法起初以为是, 加解密的问题, 仔细排查后, 排除了这个假设. 最后把解密后的字符串拷贝到VSCode中仔细观察发现, 其中多了很多\r\n. 搜索后发现, 是base64加密的问题, 由于base64一行不能超过76字符, 超过就会添加回车换行符(在 Windows中是\r\n, 在Linux中是\n). 而解析后其中的回车和换行就是错误信息, 所以解决方法是, 把\r\n替换为空字符串, 然后再去生成图片, 就正常了. 参考 base64加密出现的\r\n换行问题