内容简介:自从出于此原因考虑, 我便一直在使用然而每每使用低版本的
自从 Xcode10
正式版发布之后, 先吃螃蟹的朋友赞叹了 Dark Mode
的惊艳, 同时也报告说, 打包上传到 APPStroe
后, 监测到线上 iOS9.3
设备大面积crash的记录, 最后被证实是 Xcode10
的问题.
出于此原因考虑, 我便一直在使用 Xcode9.4.1
及 Swift4
进行混编项目的开发.
然而每每使用低版本的 Xcode
打包上传 APPStore
时, 就会收到苹果的官方警告邮件
如邮件内容所示, 到 2019
年的 3
月份便不可以再使用低版本 Xcode
进行打包上传操作了.
于是, 我只好开始了迁移之路.
开始迁移
使用当前 Xcode10.1(10B61)
打开之后, 在 Build Setting
中搜索 Swift Language Version
, 将对应的值改为 Swift 4.2
,然后开始编译, 此时会出现非常多的 Error
, 多为 ABI
的变动, 根据提示进行修改即可.
AVAudioSession的更改
然而有一处例外:
当项目中通过 Swift
使用了 AVAudioSession setCategory
这个方法时, 会被告知方法在 Swift
中不可用.跳转才发现 API
已经变化成了
/* set session category and mode with options */ @available(iOS 10.0, *) open func setCategory(_ category: AVAudioSession.Category, mode: AVAudioSession.Mode, options: AVAudioSession.CategoryOptions = []) throws 复制代码
为了兼容低版本, 思来想去, 比较合适的方案就是使用OC编写一个 AVAudioSession
的分类用来桥接:
// AVAudioSession+Swift.h: @import AVFoundation; NS_ASSUME_NONNULL_BEGIN @interface AVAudioSession (Swift) - (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:)); - (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError NS_SWIFT_NAME(setCategory(_:options:)); @end NS_ASSUME_NONNULL_END // AVAudioSession+Swift.m: #import "AVAudioSession+Swift.h" @implementation AVAudioSession (Swift) - (BOOL)swift_setCategory:(AVAudioSessionCategory)category error:(NSError **)outError { return [self setCategory:category error:outError]; } - (BOOL)swift_setCategory:(AVAudioSessionCategory)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return [self setCategory:category withOptions:options error:outError]; } @end 复制代码
然后在你项目的 <#target_name#>-Bridging-Header.h
中 import
这个分类:
#import "AVAudioSession+Swift.h" 复制代码
然后就可以像之前一样调用了.
try AVAudioSession.sharedInstance().setCategory(.playback) 复制代码
While deserializing SIL vtable for 'Class' in module 'module' error: Abort trap: 6
这类问题分两种, 一种是 module
是其他的 target
, 如 Pods
中的, 另一种是 module
是自己的创建的 target
.
第一种
第一种 只需要将 Error
所指向的三方库更新到最新版本即可, Xcode10
已经发布了快半年了, 这些问题之前也有, 半年的时间, 基本上流行的三方库都已经适配了 Swift4.2
第二种
而第二种比较棘手, 一般都是由于 Error
中的 Class
所指向的类, 自己是 Swift
类, 但是却继承自 Object-C
声明编写的类. 我在自己试过一些微调之后发现于事无补, 所以只好将出错的类使用 Object-C
重写, 然后在桥接文件中引入, 好在报错的不多, 没用费太多力气.
其他奇怪的错误
迁移完成后 项目跑起来时, 还会出现很多奇怪的问题. 比如调用了某个方法A 会报 unrecognize selector *
, 以及莫名的 函数调用
, 如:
(setupNavibar函数中并没用调用任何初始化构造函数)
这类错误, 一般跟以上的俩种问题是一个本质, 需要自己仔细区别, 然后做出相应更新/更改即可.
除开以上的问题, 项目编译时还会在 Pods
引用的第三方的类中报ABI需要修改的 Error
, 这时, 只需要找到队形的 Target
, 在其 Build Settings
中修改 Swift Language Version
为其对应版本即可.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Swift学习之与OC混编
- iOS Native混编Flutter交互实践
- Flutter 开发 (2)优雅的 Flutter 组件化 混编方案
- OC和Swift混编(一)——OC与Swift相互调用
- 从预编译的角度理解 Swift 与 Objective-C 及混编机制
- D语言/dlang 2.085.0 发布,GC、Objective-C 混编增强
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。