Skip to content

Commit 4aceda7

Browse files
committed
fix: remove bridge! force-unwrap that crashes on RN 0.84+ bridgeless mode
Fixes #4195
1 parent c1f986f commit 4aceda7

5 files changed

Lines changed: 30 additions & 12 deletions

File tree

ios/RNMBX/RNMBXImageQueue.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,15 @@ class RNMBXImageQueueOperation : Operation {
6767

6868
DispatchQueue.global(qos: .default).async {
6969
if let weakSelf = weakSelf {
70-
let loader : RCTImageLoaderProtocol = weakSelf.bridge!.module(forName: "ImageLoader", lazilyLoadIfNecessary: true) as! RCTImageLoaderProtocol
70+
guard let bridge = weakSelf.bridge else {
71+
Logger.log(level: .error, message: "RNMBXImageQueue: bridge is nil, cannot load image")
72+
if let completionHandler = weakSelf.completionHandler {
73+
completionHandler(NSError(domain: "RNMBXImageQueue", code: 1, userInfo: [NSLocalizedDescriptionKey: "bridge is nil"]), nil)
74+
}
75+
_ = weakSelf.setState(state:.Finished, except:.Finished)
76+
return
77+
}
78+
let loader : RCTImageLoaderProtocol = bridge.module(forName: "ImageLoader", lazilyLoadIfNecessary: true) as! RCTImageLoaderProtocol
7179

7280
let cancellationBlock = loader.loadImage(with: weakSelf.urlRequest, size: .zero, scale: CGFloat(weakSelf.scale), clipped: true, resizeMode: .stretch, progressBlock: { _,_ in }, partialLoad: { _ in }) { error, image in
7381
if let completionHandler = weakSelf.completionHandler {

ios/RNMBX/RNMBXImages.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ open class RNMBXImages : UIView, RNMBXMapComponent {
130130
}
131131

132132
if missingImages.count > 0 {
133+
guard let bridge = bridge else {
134+
Logger.log(level: .error, message: "RNMBXImages: bridge is nil, cannot fetch images. Use nativeAssetImages instead.")
135+
return
136+
}
133137
RNMBXUtils.fetchImages(bridge, style: style, objects: missingImages, forceUpdate: true) { name, image in
134138
self.loadedImages.insert(name)
135139
self.imageManager?.resolve(name: name, image: image)

ios/RNMBX/RNMBXStyle.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func fillLayer(layer: inout FillLayer, reactStyle:Dictionary<String, Any>, oldRe
5353
self.setFillTranslateAnchor(&layer, styleValue:styleValue);
5454
} else if (prop == "fillPattern") {
5555
styleValue.setImage(
56-
bridge: bridge!,
56+
bridge: bridge,
5757
style: style,
5858
oldValue: oldReactStyle?[prop],
5959
setImageOnLayer: { (_) in self.setFillPattern(&layer, styleValue:styleValue) },
@@ -63,7 +63,7 @@ func fillLayer(layer: inout FillLayer, reactStyle:Dictionary<String, Any>, oldRe
6363
)
6464
} else if (prop == "fillPatternCrossFade") {
6565
styleValue.setImage(
66-
bridge: bridge!,
66+
bridge: bridge,
6767
style: style,
6868
oldValue: oldReactStyle?[prop],
6969
setImageOnLayer: { (_) in self.setFillPatternCrossFade(&layer, styleValue:styleValue) },
@@ -142,7 +142,7 @@ func lineLayer(layer: inout LineLayer, reactStyle:Dictionary<String, Any>, oldRe
142142
self.setLineDasharray(&layer, styleValue:styleValue);
143143
} else if (prop == "linePattern") {
144144
styleValue.setImage(
145-
bridge: bridge!,
145+
bridge: bridge,
146146
style: style,
147147
oldValue: oldReactStyle?[prop],
148148
setImageOnLayer: { (_) in self.setLinePattern(&layer, styleValue:styleValue) },
@@ -174,7 +174,7 @@ func lineLayer(layer: inout LineLayer, reactStyle:Dictionary<String, Any>, oldRe
174174
self.setLineElevationGroundScaleTransition(&layer, styleValue:styleValue);
175175
} else if (prop == "linePatternCrossFade") {
176176
styleValue.setImage(
177-
bridge: bridge!,
177+
bridge: bridge,
178178
style: style,
179179
oldValue: oldReactStyle?[prop],
180180
setImageOnLayer: { (_) in self.setLinePatternCrossFade(&layer, styleValue:styleValue) },
@@ -243,7 +243,7 @@ func symbolLayer(layer: inout SymbolLayer, reactStyle:Dictionary<String, Any>, o
243243
self.setIconTextFitPadding(&layer, styleValue:styleValue);
244244
} else if (prop == "iconImage") {
245245
styleValue.setImage(
246-
bridge: bridge!,
246+
bridge: bridge,
247247
style: style,
248248
oldValue: oldReactStyle?[prop],
249249
setImageOnLayer: { (_) in self.setIconImage(&layer, styleValue:styleValue) },
@@ -379,7 +379,7 @@ func symbolLayer(layer: inout SymbolLayer, reactStyle:Dictionary<String, Any>, o
379379
self.setTextEmissiveStrengthTransition(&layer, styleValue:styleValue);
380380
} else if (prop == "iconImageCrossFade") {
381381
styleValue.setImage(
382-
bridge: bridge!,
382+
bridge: bridge,
383383
style: style,
384384
oldValue: oldReactStyle?[prop],
385385
setImageOnLayer: { (_) in self.setIconImageCrossFade(&layer, styleValue:styleValue) },
@@ -546,7 +546,7 @@ func fillExtrusionLayer(layer: inout FillExtrusionLayer, reactStyle:Dictionary<S
546546
self.setFillExtrusionTranslateAnchor(&layer, styleValue:styleValue);
547547
} else if (prop == "fillExtrusionPattern") {
548548
styleValue.setImage(
549-
bridge: bridge!,
549+
bridge: bridge,
550550
style: style,
551551
oldValue: oldReactStyle?[prop],
552552
setImageOnLayer: { (_) in self.setFillExtrusionPattern(&layer, styleValue:styleValue) },
@@ -576,7 +576,7 @@ func fillExtrusionLayer(layer: inout FillExtrusionLayer, reactStyle:Dictionary<S
576576
self.setFillExtrusionRoundedRoof(&layer, styleValue:styleValue);
577577
} else if (prop == "fillExtrusionPatternCrossFade") {
578578
styleValue.setImage(
579-
bridge: bridge!,
579+
bridge: bridge,
580580
style: style,
581581
oldValue: oldReactStyle?[prop],
582582
setImageOnLayer: { (_) in self.setFillExtrusionPatternCrossFade(&layer, styleValue:styleValue) },
@@ -895,7 +895,7 @@ func backgroundLayer(layer: inout BackgroundLayer, reactStyle:Dictionary<String,
895895
self.setBackgroundColorTransition(&layer, styleValue:styleValue);
896896
} else if (prop == "backgroundPattern") {
897897
styleValue.setImage(
898-
bridge: bridge!,
898+
bridge: bridge,
899899
style: style,
900900
oldValue: oldReactStyle?[prop],
901901
setImageOnLayer: { (_) in self.setBackgroundPattern(&layer, styleValue:styleValue) },

ios/RNMBX/RNMBXStyleValue.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ class RNMBXStyleValue {
450450
}
451451

452452
func setImage(
453-
bridge: RCTBridge,
453+
bridge: RCTBridge?,
454454
style: Style,
455455
oldValue: Any?,
456456
setImageOnLayer: (_: RNMBXStyleValue) -> Void,
@@ -474,6 +474,12 @@ class RNMBXStyleValue {
474474
}
475475
}
476476

477+
guard let bridge = bridge else {
478+
Logger.log(level: .error, message: "\(name): bridge is nil, cannot fetch image \(optional: imageURI). Use nativeAssetImages instead.")
479+
setImageOnLayer(self)
480+
return
481+
}
482+
477483
RNMBXUtils.fetchImage(bridge, url:imageURI, scale:getImageScale(), callback:{ (error, image) in
478484
if let image = image {
479485
DispatchQueue.main.sync {

scripts/templates/RNMBXStyle.swift.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func <%- setLayerMethodName(layer, 'ios') -%>(layer: inout <%- getLayerType(laye
3535
<%- ifOrElseIf(i) -%> (prop == "<%= layer.properties[i].name %>") {
3636
<%_ if (layer.properties[i].image) { _%>
3737
styleValue.setImage(
38-
bridge: bridge!,
38+
bridge: bridge,
3939
style: style,
4040
oldValue: oldReactStyle?[prop],
4141
setImageOnLayer: { (_) in self.set<%- iosPropMethodName(layer, pascelCase(layer.properties[i].name)) -%>(&layer, styleValue:styleValue) },

0 commit comments

Comments
 (0)