2025-11-21 18:26:02 +08:00
|
|
|
|
//
|
|
|
|
|
|
// KBExtensionAppLauncher.h
|
|
|
|
|
|
// CustomKeyboard
|
|
|
|
|
|
//
|
2026-03-05 14:30:07 +08:00
|
|
|
|
// 封装:在键盘扩展中拉起主 App(Scheme / Universal Link)。
|
2025-11-21 18:26:02 +08:00
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
@interface KBExtensionAppLauncher : NSObject
|
|
|
|
|
|
|
|
|
|
|
|
/// 通用入口:优先尝试 primaryURL,失败后尝试 fallbackURL,
|
2026-03-05 14:30:07 +08:00
|
|
|
|
/// 均通过 `extensionContext openURL` 发起跳转(避免使用扩展禁用 API/响应链绕行)。
|
|
|
|
|
|
/// 若开启 `KB_URL_BRIDGE_ENABLE=1`,会在两次 `extensionContext openURL` 均失败时,
|
2025-11-21 18:26:02 +08:00
|
|
|
|
/// - Parameters:
|
|
|
|
|
|
/// - primaryURL: 第一优先尝试的 URL(可为 Scheme 或 UL)
|
|
|
|
|
|
/// - fallbackURL: 失败时的备用 URL(可为 nil)
|
|
|
|
|
|
/// - ivc: 当前的 UIInputViewController(用于 extensionContext openURL)
|
2026-03-05 14:30:07 +08:00
|
|
|
|
/// - source: 作为响应链兜底的起点(可为 nil)
|
2025-11-21 18:26:02 +08:00
|
|
|
|
/// - completion: 最终是否“看起来已成功发起”打开动作(不保证一定跳转到 App)
|
|
|
|
|
|
+ (void)openPrimaryURL:(NSURL * _Nullable)primaryURL
|
|
|
|
|
|
fallbackURL:(NSURL * _Nullable)fallbackURL
|
|
|
|
|
|
usingInputController:(UIInputViewController *)ivc
|
2026-03-05 14:30:07 +08:00
|
|
|
|
source:(UIResponder * _Nullable)source
|
2025-11-21 18:26:02 +08:00
|
|
|
|
completion:(void (^ _Nullable)(BOOL success))completion;
|
|
|
|
|
|
|
2026-03-05 14:30:07 +08:00
|
|
|
|
/// 简化版:只针对单一 Scheme 做尝试。
|
2025-11-21 18:26:02 +08:00
|
|
|
|
+ (void)openScheme:(NSURL *)scheme
|
|
|
|
|
|
usingInputController:(UIInputViewController *)ivc
|
2026-03-05 14:30:07 +08:00
|
|
|
|
source:(UIResponder * _Nullable)source
|
2025-11-21 18:26:02 +08:00
|
|
|
|
completion:(void (^ _Nullable)(BOOL success))completion;
|
|
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
NS_ASSUME_NONNULL_END
|