Canoe

iOS11适配以及Xcode9实用新特性

2017.09.10

本篇文章是基于我自己的项目在更新iOS11时遇到的一些问题总结的,可能不会考虑到所有的变化,会在一段时间内补充和完善。

iOS11适配

UITableView 的新特性

在iOS11中默认启用self-Sizing,Self-Sizing在iOS11下是默认开启的,Headers, footers, 和 cells都默认开启Self-Sizing,所有estimated 高度默认值从iOS11之前的 0 改变为UITableViewAutomaticDimension

如果目前项目中没有使用estimateRowHeight属性,在iOS11的环境下就要注意了,因为开启Self-Sizing之后,tableView是使用estimateRowHeight属性的,这样就会造成contentSize和contentOffset值的变化,如果是有动画是观察这两个属性的变化进行的,就会造成动画的异常,因为在估算行高机制下,contentSize的值是一点点地变化更新的,所有cell显示完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。iOS11下不想使用Self-Sizing的话,可以通过以下方式关闭:

iOS11部分app图标显示异常

升级iOS11后,我所开发的YepicApp突然图标无法显示,显示出默认的图片,检查了发现appIcon设置正常,其他的app显示也没问题,经过询问以及查找资料,在github上面一个哥们那找到了解决方案

使用了CocoaPods的Xcode工程,在iOS11版的手机上AppIcon不显示,原因是CocoaPods的资源编译脚本在iOS11下出了点问题.需要修改脚本.两种修改方式:
1.在Podfile添加脚本修改:
1). 在Podfile 添加如下代码.

post_install do |installer|
    copy_pods_resources_path = "Pods/Target Support Files/Pods-[工程名]/Pods-[工程名]-resources.sh"
    string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'
    assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'
    text = File.read(copy_pods_resources_path)
    new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)
    File.open(copy_pods_resources_path, "w") {|file| file.puts new_contents }
end

需要注意的是,将[工程名] 换成自己工程的名称
2).然后运行
$pod install

2.手动修改
打开工程目录下:[工程名]_Pods_Target Support Files_Pods-[工程名]_Pods-[工程名]-resources.sh这个文件,替换最后一段代码:
修改前:

 printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi

修改后:

printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"
fi

然后重新运行工程即可。

定位权限有更新

这两天在使用高德地图的时候突然发现没办法获取到定位信息,方法没有得到回调,询问了高德的客服回答说iOS11定位权限有更新。

定位权限
在项目的 Info.plist 添加 NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription字段,根据您的业务需求,任选其一即可。
注意:iOS 11 在权限上有更新,请参考。
其中:

  • iOS 8 - iOS 10 版本:

NSLocationWhenInUseUsageDescription表示应用在前台的时候可以搜到更新的位置信息。
NSLocationAlwaysUsageDescription 申请Always权限,以便应用在前台和后台(suspend 或 terminated)都可以获取到更新的位置数据。

  • iOS 11 版本:

NSLocationWhenInUseUsageDescription 表示应用在前台的时候可以搜到更新的位置信息。
NSLocationAlwaysAndWhenInUseUsageDescription 申请Always权限,以便应用在前台和后台(suspend 或 terminated)都可以获取到更新的位置数据。


Xcode9实用新特性

无线调试

新版本Xcode最让我期待的就是这个功能了,试用了一下真的非常舒服。

一、首先确保安装 iOS11 的 iPhone 或者 iPad 连接到 电脑上,并且电脑和手机处于同一网络下。

二、在 Xcode 菜单栏选择Window> Devices and Simulators, 选中左边的 Devices

出现自己的设备后,勾选 Connect via network选项,勾选后可以在左侧看到设备名称后面出现一个网络连接的图标。如图所示:

当连接成功后拔掉数据线,在 Xcode运行时依旧可以选择刚才的设备,如图所示,Xcode 运行成功,手机也已经拔掉了数据线,软件成功运行。

完成!

Comments
Write a Comment