iOS平台下基于C++与SDL的Universal Links适配问题咨询
在SDL 2 iOS应用中实现Universal Links支持
无需修改SDL源码的解决方案
SDL 2在iOS端默认使用SDLAppDelegate作为应用代理类,我们可以通过**Objective-C分类(Category)**扩展这个类,实现Universal Links的回调方法,完全不需要修改SDL的源码。
步骤1:创建Objective-C分类扩展SDLAppDelegate
创建两个文件:SDLAppDelegate+UniversalLinks.h 和 SDLAppDelegate+UniversalLinks.m,用来扩展SDL的代理类,处理Universal Links的回调。
头文件(SDLAppDelegate+UniversalLinks.h)
#import <UIKit/UIKit.h> #import <SDL2/SDL.h> @interface SDLAppDelegate (UniversalLinks) @end
实现文件(SDLAppDelegate+UniversalLinks.m)
#import "SDLAppDelegate+UniversalLinks.h" // 引入C++侧的处理头文件 #import "UniversalLinkHandler.h" @implementation SDLAppDelegate (UniversalLinks) // Universal Links的核心回调:当用户通过Universal Link打开应用时触发 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { // 验证是否为网页浏览类型的UserActivity(即Universal Links触发) if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *universalLinkURL = userActivity.webpageURL; if (universalLinkURL) { // 将OC的NSURL转成C语言字符串,传递给C++逻辑 const char *urlString = [universalLinkURL.absoluteString UTF8String]; handleUniversalLink(urlString); } } // 返回YES表示已处理该请求 return YES; } // 可选:如果需要支持旧版URL Schemes,可添加此方法 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { const char *urlString = [url.absoluteString UTF8String]; handleUniversalLink(urlString); return YES; } @end
步骤2:编写C++侧的URL处理逻辑
创建C++的头文件和实现文件,用来接收OC传递过来的URL,并提供回调接口给你的主业务逻辑。
C++头文件(UniversalLinkHandler.h)
#ifndef UniversalLinkHandler_h #define UniversalLinkHandler_h // 用extern "C"保证OC能正确调用C++函数 #ifdef __cplusplus extern "C" { #endif // 定义回调函数类型,你的C++业务逻辑将通过此函数接收URL typedef void (*UniversalLinkCallback)(const char* url); // 设置回调函数(在你的C++主逻辑中调用) void setUniversalLinkCallback(UniversalLinkCallback callback); // OC端会调用此函数传递URL void handleUniversalLink(const char* url); #ifdef __cplusplus } #endif #endif /* UniversalLinkHandler_h */
C++实现文件(UniversalLinkHandler.cpp)
#include "UniversalLinkHandler.h" // 静态变量存储回调函数指针 static UniversalLinkCallback s_linkCallback = nullptr; void setUniversalLinkCallback(UniversalLinkCallback callback) { s_linkCallback = callback; } void handleUniversalLink(const char* url) { // 如果已设置回调,就把URL传递给业务逻辑 if (s_linkCallback != nullptr && url != nullptr) { s_linkCallback(url); } }
步骤3:在C++主逻辑中接收URL
在你的C++应用初始化代码中,设置回调函数,即可接收从OC传递过来的Universal Link URL:
#include "UniversalLinkHandler.h" #include <iostream> // 自定义的URL处理函数,在这里编写你的业务逻辑 void handleReceivedUniversalLink(const char* url) { std::cout << "Received Universal Link: " << url << std::endl; // 例如:解析URL参数、跳转对应页面等 } int main(int argc, char* argv[]) { // 初始化SDL if (SDL_Init(SDL_INIT_VIDEO) < 0) { // 处理初始化失败 return 1; } // 设置Universal Link回调 setUniversalLinkCallback(handleReceivedUniversalLink); // 进入SDL事件循环(你的应用主逻辑) bool running = true; SDL_Event event; while (running) { while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { running = false; } } // 渲染等业务逻辑... } // 清理SDL资源 SDL_Quit(); return 0; }
注意事项
- 确保在Xcode项目中正确配置Associated Domains(添加
applinks:你的域名),这是Universal Links生效的前提。 - 分类文件需要被正确添加到Xcode项目的编译目标中,否则不会生效。
- 如果你的OC实现文件中需要直接编写C++代码,需要将文件后缀从
.m改为.mm(本示例中不需要,因为仅调用C接口)。
内容的提问来源于stack exchange,提问作者jcxz
相关产品推荐
相关产品推荐

