Skip to content

Commit 281c628

Browse files
authored
fix(ios): avoid crash on Xcode 11.4 (#2651)
1 parent c3ebd15 commit 281c628

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

ios/Capacitor/Capacitor/CAPBridge.swift

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ enum BridgeError: Error {
4040
public var scheme: String
4141
// Whether the app is active
4242
private var isActive = true
43+
// Wheter to inject the Cordova files
44+
private var injectCordovaFiles = false
4345

4446
// Background dispatch queue for plugin calls
4547
public var dispatchQueue = DispatchQueue(label: "bridge")
@@ -207,16 +209,6 @@ enum BridgeError: Error {
207209
* their JS.
208210
*/
209211
func setupCordovaCompatibility() {
210-
var injectCordovaFiles = false
211-
var numClasses = UInt32(0);
212-
let classes = objc_copyClassList(&numClasses)
213-
for i in 0..<Int(numClasses) {
214-
let c: AnyClass = classes![i]
215-
if class_getSuperclass(c) == CDVPlugin.self {
216-
injectCordovaFiles = true
217-
break
218-
}
219-
}
220212
if injectCordovaFiles {
221213
exportCordovaJS()
222214
registerCordovaPlugins()
@@ -246,20 +238,29 @@ enum BridgeError: Error {
246238
* Register all plugins that have been declared
247239
*/
248240
func registerPlugins() {
249-
var numClasses = UInt32(0);
250-
let classes = objc_copyClassList(&numClasses)
241+
let classCount = objc_getClassList(nil, 0)
242+
let classes = UnsafeMutablePointer<AnyClass?>.allocate(capacity: Int(classCount))
243+
244+
let releasingClasses = AutoreleasingUnsafeMutablePointer<AnyClass>(classes)
245+
let numClasses: Int32 = objc_getClassList(releasingClasses, classCount)
246+
251247
for i in 0..<Int(numClasses) {
252-
let c: AnyClass = classes![i]
253-
if class_conformsToProtocol(c, CAPBridgedPlugin.self) {
254-
let pluginClassName = NSStringFromClass(c)
255-
let pluginType = c as! CAPPlugin.Type
256-
let bridgeType = c as! CAPBridgedPlugin.Type
257-
258-
registerPlugin(pluginClassName, bridgeType.jsName(), pluginType)
248+
if let c: AnyClass = classes[i] {
249+
if class_getSuperclass(c) == CDVPlugin.self {
250+
injectCordovaFiles = true
251+
}
252+
if class_conformsToProtocol(c, CAPBridgedPlugin.self) {
253+
let pluginClassName = NSStringFromClass(c)
254+
let pluginType = c as! CAPPlugin.Type
255+
let bridgeType = c as! CAPBridgedPlugin.Type
256+
257+
registerPlugin(pluginClassName, bridgeType.jsName(), pluginType)
258+
}
259259
}
260260
}
261+
classes.deallocate()
261262
}
262-
263+
263264
/**
264265
* Register a single plugin.
265266
*/

0 commit comments

Comments
 (0)