Files
tauri-plugins-workspace/plugins/opener/ios/Sources/OpenerPlugin.swift
T
42ae8b4501 fix(ios): make init_plugin_* entry points public so release builds link on Xcode 27 (#3684)
* fix(ios): make `init_plugin_*` entry points public so release builds link on Xcode 27

Xcode 27's SwiftPM (Swift Build) gives non-public @_cdecl functions local
visibility in release builds, so each plugin's init_plugin_* is undefined
when Rust links. Mark them public in the 11 plugins with an iOS part.

See tauri-apps/tauri#16130

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Apply suggestion from @lucasfernog

---------

Co-authored-by: takakix2 <1370181+takakix2@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Lucas Fernandes Nogueira <lucas@tauri.app>
2026-10-10 08:09:53 -03:00

47 lines
1.1 KiB
Swift

// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import Foundation
import SafariServices
import SwiftRs
import Tauri
import UIKit
import WebKit
struct OpenArgs: Decodable {
let url: String
let with: String?
}
class OpenerPlugin: Plugin {
@objc public func open(_ invoke: Invoke) throws {
do {
let args = try invoke.parseArgs(OpenArgs.self)
if let url = URL(string: args.url) {
if args.with == "inAppBrowser" {
DispatchQueue.main.async {
let safariVC = SFSafariViewController(url: url)
self.manager.viewController?.present(safariVC, animated: true)
}
} else {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:])
} else {
UIApplication.shared.openURL(url)
}
}
}
invoke.resolve()
} catch {
invoke.reject(error.localizedDescription)
}
}
}
@_cdecl("init_plugin_opener")
public func initPlugin() -> Plugin {
return OpenerPlugin()
}