xcode appicon使用纪要

正常步骤

  1. AppIcon需要的文件,要加入本地的工程目录下,这样才能正确打包和调用。
    注意:每一个资源icon文件,加入后,其 file inspector 的target membership 都要勾选当前目标程序,否则可能出问题

  2. 需要在asset catalog下面创建 AppIcon对象

  3. 在plist中配置正确的AppIcon 相关字段,其中CFBundleIconName字段要一模一样,注意大小写和空格,避免低级错误。

其他问题

问题1:
上传商店时,一直莫名提示:

ERROR ITMS-90713: "Missing Info.plist value. A value for the Info.plist key 'CFBundleIconName' is missing in the bundle 'com.xxx.xxx'. Apps built with iOS 11 or later SDK must supply app icons in an asset catalog and must also provide a value for this Info.plist key. For more information see http://help.apple.com/xcode/mac/current/#/dev10510b1f7."

解决:
原来是CFBundleIconName节点的内容错误导致,正确的内容为在plist xml文件中添加如下:

<key>CFBundleIcons</key>
    <dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>icon-20-ipad</string>
                <string>icon-20</string>
                <string>icon-29-ipad</string>
                <string>icon-29</string>
                <string>icon-40</string>
                <string>icon-60</string>
                <string>icon-76</string>
                <string>icon-83.5</string>
                <string>ItunesArtwork</string>
            </array>
            <key>CFBundleIconName</key>
            <string>AppIcon</string>
        </dict>
    </dict>

成功后,在UI中表现就是出现:
Icon files (iOS 5) 相关的节点内容

ps:刚开始不知道怎么配置,看到此字段带了个括号iOS 5,以为是陈旧的格式,随手就把这个删除了,后面一直在网上找的不对的配置格式,各种折腾都无果,最后还是在github 代码片段的帮助下搞定了这个问题。

ERROR ITMS-90704:1024 by 1024 pixels icon problem

现象

在app上传时遇到如下的error:

ERROR ITMS-90704: "Missing App Icon. An app icon measuring 1024 by 1024 pixels in PNG format must be included in the Asset Catalog of apps built for iOS, iPadOS, or watchOS. Without this icon, apps cannot be submitted for review. For details, see https://developer.apple.com/ios/human-interface-guidelines/icons-and-images/app-icon/."

各种搜索,大部分讨论都在 stackoverflow, 比如:https://stackoverflow.com/questions/44667434/how-to-solve-missing-marketing-icon-ios-apps-must-include-a-1024x1024px/61618816#61618816

搜索分析

无非以下几种排查思路:
1. 遗漏1024分辨率icon文件的,补上文件就ok了
2. 检查文件的alpha 和透明度
3. plist配置文件错误的。

经过仔细排查以上几点,都无果:
- 所有的AppIcon集合,都正常,只是提示这个1024的一直有问题,
- 用图片工具,确认过第二点,也没问题
- 配置的问题,多方搜索比较,也排查完了已有的问题,最后只剩下这个1024的问题

解决

后面根据字面意思:must be included in the Asset Catalog 进行猜测和尝试,最终得以解决:
建立新的Asset catalog,并将之前的AppIcon目录移过去,然后就ok了。所以之前虽然icon得以正确调用,能正确显示icon但实际的asset catalog配置是没通的,导致这个app store需要的1024 icon一直找不到。

以上方法,仅供片面参考!

com.apple.amp.itmstransporter 下载

  1. github上有相关资源,如果速度可以,可以直接从github上下载,直接搜索就可以找到。
  2. 对于github速度不给力的,做了一个国内的链接:https://gitee.com/hiproz/com.apple.amp.itmstransporter ,为了做源,6k左右的速度下载了将近2个小时,中间无数次断链,这也就是在xcode中无法直接一次成功的原因,实际上底层的操作已经中断了,所以等再久也没有用。

Authenticating with the App Store 问题

环境

xcode 11.4.1

现象

昨天准备上传一个更新的app,一直无法成功,刚开始以为网络问题,只是速度慢,后面挂机睡觉,今天早上一看,还是一样卡死不动。提示:Authenticating with the App Store

搜索了下,发现了些许线索:
【1】https://juejin.im/post/5e4cab5ee51d4526d6405981
【2】https://github.com/iOSDevLog/com.apple.amp.itmstransporter

