xcode常见错误处理
更加详细的内容会同步更新在GitHub项目ios-Tips中
Xcode 在OC、swift混编时报错错误内容
missing required module 'CommonCrypto'
出错原因:
` 由于苹果的C语言库在swift中没有对应的framework,所以OC框架在使用c语言库后作为外部框架导入后找不到原c语言框架 `
解决方法
` 新建对应的虚拟Framework(在此使用脚本自动生成模块并映射正确的Xcode/SDK路径),然后加入到项目依赖中,护体方法如下 `
- 选择xcode工程文件
- 选择
info
选项 - 添加
target
->Aggregate
- 添加Script将如下脚本粘贴到图示处
mkdir -p "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap" cat <<EOF > "${BUILT_PRODUCTS_DIR}/CommonCryptoModuleMap/module.modulemap" module CommonCrypto [system] { header "${SDKROOT}/usr/include/CommonCrypto/CommonCrypto.h" export * } EOF
- 选择
Build Phases
选项,将CommonCrypto框架添加到Target Dependencies
BLYDataManager错误导致app在发布后IOS9.3一下系统异常崩溃
ios ipa测试时没任何问题但是上传AppStore后会在iOS 9上出现崩溃 下面是腾讯bugly给的崩溃信息
[BLYDataManager persistData:ofType:enableNotifications:withCompletionBlock:]_block_invoke
EXC_BAD_ACCESS
出错原因:
在Xcode8中,如果你的图片资源文件里有16位图或者图片显示模式为P3,并且Deployment Target是iOS9.3以下的就会出现这个问题。(话说我公司的项目里面就出现了一个小按钮,导致了这次崩溃,不知道设计师是怎么弄出来的这个特殊图片…)如果你的App需要支持wide color functionality,那你就必须设置Deployment Target为iOS9.3以上。如果你的APP不需要支持wide color functionality并且你希望兼容iOS老版本,那么你需要将所有16-bit or P3 assets的图片转换为8-bit sRGB assets
解决方法
- 打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
- 用find命令定位到Assets.car文件 find . -name ‘Assets.car’
- 使用 assetutil 命令导出图片的信息存储到Assets.json文件中
sudo xcrun --sdk iphoneos assetutil --info {Assets.car路径} > /tmp/Assets.json //示例: sudo xcrun --sdk iphoneos assetutil --info ./abc.app/Assets.car > /tmp/Assets.json
- 打开刚才生成的Assets.json文件,查找含有
"DisplayGamut" : "P3"
的内容。这个对应的Name就是出现问题的图片了。open /tmp/Assets.json
{ "Compression" : "lzfse", "BitsPerSample" : 16, "LayoutDirection" : "0 - Horizontal", "AssetType" : "Image", "ColorModel" : "RGB", "Name" : "CRM_msg_unread", "PixelWidth" : 90, "Graphics" : "GLES2,0", "Subtype" : 0, "PixelHeight" : 90, "SizeClass Horizontal" : "universal", "EdgeInsets" : "top:0 left:0 bottom:0 right:0", "Scale" : 1, "Memory" : "512MB", "Opaque" : false, "DisplayGamut" : "P3", "Idiom" : "universal", "Encoding" : "ARGB-16", "Image Type" : "kCoreThemeOnePartScale", "SizeClass Vertical" : "universal" }
- 找到对应的图片,使用mac自带的预览打开,编辑图片后保存就可以将图片保存成正确的格式
- 除了使用上面的方法,还可以使用bash script直接处理所有图片为正确格式,这样我们就不用去定位是哪个图片的问题了,或许更方便一些
#!/bin/bash DIRECTORY=$1 echo "------------------------------" echo "Passed Resources with xcassets folder argument is <$DIRECTORY>" echo "------------------------------" echo "Processing asset:" XSAASSETSD="$(find "$DIRECTORY" -name '*.xcassets')" for xcasset in $XSAASSETSD do echo "---$xcasset" IMAGESETS="$(find "$xcasset" -name '*.imageset')" for imageset in $IMAGESETS do echo "------$imageset" FILES="$(find "$imageset" -name '*.png')" for file in $FILES do echo "---------$file" sips -m "/System/Library/Colorsync/Profiles/sRGB Profile.icc" $file --out $file done done done echo "------------------------------" echo "script successfully finished" echo "------------------------------"
ipad alertController崩溃
同样的 UIAlertController 在iPhone上运行时正常,而切换到iPad上后发生崩溃
出错原因:
在iPad上,ActionSheet会被以popover的形式显示出来,它衣服在当前页面的某一个组件上,因为必须指定一个sourceView用于指定ActionSheet的依附点(在这个空间的周围被弹出),同时还应指定一个sourceRect用于指定他被包含在哪一片区域内
解决方法
//ipad使用,不加ipad上会崩溃
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = sender
popoverController.sourceRect = sender.bounds
}
注意:当你把一个Action的ActionStyle设置为cancel的时候,iPad将不会显示这个Action