分类目录归档:Mac

resource fork, Finder information, or similar detritus not allowed

今天,我准备更新我的一个app,这个app很久以前上架的,当时还是iPhone 32位 CPU的时候,所以有必要更新一次。

然而,在编译过程中,我遇到了以下错误:

resource fork, Finder information, or similar detritus not allowed

经过一番搜索,找到了解决方案。

http://stackoverflow.com/questions/39652867/code-sign-error-in-macos-sierra-xcode-8-resource-fork-finder-information-or

https://developer.apple.com/library/content/qa/qa1940/_index.html

原来,MacOS的文件有三个fork,data fork, resource fork和Finder info。Data fork存储了文件的内容;resource fork保存了一些扩展信息,如什么应用创建了这个文件,又例如上次你打开这个txt文件的时候,正在显示的是第几行,等等; Finder Info则保存了文件所有者,创建者等信息。

从iOS 10和macOS Sierra开始,从安全考虑,app bundle中的文件将不能包含resource for和Finder info了。所以,我们必须去掉这两个信息,才能成功进行代码签名。具体如何去掉这两块信息,大家可以参考下面的说明。

40
Code signing fails with error 'resource fork, Finder information, or similar detritus not allowed'

Q:  When I build my app, code signing fails with the error "resource fork, Finder information, or similar detritus not allowed." What does this mean and what should I do about it?

A: This is a security hardening change that was introduced with iOS 10, macOS Sierra, watchOS 3, and tvOS 10.

Code signing no longer allows any file in an app bundle to have an extended attribute containing a resource fork or Finder info.

To see which files are causing this error, run this command in Terminal:

$ xattr -lr 

replacing  with the path to your actual app bundle.

Here's an example of this command in action:

$ xattr -lr Foo.app
/Applications/Foo.app: com.apple.FinderInfo:
00000000  00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00  |................|
You can also remove all extended attributes from your app bundle with the xattr command:

$ xattr -cr 

Note that browsing files within a bundle with Finder's Show Package Contents command can cause Finder info to be added to those files. Otherwise, audit your build process to see where the extended attributes are being added

openbakery gradle-xcodePlugin在keychainCreate阶段报错

我在iOS的项目中使用了gradle-xcodePlugin进行打包工作,然而,最近gradle-xcodePlugin一直报如下错误。


:archive
:keychainCreate FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':keychainCreate'.
> Command failed to run (exit code 1): 'security set-key-partition-list -S apple: -k -D -t private'

我将

security set-key-partition-list -S apple: -k -D -t private

在终端中执行的话,会遇到如下错误信息。

security: SecKeychainItemSetAccessWithPassword: The user name or passphrase you entered is not correct.

我在https://github.com/openbakery/gradle-xcodePlugin/issues/316 看到,已经有人报告了一个类似的issue。
原来gradle-xcodePlugin的作者为了解决issue 316而在0.14.5中添加了’security set-key-partition-list -S apple: -k -D -t private’命令。正是这个命令导致了我的打包失败。

最终,我改用了0.14.4版本的gradle-xcodePlugin,就可以正常打包了。

说说ITMS-90682: can’t contain 16-bit or P3 assets if the app supports iOS 8 or earlier

昨日,我在工作中听到我部门打包好的IPA,到了测试的时候,一旦测试的手机是iOS 8或者9.2的手机,应用总是会随机崩溃。最后,同事们找到了原因,具体原因见
http://stackoverflow.com/questions/39404285/xcode-8-build-crash-on-ios-9-2-and-below

When I build my app with Xcode 8 GM Seed and run it on an iOS 9.2 below device OR simulator, I get strange EXC_BAD_ACCESS crashes during app startup or a few seconds after the app launched. The crash always happens in a different spot (adding a subview, [UIImage imageNamed:], app delegate’s main method etc). I don’t get those crashes when I run it on iOS 9.3+ or 10 and I don’t get them when I build with Xcode 7 and run on iOS 9.2 and below. Has anyone else experiences something similar? Is this a known issue with Xcode 8?

当我用Xcode 8 GM Seed打包应用并在iOS 9.2或者更低版本的设备或模拟器运行的时候,我总是会在应用启动时或启动后的数秒之内遇到EXC_BAD_ACCESS,而崩溃的地方每次都不一样,如addSubView,[UIImage imageNamed:]甚至main方法。如果我在9.3或者10上运行,或者我用Xcode 7执行编译工作,然后运行在9.2以及以下的设备上,这些错误都不会发生。有没有人遇到类似的事情呢,这是不是Xcode 8的一个问题?

而解决的方法在这里讲了https://forums.developer.apple.com/thread/60919?start=0&tstart=0。简单说,Xcode认为你的图片资源中包含了16位或者P3的资源,所以打包的时候会进行相应的处理,但是,只有9.3或者更高版本才支持这样的资源,所以到了9.2就会崩溃。

此时,我想说说什么是P3资源。P3指的是DCI-P3或者说DCI/P3,一种数字电影投影所用的色域标准,它能比sRGB显示更多的颜色。苹果在推出5k显示屏的new iMac的时候(2015年10月),引入了DCI-P3,随后9.7寸的iPad Pro(2016年3月推出,推出时iOS 9.3系统)、iPhone 7(2016年9月推出,iOS 10系统)和2016的MacBook Pro都使用了DCI-P3色域。即苹果公司的iOS 9.3系统支持DCI-P3色域,而iPad Pro作为第一个支持DCI-P3的iPad,使用的是iOS 9.3。这也就解释了为什么我们之前打包的IPA到了9.2的设备上就会不正常。

那么,如何判断一个图片是不是P3的图片呢,其实很简单,就是要看这个图片的Color Profile是什么,通常来说,一个图片应该没有内嵌Color Profile或者内嵌sRGB的Color Profile。下面一个例子,我进行了两张图片的对照,左边为P3的png,右边为普通的png。P3和非P3图片对照