原因在上面的两个链接里都有解释,简单说就是,第一次运行时iTMSTransporter更新速度过慢或者网络异常导致无法更新成功。实际测试,6k左右的速度,还不停断链。

解决

  1. 参照上面的链接1,重新执行iTMSTransporter,等待更新成功
  2. 通过github更新文件,但是可惜因为某些语音,一样速度可怜,跟方法一效果差不多。
  3. 通过国内cdn下载iTMSTransporter,然后覆盖本地目录。一搜,发现都是某网站的结果,要注册的积分下载,无语,所以做一个国内的链接,具体参看:https://wp.goodmemory.cc/com-apple-amp-itmstransporter-download/

CocoaPods update error

错误提示:
[!] Failed to connect to GitHub to update the CocoaPods/Specs specs repo - Please check if you are offline, or that GitHub is down

根据字面意思以为是qiang的原因,后面手动对source测试,发现没问题。

解决:

rm Podfile.lock
pod install

仅供参考

iPhone SE2适配

判断型号

#import <sys/utsname.h>
struct utsname systemInfo; 
uname(&systemInfo); 
NSString * phoneType = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding]; 
if ([phoneType isEqualToString:@"iPhone12,8"])  return @"iPhone SE2";

来源参考:https://stackoverflow.com/questions/26028918/how-to-determine-the-current-iphone-device-model

设计规范

SE2的UI设计规范可以参考 iPhone 8
设计参考规范: http://www.xueui.cn/design/142395.html

mac下格式化后的u盘windows无法操作

现象:mac下格式化成fat 或者exfat ,window下都是磁盘管理器可以看到,但无法格式化和操作,导致用户界面看不到。
解决:
1. 从开始菜单里找到附件 - 命令提示符,右键点击“命令提示符”,选择“以管理员模式运行”:
2. 进行命令行操作:

DISKPART> list disk

  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  磁盘 0    联机              223 GB  1024 KB
  磁盘 1    联机              931 GB  3072 KB
  磁盘 2    联机               28 GB      0 B        *

DISKPART> select disk 2

磁盘 2 现在是所选磁盘。

DISKPART> clean

DiskPart 成功地清除了磁盘。
  1. 然后系统会提示发现硬盘,需要格式化,但是这个时候只能选择支持fat
  2. 按照默认fat格式化成功后,拔出再插入,然后发现可以支持ntfs格式化了
  3. 按照ntfs格式化成功

done!

xcode代码格式化快捷键

  • Format entire code (entire class/controller)
    Select the entire code and press control+I on mac to format your code.

  • Format particular block of code
    Select the code and press:
    ⌘+]: for right move (indent)
    ⌘+[: for left move (un-indent)

ref:https://stackoverflow.com/questions/829954/how-can-i-indent-multiple-lines-in-xcode

dispatch_get_global_queue与dispatch_get_main_queue的区别

GCD队列的概念

在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQueue(派发队列)当中就好了。
派发队列分为两种,一种是串行队列(SerialDispatchQueue),一种是并行队列(ConcurrentDispatchQueue)。
一个任务就是一个block,比如,将任务添加到队列中的代码是:

```dispatch_async(queue, block);```
当给queue添加多个任务时,如果queue是串行队列,则它们按顺序一个个执行,同时处理的任务只有一个。
当queue是并行队列时,不论第一个任务是否结束,都会立刻开始执行后面的任务,也就是可以同时执行多个任务。
但是并行执行的任务数量取决于XNU内核,是不可控的。比如,如果同时执行10个任务,那么10个任务并不是开启10个线程,线程会根据任务执行情况复用,由系统控制。

获取队列

系统提供了两个队列,一个是MainDispatchQueue,一个是GlobalDispatchQueue。
前者会将任务插入主线程的RunLoop当中去执行,所以显然是个串行队列,我们可以使用它来更新UI。
后者则是一个全局的并行队列,有高、默认、低和后台4个优先级。

它们的获取方式如下:

dispatch_queue_t queue = dispatch_get_main_queue();
dispatch queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRORITY_DEFAULT, 0);

执行异步任务

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
  //...
});

这个代码片段直接在子线程里执行了一个任务块。使用GCD方式任务是立即开始执行的它不像操作队列那样可以手动启动,同样,缺点也是它的不可控性。