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

React Native iOS Universal Link配置异常:Android正常iOS无法生效

我已完成Universal Link的全部配置步骤,Android端功能正常,但iOS端无法生效,无法定位问题所在。此前使用Firebase动态链接实现深度链接,现在希望通过网站URL添加Universal Link。以下是相关配置信息:


配置详情

  1. .well-known/apple-app-site-association文件(Team ID取自Xcode签名证书详情):
{"applinks":{"apps":[],"details":[{"appID":"teamIDxxx.com.james.gastro.mobile","paths":["*"]}]}}
  1. AppDelegate.m代码:
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <React/RCTLinkingManager.h>

#ifdef FB_SONARKIT_ENABLED
#import <FlipperKit/FlipperClient.h>
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>
#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>

static void InitializeFlipper(UIApplication *application) {
  FlipperClient *client = [FlipperClient sharedClient];
  SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
  [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
  [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
  [client addPlugin:[FlipperKitReactPlugin new]];
  [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
  [client start];
}
#endif
@import UIKit;
@import Firebase;
@import GoogleMaps;
#import <GoogleMaps/GoogleMaps.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <React/RCTLinkingManager.h>
#import <RNGoogleSignin/RNGoogleSignin.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [GMSServices provideAPIKey:@"xxx"];
#ifdef FB_SONARKIT_ENABLED
  InitializeFlipper(application);
#endif

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                   moduleName:@"JamesMobile"
                                            initialProperties:nil];

  if (@available(iOS 13.0, *)) {
      rootView.backgroundColor = [UIColor systemBackgroundColor];
  } else {
      rootView.backgroundColor = [UIColor whiteColor];
  }

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  [FIRApp configure];
  return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
 restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
 return [RCTLinkingManager application:application
                  continueUserActivity:userActivity
                    restorationHandler:restorationHandler];
}

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  
  if ([[FBSDKApplicationDelegate sharedInstance] application:app openURL:url options:options] || [RNGoogleSignin application:app openURL:url options:options]) {
     return YES;
   }

   return [RCTLinkingManager application:app openURL:url options:options];

   return NO;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

@end
  1. Header Search Paths:
"$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS" (recursive)
  1. Associated Domains/Domains:
applinks:webapp.stage.gastrojames.ch
  1. Info/URL Types:
    URL Types配置截图

排查建议

1. 验证apple-app-site-association文件

  • 确保文件通过HTTPS直接访问(无重定向),响应头Content-Type必须为application/json,不能是text/plain
  • 校验appID格式:TeamID.BundleID,确认Team ID与签名证书、Xcode配置完全一致,Bundle ID与项目CFBundleIdentifier完全匹配
  • 用JSON校验工具确认文件格式无语法错误

2. 检查Xcode配置

  • 确认Associated Domains已开启,域名格式正确(无https前缀)
  • 登录Apple Developer后台,检查对应签名证书是否包含Associated Domains权限
  • 确保Debug/Release环境的签名、Associated Domains配置一致

3. 调试AppDelegate逻辑

  • 在continueUserActivity方法中添加日志,确认该方法是否被调用:
    - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
    {
        NSLog(@"Received Universal Link: %@", userActivity.webpageURL);
        BOOL handled = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
        NSLog(@"Link handled by RCTLinkingManager: %d", handled);
        return handled;
    }
    
  • 检查Firebase动态链接是否未完全移除,避免与Universal Link冲突

4. 测试方式修正

  • 不要直接在Safari地址栏输入链接测试,改用短信/备忘录/第三方App分享后点击链接
  • 卸载App后重新安装(清除缓存),使用Ad Hoc或TestFlight包测试(Debug包可能存在缓存问题)
  • 重置Safari缓存:设置→Safari浏览器→清除历史记录与网站数据,或重启设备

内容的提问来源于stack exchange,提问作者Berke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:24:33