不难发现,左侧的图片有内嵌的Color Profile:Display,而右侧的常规的图片没有内嵌的Profile。那问题来了,为什么Color Profile: Display是P3资源呢?Display难道等于DCI-P3吗?

这里需要说明的是,Display指的是制作图片的人所使用的电脑的显示器所使用的Color Profile,具体这个Profile是什么,那要看制作者的电脑上的Display对应的Color Profile是什么,如果制作者使用的是5k的iMac,那么Display对应的Profile就是P3了。
下图为笔者的MacBook Pro的Photoshop新建一个图像的对话框。
display_and_display_p3
我们看到,默认的是Display,即用户当前显示器所使用的Color Profile,此外,还有许多Color Profile可以选择,如Display P3,这就是DCI-P3色域的Color Profile。如果你用的是5k的new iMac,那么Display就等于Display P3,如果你用的是别的Mac,比如笔者的2013的MacBook Pro,那么Display就等于sRGB。

下图为2016的MacBook Pro的技术规格,请大家注意“广色域(P3)”这几个字。这就是前面提到的P3 assets中P3的含义。
2016 MacBook Pro的显示屏采用了广色域P3

解决方法如下,摘录自https://forums.developer.apple.com/thread/60919?start=0&tstart=0,我就不翻译了。当然,最好是设计师在设计资源的时候,如果使用的是5k的iMac或者2016年新推出的MacBook Pro,那么,不要选择默认的Display选项,要选择sRGB,这样图片资源就可以用于支持iOS 8和iOS 9.2版本的工程了。

You can find 16-bit or P3 assets by running “assetutil” on the asset catalog named in the error message from iTunes Connect. The following steps outline the process:
1. Create an Inspectable .ipa file. In the Xcode Organizer (Xcode->Window->Organizer), select an archive to inspect, click “Export…”, and choose “Export for Enterprise or Ad-Hoc Deployment”. This will create a local copy of the .ipa file for your app.
2. Locate that .ipa file and change its the extension to .zip.
3. Expand the .zip file. This will produce a Payload folder containing your .app bundle.
4. Open a terminal and change the working directory to the top level of your .app bundle
cd path/to/Payload/your.app

5. Use the find tool to locate Assets.car files in your .app bundle as shown below:
find . -name ‘Assets.car’

6. Use the assetutil tool to find any 16-bit or P3 assets, in each Assets.car your application has as shown below. :
sudo xcrun –sdk iphoneos assetutil –info /path/to/a/Assets.car > /tmp/Assets.json

7. Examine the resulting /tmp/Assets.json and look for any contents containing “DisplayGamut”: “P3” and its associated “Name”. This will be the name of your imageset containing one or more 16-bit or P3 assets.

8. Replace those assets with 8-bit / sRGB assets, then rebuild your app.

Update: If your Deployment Target is set to either 8.3 or 8.4 and you have an asset catalog then you will receive this same error message, even if you do not actually have 16-bit or P3 assets. In this case you will either need to lower your Deployment Target to 8.2, or move it up to 9.x.

如何用grep命令筛选,查找iOS的日志console log?

在iOS开发中,除了断点之外,一个最常见的调试方法就是查看iOS的log,我们在代码中经常会通过NSLog输出大量日志,然后查看日志,看看是否出现了什么异常情形。

然而,随着项目不断进展,iOS的log也越来越多,这导致我们常常需要在冗长的log中寻找需要的某几行log。令人感到遗憾的是,Xcode的Console只有一个find功能,其他功能都没有。

如果我们可以像在命令行一样用grep等工具对iOS的console进行筛选,那该多好啊。

我经过搜索,终于发现了这个工具https://github.com/rpetrich/deviceconsole

这是一个可以在Mac上显示iOS的console的工具,github上保存的是工具的源代码,编译后,你就得到一个名为deviceconsole的可执行文件,运行deviceconsole,它就将usb连接到Mac上的iphone的console输出到了当前的terminal中,我只要执行deviceconsole | grep “Hello World”,就可以只查看带Hello World文字的日志了。

此外,还可以deviceconsole > /tmp/console.log,这样子iOS的console就会重定向到/tmp/console.log了。

如果你希望只显示带“Hello World”的日志,你可以执行命令
tail -f /tmp/console.log | grep “Hello World”

如果你想要看之前输出的带有“Hello World”的日志,那么你可以执行命令
grep “Hello World” /tmp/console.log

retina macbook pro 15的两个display port都接了显示器后wifi不可用

前天,我把自己的retina macbook pro 15的两个thunderbolt口都接上了4k的显示器,然后,显示器接上后,wifi突然不可用了,表现形式为,wifi符号显示已经连接上,然而,无论如何都上不了网,访问任何网站都是time out错误,如果把其中一个显示器断开的话,就可以上网了。

我到网上搜索了一下,发现了这个thread

https://discussions.apple.com/thread/4155096?start=30&tstart=0

标题写的是“My wifi drops when I plug in an external monitor through the thunderbolt port”。

里面提到

If hooking up a thunderbolt output for a display and your wifi stops working try the following.

If your using an apple airport express go to the finder.

1. Type in airport, then open airport utility.

2. Click on Base Station.

3. Click Edit.

4. Click Wireless.

5. Open Wireless Options tab.

6. Where you see the 2.4GHz Channel listed change it to 4.

7. where you see 5GHz Channel Change it to 149

8. Click save and apply.

 

That should do the trick.

总结下来,就是5GHz的wifi的channel设置为149,2.4GHz的wifi的channel设置为4。

我这样设置后,果然也成功了,接上两个4k显示器后,wifi连接也一切正常。