iOS15中如何为SFSafariViewController添加自定义activity按钮?
问题排查与解决方法
1. extensionIdentifier取值错误问题
你填写的第三方/系统扩展ID不可用,该参数必须填你当前项目中自建的共享扩展/动作扩展的Bundle ID:
- 扩展必须和你的主App属于同一个开发团队,签名一致,系统才会识别到对应扩展
- 比如主App Bundle ID为
com.gardenofwine.demo,你新建的Share Extension Bundle ID为com.gardenofwine.demo.MyShareExtension,就填这个扩展的ID即可
2. ActivityButton功能理解修正
该API的作用是给你的App内置扩展创建快捷入口,不是通用的自定义导航按钮:
- 按钮点击后会直接唤起你绑定的扩展,不需要用户手动点开分享面板查找扩展
- 无法通过该API实现点击后直接执行宿主App代码的需求,如果你需要的是普通自定义按钮,应该通过自定义导航栏、或者内嵌WKWebView的方案实现
3. 扩展配置检查项
- 扩展的
Info.plist中NSExtensionActivationRule配置需要匹配你加载的资源类型,如果你打开的是网页链接,需要确保规则支持public.url且符合http/https格式 - 扩展必须正常编译打包到主App的安装包内,真机调试时可以在iOS设置->Safari浏览器->扩展中查看是否能看到你创建的扩展
其他常见踩坑点
- 项目最低部署版本必须≥iOS15,低于该版本的系统会直接忽略
activityButton配置 - 按钮图标必须使用模板渲染模式,如果你用自定义图片,需要手动设置
[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] - 不要加载http协议的地址,iOS默认禁用不安全的http请求,建议替换为
https://developer.apple.com测试 - 必须使用真机测试,模拟器经常出现扩展识别异常的问题
修正后的代码参考
- (void)openSfariViewController { if (@available(iOS 15.0, *)) { // 加版本判断避免低版本崩溃 SFSafariViewControllerConfiguration *config = [[SFSafariViewControllerConfiguration alloc] init]; UIImage *buttonImage = [UIImage systemImageNamed:@"heart.fill"]; buttonImage = [buttonImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; // 替换为你自己项目里的扩展Bundle ID SFSafariViewControllerActivityButton *button = [[SFSafariViewControllerActivityButton alloc] initWithTemplateImage:buttonImage extensionIdentifier:@"com.your.bundle.id.extension"]; config.activityButton = button; // 用https链接 SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"https://developer.apple.com"] configuration:config]; [self presentViewController:safariVC animated:YES completion:nil]; } else { // 低版本 fallback 逻辑 } }
内容的提问来源于stack exchange,提问作者gardenofwine
相关产品推荐
相关产品推荐

