xcode常见错误处理

xcode常见错误处理

更加详细的内容会同步更新在GitHub项目ios-Tips

Xcode 在OC、swift混编时报错错误内容

missing required module 'CommonCrypto'

出错原因:

` 由于苹果的C语言库在swift中没有对应的framework,所以OC框架在使用c语言库后作为外部框架导入后找不到原c语言框架 `

解决方法

` 新建对应的虚拟Framework(在此使用脚本自动生成模块并映射正确的Xcode/SDK路径),然后加入到项目依赖中,护体方法如下 `

  1. 选择xcode工程文件
  2. 选择info选项
  3. 添加target->Aggregate
  4. 添加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
    
  5. 选择Build Phases选项,将CommonCrypto框架添加到Target Dependencies
    image image

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

解决方法

  1. 打一个ipa包,解压你的应用的ipa包,进入到你应用的Playload文件夹。
  2. 用find命令定位到Assets.car文件 find . -name ‘Assets.car’
  3. 使用 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
    
  4. 打开刚才生成的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"
      }
    
  5. 找到对应的图片,使用mac自带的预览打开,编辑图片后保存就可以将图片保存成正确的格式
  6. 除了使用上面的方法,还可以使用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