gitignore 添加 Pod 三方库
背景最近项目遇到了一个问题,排查了好久,最后发现是Pod 依赖的私有组件的代码有问题,导致了打包的时候线上包出现了问题。 笔者的项目按照功能抽象出了私有组件,使用 Pod 的方式导入项目,但是 Pod的内容是不提交到 git 的,即每次 Pod 修改,在 主项目的git变更中看不到。于是就遇到了这个问题。 先在主项目中调试的时候,修改了 Pod库的内容。然后把修改内容同步到了 Pod 库单独的项目。但是最后打包的时候 Pod 库的内容却是老的。因为项目里依赖的 Pod 库指定了版本,而更新 Pod库单独的项目时,只同步到了分支上,没有更新新的 Tag。于是再次更新主项目的库时,这个库的内容就又变回了老的。 Ps:理论上来说,放入 Pod 库的内容不应该被频繁修改,是抽出的基础库之类的。但是实际开发中,为了组件化,有些功能组件也会作为私有库使用 Pod 依赖,这些库可能是频繁变更的。 基于这点,笔者感觉还是把 Pod 中的内容,放入主项目的 .git 中比较好,方便看出修改,能够避免出现上面的问题。 修改笔者直接进入项目工程所在目录,编辑.gitignore文件,移出文件中 #...
iOS 15导航栏设置
iOS 15导航栏设置背景使用Xcode 13.0运行项目到iOS 15的手机上,出现导航栏黑色。但是在低版本Xcode 运行到手机就没有问题。 修改设置方法需修改,参考barTintColor not working in iOS 15 原来设置导航栏代码不变,新增设置UINavigationBarAppearance实例对象的属性,然后赋值到全局的 navigationBar 或者单个页面的 navigaitonBar 属性中,取决于项目的设置是全局 NavigationBar 还是单个页面设置(可参考iOS StatusBar 设置)。 代码如下: 123456789101112131415161718- (void)updateNavigationBarColor:(UIColor *)color { UINavigationBar *bar = self.navigationController.navigationBar; if (@available(iOS 13.0, *)) { UINavigationBarAp...
iOS 在文件中访问 Document Directory
iOS 在文件中访问 Document DirectoryiOS 11之后,在 Plist 中设置LSSupportsOpeningDocumentsInPlace为 YES,且UIFileSharingEnabled为 YES,可以从系统的Files应用中访问应用的 Documents 目录。 如下: 从系统的文件打开,查看我的 iPhone如下,开启了此功能的应用可以从这里面看到 注意:此目录是 APP 的Documents目录,所以 APP 删除后,目录就消失了。 参考: iOS文件共享
问题记录
问题记录背景昨天,遇到三个神奇的问题,这里记录一下 SDWebImage图片加载之后黑色的问题,安卓显示正常 WKWebview 加载 vnd.ms-excel 文件,加载xlsx 文件,预览不了 用户反馈拍照唤起相机黑屏 图片黑色的问题测试反馈的是,拍摄了一张图片,上传之后,安卓可以加载出来,iOS显示是黑色,其他图片正常; 最开始笔者以为是 SDWebImage加载这张图片失败了,断点调试后,发现图片加载成功并没有失败,但是显示是黑色。然后笔者取到照片的链接在 Chrome 中打开,发现图片是可以显示的;在 Safari 中打开,是黑色的;且从 Chrome 中右键保存到本地,预览中打开也是黑色。这张图片的在 Mac OS 和 iOS 中渲染都是黑色的。 WKWebview加载xlsx 文件,预览不了的问题笔者这边的情况是,打开了一个网页,网页中的有个按钮,点击之后的链接,正常在电脑浏览器上打开是下载,在 iOS 的 WKWebview中打开是预览。 笔者最开始以为是 WKWebview 加载 xlsx 文件的问题,查了很多方法尝试后均失败。 出现的问题是,其他 .x...
Flutter布局基础——自定义BottomNavigationBar
Flutter布局基础——自定义BottomNavigationBar背景这里我们来尝试实现一个不规则的 BottomNavigationBar,首先了解两个系统组件: floatingActionButton和BottomAppBar floatingActionButtonfloatingActionButton用于创建一个浮动的按钮,有两种样式:一种是圆形的纯图标的;一种是椭圆的带有图标或文案的。 示例如下: 123456789101112131415161718192021222324252627282930313233343536373839404142void main() => runApp(const MyApp());/// This is the main application widget.class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); static const String _title = ...
Flutter布局基础——BottomNavigationBar
Flutter布局基础——BottomNavigationBar背景Flutter中BottomNavigationBar类似于 iOS 中的UITabbarController,是导航控制器的一种,常用于首页 Tab 切换。 BottomNavigationBar的 type 属性,默认值会根据items的个数而定;当items个数小于4个时,默认值为BottomNavigationBarType.fixed;当items个数大于等于4个,默认值为BottomNavigationBarType.shifting。 两种效果对比如下:左侧为BottomNavigationBarType.fixed,右侧为BottomNavigationBarType.shifting 常用属性如下: backgroundColor: 背景色 currentIndex: 当前选中哪一个 fixedColor: 选中 Item 的颜色 iconSize: 图片大小 items: 子元素 onTap: 点击事件 selectedFontSize: 选中字体大小 select...
关于VR的一个想法
早上听书,突然有一个想法,把推理小说中的密室给做出来,做成真实的密室,亦或者做成玩具模型,考虑到太难实现,想到是否可以用VR来做,推理小说的密室,每个人选一个角色用来重现推理小说的过程,比如, 绫辻行人“馆系列”作品 再然后,想到,除了这些复杂的推理小说之外,把线下简单的密室场景,如果搬到VR中,在线联机,有人扮演凶手,有人扮演推理小说家,是不是会比线下的密室会吸引更多的人 或者把经典电影的片段做成可以体验的VR的形式,比如泰坦尼克号从沉船开始到结束的一段,Jack和Rose两个角色可供体验,是不是会有很多人愿意体验 参考小说:《绫辻行人-钟表馆事件》电视剧:《私家侦探第五季-第二集》里关于VR实验室的实现
iOS 虚拟定位原理与预防
iOS 虚拟定位原理与预防背景说到虚拟定位,常有印象都是安卓上的分身软件甚至系统自带的位置穿越(笔者曾经使用过ZUK Z2系统自带的位置穿越),会认为iOS上虚拟定位比较困难。笔者没调研之前也是这么认为,之前已知的虚拟定位是使用Xcode添加GPX文件,编辑经纬度,从而实现虚拟定位。但是这种操作也只有熟悉iOS开发的人才能操作,而且需要mac电脑,故而笔者印象中也是iOS上虚拟定位比较困难。 然而经过调研之后,笔者发现,iOS的虚拟定位没有那么困难,甚至相比于安卓更简单。下面就来介绍一下iOS中几种虚拟定位的方法。 虚拟定位的几种办法及原理笔者调研后,发现iOS上面虚拟定位大致可有4中情况: 使用Xcode通过GPX文件虚拟定位 使用爱思助手中的虚拟定位功能直接虚拟定位 通过外接设备,比如蓝牙和手机连接,发送虚拟定位数据来虚拟定位 越狱设备中通过hook定位方法,来虚拟定位 下面就来一个个分析实践: 使用Xcode通过GPX文件虚拟定位使用Xcode通过GPX文件虚拟定位,iOS开发一般比较熟悉,操作步骤是: 新创建一个iOS项目,然后添加文件,选择创建GPX文件 编辑...
iOS 启动时间优化
iOS 启动时间优化——相关背景iOS的启动时间优化有很多相关的文章,本来不打算写,但是总归是自己整理一遍印象更深刻。这里打算从原理-实践-面试相关三个方面来入手。首先要理解APP启动的原理,启动做了什么?然后针对启动过程中的事件哪些是开发可以进行优化的,去实践?最后则是,面试相关,与启动优化相关的面试有很多,笔者打算列举一下,分别涉及到启动的哪些问题。 启动原理启动分为冷启动和热启动。冷启动指的是APP进程被杀掉后,从零打开;热启动指的是,APP进入后台,再切换到前台唤起到过程。这里通常说的启动优化,指的是冷启动优化。(Ps: 这里某些版本会出现,刚杀掉的APP,立即再次打开,会直接闪退的问题,是系统的Bug)。 冷启动的过程分为main函数之前(pre-main)和main函数之后两个阶段。 pre-main阶段就如很多文章说的: pre-main阶段的过程分为dylibs loading ——> rebase/binding ——> ObjC setup ——> initializer四个部分。每个部分吧啦吧啦…但每次问到这个时候,死记硬背出来真的累人...
Flutter布局基础——页面导航和返回
Flutter布局基础——页面导航和传值说到导航,最常见就是类似于iOS中导航控制器的push和pop效果,同样Flutter中也有类似的效果,使用的就是Navigator组件。 下面,来看一下在Flutter中,导航效果Navigator.push和Navigator.pop的使用。 简单使用代码如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '导航演示1', home: new FirstScreen(), ); }}class FirstScreen extends StatelessWidget { @o...