You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:13:34