PAYATHON 2026

iOS 26.2 如何让 UIActivityViewController 显示紧凑分享面板?

数据阿明

结论

UIActivityViewController 没有公开的专用开关,能够保证强制显示题目所述的紧凑悬浮分享面板。遇到这种新旧外观差异,先检查应用是否启用了 UIDesignRequiresCompatibility,再确认实际使用的 SDK 和呈现代码。

现有代码没有展示应用的最终配置和完整呈现上下文,暂时无法确定具体原因。切换 NSString、NSURL 或 UIActivityItemsConfiguration 也不能用来选择紧凑外观。

先检查 UI 兼容模式

Apple 文档说明,UIDesignRequiresCompatibility 为 YES 时,系统会启用 UI 兼容模式,使应用保持旧版 SDK 对应的外观。对于链接最新 SDK 的应用,缺省或 NO 表示不启用兼容模式。Apple:UIDesignRequiresCompatibility

如果你的 iOS 26 构建中包含以下配置,先确认它是否由项目主动保留:

<key>UIDesignRequiresCompatibility</key>
<true/>

准备采用新设计时,可以删除该键,或将其设为 Boolean 类型的 false:

<key>UIDesignRequiresCompatibility</key>
<false/>

建议同时读取运行中应用的实际配置,避免只检查了一个没有参与当前构建的 plist 文件:

id compatibility = [[NSBundle mainBundle]
    objectForInfoDictionaryKey:@"UIDesignRequiresCompatibility"];
NSLog(@"UIDesignRequiresCompatibility = %@", compatibility);

读取结果为 nil 表示该键未设置。修改配置后,需要重新构建并运行应用。

这项设置会影响应用整体的系统 UI 外观,并非只针对分享面板,也不保证面板高度固定。关闭兼容模式后,应同时检查导航栏、标签栏和其他 sheet。

确认 SDK,并用最小实现对照

Apple 的 Liquid Glass 适配指南要求使用最新 SDK 构建,并说明标准 UIKit 组件会自动采用新的系统外观。因此,除了查看 Xcode 版本,还要确认当前 target 实际使用的 Base SDK。Apple:Adopting Liquid Glass

确认没有启用兼容模式后,先保留最简单的分享实现:

UIActivityViewController *vc = [[UIActivityViewController alloc]
    initWithActivityItems:@[@"Check out this app!"]
    applicationActivities:nil];

[self presentViewController:vc animated:YES completion:nil];

从一个普通且当前可见的 UIViewController 中调用这段代码,并与业务页面对比。如果两者表现不同,再检查业务代码是否修改了 modalPresentationStyle、添加了容器包装,或使用了自定义转场。这些变量需要逐项排查;现有材料不足以认定其中某一项就是原因。

Apple 要求在 iPhone 上使用模态呈现,在 iPad 上使用 popover。不要把 iPad 的 popover 配置当作 iPhone 紧凑分享面板的强制开关。Apple:UIActivityViewController

LPLinkMetadata 负责链接预览

activityViewControllerLinkMetadata: 用于提供分享面板预览区域的链接元数据。已有元数据时,直接返回它可以避免再次联网获取预览;Apple 没有将这个方法定义为启用紧凑样式的条件。Apple:activityViewControllerLinkMetadata:

原来的第四段代码中还有一处独立的 API 拼写问题:Objective-C 中对应的属性是 URL,应使用 metadata.URL。可以按以下方式补全元数据:

- (LPLinkMetadata *)activityViewControllerLinkMetadata:
    (UIActivityViewController *)activityViewController {
    NSURL *url = [NSURL URLWithString:@"https://example.com"];
    LPLinkMetadata *metadata = [[LPLinkMetadata alloc] init];
    metadata.originalURL = url;
    metadata.URL = url;
    metadata.title = @"My App";
    return metadata;
}

该方法需要由传入 activityItems 的 UIActivityItemSource 对象实现,该对象还需要实现协议要求的数据提供方法。如果只在页面控制器中添加此方法,同时仍向 activityItems 传入普通 NSURL,页面控制器不会自动成为 item source。

补全链接元数据可以改善预览,但不能据此保证分享面板采用某个固定高度或外观。

备注:内容仅供参考。