
Apple开发疑难秒懂百科
用简单有趣的表述、生动鲜活的图表、严谨而不枯燥的逻辑让你瞬间懂得Apple开发中的痛点、难点问题。
拒绝原封不动的抄袭!所有分析过程和解决方案都经笔者亲自验证,并及时更新,保证有理有据、真实可靠、你值得拥有 ;)
¥39.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅博主任意付费专栏,享有该博主全部专栏一年阅读权限。
本专栏为虚拟产品,一经付款概不退款,敬请谅解。
大熊猫侯佩
非自由程序员,CSDN博客认证专家。
CSDN汇编板块版主, CSDN其他开发语言大版版主。
对App、以及Cocos2D、SpriteKit游戏开饶有兴趣。目前常用的语言是ObjC、Swift、Ruby等。不过看到编程艺术、ASM、逆向和C时依然欲罢不能。虽然不是,但喜欢黑客的思维和哲学,认为社会工程学很酷,但还没有实际用来撩过妹。
-
原创 iOS中彻底搞明白奇偶(evenodd)填充规则
问题现象众所周知, 在iOS任意路径的填充,有 nonzero 和 evenodd 两种规则。可它们到底是什么意思,你真的完全明白吗?图1图2如果你处于模棱两可,懵懵懂懂之间,那么不要犹豫,看这一篇就够了!还等什么? Let’s Go!问题分析1. 为什么要有填充规则?填充规则根本目的,是为了确定复杂图形中哪些部分处于内部而哪些部分处于外部。在图形填充时,处于内部的部分需要填充,而外部的部分不需要填充。这尤其发生在图形中有重叠部分的时候。如上图,在图形中无重叠部分...2021-01-24 14:48:4114
0
-
原创 SwiftUI中实现旋转倒计时动画
SwiftUI中如何实现任意视图上的倒计时动画?在SwiftUI中对任意视图上应用时钟旋转进度动画,远没有你想象的那么难。想知道如何完成么?Let’s Go!功能分析1.代码实现(问题解决)1.结束语Hi,我是大熊猫侯佩,一名非自由App开发者,希望我的文章可以解决你的痛点、难点问题。如果还有疑问就在下面告诉本猫吧 ????感谢观赏,再会。...2021-01-18 11:47:261861
4
-
原创 SwiftUI实现酷炫的溶解(Dissolve)动画
想在SwiftUI中实现酷酷的溶解(Dissolve)动画,有多难呢?如上图所示,我们没有借助UIKit以及其它第三方库,仅仅在SwitUI框架内就实现了在任何View上的溶解动画。想知道它是如何实现的吗?还等什么!? Let‘s Go! ????功能分析1. 缘起一篇博文前不久,逛到一个国外老哥的博客,其中有一篇博文引起了我的兴趣:SwiftUI: Dissolve Effect里面中心思想只有一个:就是在SwiftUI中实现溶解动画。可惜的是,虽然这位仁兄起了个好头,2021-01-16 21:15:2360
0
-
原创 iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决
问题现象Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。此时检查发现,并没有对App的内购逻辑做任何改动。那么,这是什么原因导致的呢?Let’s find out!????问题分析1. 排除其它原因首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。在SKProductsRequestDelegat代理实现的productsRequest方法里下断点:func produc2021-01-13 08:54:37154
0
-
原创 iOS本地化货币符号显示不正确(显示为XXX)的解决
在App切换本地语言时,其IAP中的产品价格里的货币符号显示不正确.如上图所示,除了最右边英语的货币符号正确外,其他所有的都不对。实际上,App中除了英语以外,包括中文,日文,韩文,德文等在内的多种语言货币符号都不正确,它们大多都显示为"XXX"。那么,这是什么原因造成的又如何解决呢?别急,下面就让我们 Let's GO!;)2021-01-04 22:45:4251
0
-
原创 SwiftUI如何禁止用户关闭sheet弹出的视图?
在SwiftUI以sheet方式弹出视图后,我们有时需要禁止用户关闭该视图,比如:用户有一些输入还未完成时:如上图所示,只有当用户输入2个姓名后,才可以关闭弹出的视图。那么,在SwiftUI中如何完成它呢?别急,下面让我们娓娓道来... ;)2021-01-04 14:41:4154
0
-
原创 SwiftUI嵌套ObservableObject对象如何触发UI更新
SwiftUI开发中,时常会创建ObservableObject对象,当它的@Published属性发生改变时会触发UI界面的更新。但有时由于App逻辑比较复杂,为了封装需要,会将另一个子ObservableObject对象作为Published属性放在父ObservableObject对象中。此时,如果子ObservableObject对象发生改变,并不会触发UI界面的更新。为什么会出现这个问题?怎么解决它呢?So, Let‘s find out! ????问题分析Observa2020-12-24 10:17:2699
0
-
原创 SwiftUI进入多重嵌套视图后如何一键退回到根视图
在SwiftUI开发中,我们常常需要从很深的多重嵌套视图中一键返回到根视图,这里的嵌套不仅仅是导航这么简单,而且其中还混杂了弹出(Sheet)操作。无论进入多么深的子视图,无论是以Navigation还是Sheet方式,或是它们的任意组合的方式,都可以一键退回到根视图。那么,在SwiftUI中这是如何实现的呢?其实超乎意料的简单,So,下面就让我们 Go into it! ????功能分析1. UIKit中如何一键退回到根视图在UIKit中,对于导航2020-12-23 16:29:0950
0
-
原创 UIView实例方法setContentCompressionResistancePriority底层到底做了什么?
问题现象大家都知道UIView是UIKit框架中一个非常重要的类。UIView有2个实例方法,分别是:setContentHuggingPriority:forAxis:setContentCompressionResistancePriority:forAxis:它们用来设置UIView界面的抗拉和抗压属性,但你是否思考过,它们到底对UIView对象做了什么?或者换句话说: 它们把抗拉和抗压的priority值放到哪里去了?我们能够绕过这2个方法直接设置UIView界面的抗拉和抗压属性...2020-12-16 10:56:19102
0
-
原创 解决真机崩溃产生的crash文件调试符号显示不全的问题
问题现象对于经常开发App的小伙伴来说,调试是一个让人又爱又恨的话题。而在iOS开发中,有一种崩溃叫EXC_BAD_ACCESS,你永远躲不过:如上所示,崩溃虽然停留在AppDelegate上,而真实的崩溃处却在App中一个非常深的位置。仔细观察右下部的调试输出框,你会发现可用来探究的线索,少的可怜,可以说基本上为零。那么遇到这种EXC_BAD_ACCESS崩溃我们该如何处理呢?功能分析(问题分析)1.代码实现(问题解决)1.结束语Hi,我是大熊猫侯佩,一名非自由App...2020-12-15 19:54:3076
0
-
原创 SwiftUI如何在动画完成时得到通知
在App开发中,少不了动画的点缀。有时候我们希望在动画完成时得到通知,这在UIKit编程中是家常便饭的事,但在SwiftUI中又该怎么做呢?本博向大家演示了如何在单一、复合以及重复动画的完成时如何得到通知,相信看完之后一定收获满满。2020-12-14 21:37:407227
13
-
原创 SwiftUI开发Mac App沙盒中文件操作全面解析(下)
功能需求在开发自己的Mac App时,我们常常要和文件操作打交道,其中涉及到文件读写以及移动(改名)等操作。这些操作在App开启沙盒功能(Sand Box Capability)后会和正常的行为有所不同,初次接触可能会觉得有点摸不着北。我们在上篇里探讨了什么是沙盒,以及如何在Mac App的沙盒中对文件进行读写操作;在中篇里探讨了如何在沙盒中修改文件的名称。上篇在此观赏: SwiftUI开发Mac App沙盒中文件操作全面解析(上)中篇在此观赏: SwiftUI开发Mac App沙盒中文件操...2020-12-11 23:16:2892
0
-
原创 如何为Swift Package添加版本号
功能需求以往的App开发代码共享方案,一般是Cocoapods或者Carthage,两者互有优劣。自从Xcode 11发布后,我们有了一种新的代码共享方案,那就是 Swift Package。不管使用何种代码共享方式,一个绕不过的必备技能就是设置共享项目的版本号,这关乎着解决互相引用项目间依赖性的问题,可谓非常重要。那么如何在Swift Package中设置项目的版本号呢?如果打开Package中的Package.swift主文件,会发现里面并没有设置版本号的地方:在Package项目选...2020-12-11 13:15:3797
0
-
原创 SwiftUI开发Mac App沙盒中文件操作全面解析(中)
功能需求在开发自己的Mac App时,我们常常要和文件操作打交道,其中涉及到文件读写以及移动(改名)等操作。这些操作在App开启沙盒功能(Sand Box Capability)后会和正常的行为有所不同,初次接触可能会觉得有点摸不着北。我们在上篇中探讨了什么是沙盒,以及如何在Mac App的沙盒中对文件进行读写操作。上篇在此观赏: SwiftUI开发Mac App沙盒中文件操作全面解析(上)下篇在此观赏: [敬请期待]在本篇中,我们接着之前的主题,继续介绍:沙盒中如何重命名指定文件...2020-12-10 21:59:4386
0
-
原创 SwiftUI开发Mac App沙盒中文件操作全面解析(上)
功能需求在开发自己的Mac App时,我们常常要和文件操作打交道,其中涉及到文件读写以及移动(改名)等操作。这些操作在App开启沙盒功能(Sand Box Capability)后会和正常的行为有所不同,初次接触可能会觉得有点摸不着北。别急,看完了这篇博文,相信大家都能够对沙盒中的文件操作游刃有余,其中包括的内容涉及到以下几点:什么情况下可以关闭沙盒?以及如何关闭沙盒?沙盒中如何读取和写入指定文件?沙盒中如何重命名指定文件?如何保存和获取上一次某个目录已获取到的访问权限,而不用重复向用...2020-12-10 20:37:1283
0
-
原创 SwiftUI: 极简实现App内快速切换本地化语言
功能需求一般来说,让App支持本地化语言是一件还算轻松的事,只要设置好对应的语言字符串脚本,然后在App内所有需要国际化的代码位置按键(Key)返回对应本地化文本即可。这样当App安装到设备上或设备的语言更改后,App就会应用对应的语言。但如果用户需要在App内手动切换本地化语言又该如何呢?如上所示,当用户在英文、简体中文和日文中切换时,App的显示也随之切换为对应的本地化内容。用户什么情况下会手动在App中切换语言呢?一种可能是,比如我是西班牙人,App支持英语,中文和西班牙文3国语言...2020-12-07 13:24:44113
0
-
原创 CoreData报Multiple NSEntityDescriptions claim the NSManagedObject subclass错误的解决
问题现象在集成CoreData功能的App中,对于较复杂的数据逻辑,在创建托管对象时,可能会产生如下错误:[error] warning: Multiple NSEntityDescriptions claim the NSManagedObject subclass ‘XXX’ so +entity is unable to disambiguate.在后续的保存操作中,很可能导致App直接崩溃,提示:Terminating app due to uncaught exception ...2020-11-14 09:56:12110
0
-
原创 iOS内购测试中产品本地标题及价格等内容都是英文格式的解决
问题现象初次编写iOS内购功能的小伙伴们可能会发现一个问题:虽然手机语言是中文,AppStore用户所在区域也是中国,但从Apple获取产品对象的标题、价格等内容都是英文格式。这是怎么回事呢?以上是运行演示的结果,可以看到左侧图中商品无论是标题、描述和价格都是英文格式;而右侧图中所有商品内容都是中文(本地)格式。那么如何实现右侧图中的运行效果呢?Let’s Go!问题分析1.前提条件要想实现内购产品的本地化,首先需要在App Store Connect中为App中对应的产品添加本地...2020-11-12 09:36:42118
2
-
原创 SwiftUI监听CoreData托管对象属性变化以及发生EXC_BAD_ACCESS崩溃的处理
功能需求SwiftUI在与CoreData共同协作时,我们往往希望在托管对象的自定义属性发生变化时,UI能够得到通知。有一个好消息和一个坏消息:好消息是,所有NSManagedObject都遵守ObservableObject协议,这意味着我们可以在SwiftUI中像其它可观察对象那样使用它们。坏消息是,NSManagedObject的自定义属性都没有添加@Published修饰符,所以你无法直接将其传入视图的.onReceive修改器。更要命的是,在低版本的iOS(在13.5....2020-07-25 09:41:54184
0
-
原创 SwiftUI如何进入List编辑模式以及如何指定某些Cell不可删除
功能需求在SwiftUI中我们常用List来显示项目,而一个很常见的功能就是在List中删除指定项目所在的行。在 SwiftUI如何动态开启和禁用List的删除模式 这篇博文里,我们谈到了如何全局动态开启或关闭List的删除模式。但是如果我们只允许删除指定的项目呢?即某些行可以删除,而另一些行却禁止删除。另外在UIKit编程中,我们可以开启UITableView的编辑模式,那么在SwiftUI中我们也可以这样做么?答案是肯定的,下图演示了我们要实现的这2个功能:即:一键进入编辑模...2020-07-16 12:59:58298
0
-
原创 SwiftUI无法监听CoreData托管对象hasChanges属性改变的原因及解决
问题现象在SwiftUI中,我们往往需要在CoreData托管对象某个属性被修改时得到通知,尤其是hasChanges属性的改变时,因为在这个时机上,我们正好可以将修改后的对象保存到持久存储中去。我们知道Combine库为每个托管对象(NSManagedObject)添加了一个publisher方法,自然地我们第一反应会这样创建发布器:p = publisher(for: .hasChanges).eraseToAnyPublisher()然后在SwiftUI视图中这样创建监听:.on...2020-07-11 13:17:47704
0
-
原创 SwiftUI中如何优雅的为任意View绘制虚线
有时我们往往需要在界面画虚线,尤其是在View的下沿绘制。一般情况下我们可以绘制Rectangle来作为替代方案,但这样会有一些问题,比如绘制重叠。本博将会为大家展示如何为任意View的下沿绘制可高度定制的虚线,当然用的是最优雅的方式哦。;)2020-07-02 11:21:04462
1
-
原创 Xcode更新DeviceSupport文件后真机调试在App启动时挂起的解决
问题现象为了低版本的Xcode支持高版本系统的真机调试,我们需要下载并安装对应版本的设备调试支持文件。Xcode会自动帮我们下载合适的真机设备调试支持文件并自动安装。但是,有时在Xcode安装调试支持文件后,在连接调试真机时,App启动会挂起一段时间(大约1分钟)。具体有以下两个现象:在真机上直接点击打开App没有问题挂起时查看Xcode进程面板会发现所有数值一直是zero(直到可以调试)这着实给我们带来了诸多不便 ????问题分析重启真机和Mac后,问题依旧;在不同真机设备2020-06-27 21:04:34668
0
-
原创 低版本Xcode在没有最新DeviceSupport文件时如何调试真机
问题现象大家知道,一般来说低版本Xcode是无法去调试高版本真机设备的。我们通常采用的做法是下载最新的iOS DeviceSupport文件,放入Xcode的对应目录中。但是如果找不到最新的DeviceSupport文件怎么办?问题分析问题原因很简单,就是缺少对应版本的真机调试支持文件。一般是从网上下载或者从最新的Xcode中拷贝该文件,但是如果由于新版本推出时间很短,网上还下载不到,或者你又不想下载7、8GB的XCode,又该如何呢?举个栗子,本篇写作时iOS 13.5.1(17F...2020-06-27 14:03:251156
0
-
原创 SwiftUI一招让List巨量数据刷新UI速度快100+倍
问题现象SwiftUI中,若List中包含大量数据,当更新数据时界面会发生严重卡顿。 前两张图分别演示了在2k条数据下,未优化时需要8.29秒,而优化后只需要0.07秒,相差118倍多。后两张图演示了在2w和10w条数据下,优化后的表现。可以看到即使数据达到10w条,更新也不会超过1秒钟,可谓相当惊人。问题分析1. List数据变化时List如何刷新?SwiftUI中使用的是“差异”比较的方式来刷新界面。因为SwiftUI是以状态驱动的,所有的数据更新都会自动触发UI的...2020-06-25 09:45:58701
0
-
原创 SwiftUI中TabView+NavigationView适配界面时崩溃等问题的解决
问题现象若TabView的子视图中若包含有Form等组件,在快速切换TabItem时往往会导致App崩溃,错误信息为:precondition failure: attribute failed to set an initial value: xxx若TabView包含在NavigationView中,在具有刘海外观的iOS设备(比如iPhone X系列)中,由竖屏旋转到横屏再旋转回竖屏后,TabBar底部会有一小截颜色显示不正确:上图分别演示了正常和黑暗模式下,在旋转为横屏再旋.2020-06-24 13:30:51425
0
-
原创 SwiftUI如何动态开启和禁用List的删除模式
功能需求在大多数内容管理App中,我们需要完成数据项的删除操作,可是有时候我们还需要按条件禁止用户的删除操作。如下图所示:在List的任意子View中,若用户点击红色的选项按钮展开选项面板,则禁止用户删除任何子View,只有全部子View中选项面板收起后,才允许用户进行删除操作。这样做的原因是在选项面板中有一个Slider控件,向左拖动它的把手可能会触发不该发生的删除操作,在禁用了删除操作后,就可以避免发生该问题了。功能分析1. SwiftUI如何实现List中子View的删除操作?写过.2020-06-22 20:28:39393
0
-
原创 SwiftUI中CoreData上下文Foundation._GenericObjCError崩溃的解决
问题现象在SwiftUI中使用CoreData管理对象上下文NSManagedObjectContext时出现,App会崩溃,报如下错误:Fatal error: Unresolved error Error Domain=Foundation._GenericObjCError Code=0 “(null)”这一般发生在context.save()的时候。问题分析1. SwiftUI中使用CoreData时Xcode为你做了什么?在默认使用CoreData的Xcode项目中,cont.2020-06-22 19:06:28270
0