Skip to content

Commit 8845337

Browse files
committed
Bump to v2.4.2
2 parents dffd42b + 84a63e7 commit 8845337

File tree

7 files changed

+34
-32
lines changed

7 files changed

+34
-32
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [v2.4.2](https://github.com/stleamist/BetterSafariView/releases/tag/v2.4.2) (2023-10-30)
4+
### Fixed
5+
- Fixed an issue where the `SafariViewPresenter` fails to find a view controller to presented from (#41 & #46). Thanks, @Tunous and @SongJiyeon!
6+
37
## [v2.4.1](https://github.com/stleamist/BetterSafariView/releases/tag/v2.4.1) (2023-01-15)
48
### Fixed
59
- Fixed an issue where the `WebAuthenticationPresenter` fails to find its presentation anchor (#22). Thanks, @kevvdevv, @exentrich, and @ldstreet!

Demo/iOS/Views/RootView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ struct RootView: View {
7373
WebAuthenticationSessionOptionsForm(options: $webAuthenticationSessionOptions)
7474
}
7575
}
76-
76+
7777
Section(header: Text("NaiveSafariView" + "\n" + "(Just for comparison. Do not use in practice.)").textCase(nil)) {
7878
Button(action: { showingNaiveSafariViewSheet = true }) {
7979
HStack {

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ func prefersEphemeralWebBrowserSession(_ prefersEphemeralWebBrowserSession: Bool
285285
Add the following line to the `dependencies` in your [`Package.swift`](https://developer.apple.com/documentation/swift_packages/package) file:
286286

287287
```swift
288-
.package(url: "https://github.com/stleamist/BetterSafariView.git", .upToNextMajor(from: "2.4.1"))
288+
.package(url: "https://github.com/stleamist/BetterSafariView.git", .upToNextMajor(from: "2.4.2"))
289289
```
290290

291291
Next, add `BetterSafariView` as a dependency for your targets:
@@ -304,7 +304,7 @@ import PackageDescription
304304
let package = Package(
305305
name: "MyPackage",
306306
dependencies: [
307-
.package(url: "https://github.com/stleamist/BetterSafariView.git", .upToNextMajor(from: "2.4.1"))
307+
.package(url: "https://github.com/stleamist/BetterSafariView.git", .upToNextMajor(from: "2.4.2"))
308308
],
309309
targets: [
310310
.target(name: "MyTarget", dependencies: ["BetterSafariView"])

Sources/BetterSafariView/SafariView/SafariViewPresenter.swift

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import SwiftUI
44
import SafariServices
55

6+
// `SafariViewPresenter` conforms `UIViewRepresentable` instead of `UIViewControllerRepresentable`.
7+
// This fixes an issue where the Safari view controller is not presented properly
8+
// when the `UIViewControllerRepresentable` is detached from the root view controller
9+
// (e.g. `UIViewController` contained in `UITableViewCell`).
610
struct SafariViewPresenter<Item: Identifiable>: UIViewRepresentable {
711

812
// MARK: Representation
@@ -79,13 +83,14 @@ extension SafariViewPresenter {
7983
let safariViewController = SFSafariViewController(url: representation.url, configuration: representation.configuration)
8084
safariViewController.delegate = self
8185
representation.applyModification(to: safariViewController)
82-
83-
// Present a Safari view controller from the `viewController` of `UIViewRepresentable`, instead of `UIViewControllerRepresentable`.
84-
// This fixes an issue where the Safari view controller is not presented properly
85-
// when the `UIViewControllerRepresentable` is detached from the root view controller (e.g. `UIViewController` contained in `UITableViewCell`)
86-
// while allowing it to be presented even on the modal sheets.
87-
// Thanks to: Bohdan Hernandez Navia (@boherna)
88-
guard let presentingViewController = uiView.viewController else {
86+
87+
// Presents a Safari view controller from the farthest `presentedViewController` of `UIWindow`.
88+
// (same approach when presenting `UIAlertController`)
89+
guard let presentingViewController = uiView.window?.farthestPresentedViewController else {
90+
assertionFailure(
91+
"Cannot find the view controller to present from."
92+
+ " This happens when a 'SafariViewPresenter' is detached from the window, or the window doesn't have 'rootViewController.'"
93+
)
8994
self.resetItemBinding()
9095
return
9196
}

Sources/BetterSafariView/Shared/UIView+viewController.swift

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if os(iOS)
2+
3+
import UIKit
4+
5+
extension UIWindow {
6+
7+
/// The view controller that was presented modally on top of the window.
8+
var farthestPresentedViewController: UIViewController? {
9+
guard let rootViewController = rootViewController else { return nil }
10+
return Array(sequence(first: rootViewController, next: \.presentedViewController)).last
11+
}
12+
}
13+
14+
#endif

Sources/BetterSafariView/WebAuthenticationSession/WebAuthenticationPresenter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ extension WebAuthenticationPresenter {
199199

200200
@available(iOS, introduced: 13.0, deprecated: 14.0)
201201
func setInteractiveDismissalDelegateIfPossible() {
202-
guard let safariViewController = view.viewController?.presentedViewController as? SFSafariViewController else {
202+
guard let safariViewController = view.window?.farthestPresentedViewController as? SFSafariViewController else {
203203
return
204204
}
205205
safariViewController.presentationController?.delegate = interactiveDismissalDelegate

0 commit comments

Comments
 (0)