当用户希望把 MobTech ShareSDK 集成到 iOS 工程,或希望把已有工程整理成可接入 ShareSDK 的状态时,使用本 skill。
当用户提到以下任一主题时,使用本 skill:
Podfile 配置Info.plist 配置MOBAppKey / MOBAppSecret 配置uploadPrivacyPermissionStatus 调用时机LSApplicationQueriesSchemes、Universal Link、Associated Domains 配置如果用户问题明确与 iOS 的 ShareSDK 接入、工程配置、平台参数、隐私合规、社交分享或第三方授权登录有关,应优先使用本 skill。
主文档:
执行时高频需要参考的关联官方页面:
以下信息已经可以作为本 skill 的执行依据,不需要再假设:
Xcode 9.1.0+、 iOS 8.0+pod 'mob_sharesdk'pod 'mob_sharesdk/ShareSDKUI'pod 'mob_sharesdk/ShareSDKPlatforms/QQ'pod 'mob_sharesdk/ShareSDKPlatforms/SinaWeibo'pod 'mob_sharesdk/ShareSDKPlatforms/WeChat'pod 'mob_sharesdk/ShareSDKPlatforms/WeChatFull'WeChat 与 WeChatFull 不能共存,只能选一个ShareSDKUI 外还可能需要 pod 'mob_sharesdk/ShareSDKExtension'pod 'mob_sharesdk/ShareSDKConfigFile'Info.plist 里需要配置 MOBAppKey 与 MOBAppSecretMobSDK uploadPrivacyPermissionStatusapplication:didFinishLaunchingWithOptions: 中调用 [ShareSDK registPlatforms:^{}]universalLink 参数Other Linker Flags 需要添加 -ObjCXcode 15 编译时,官方文档额外要求在 Other Linker Flags 中添加 -ld64Info.plist 中配置 MOBForceHttps = YESAssociated DomainsshowShareActionSheet 的 onStateChanged 回调共 6 个参数: (SSDKResponseState, SSDKPlatformType, [AnyHashable: Any]?, SSDKContentEntity?, (any Error)?, Bool)showShareActionSheet 必须传 sheetConfiguration: 参数(不能省略),类型为 SSUIShareSheetConfiguration *,需先 #import <ShareSDKUI/ShareSDKUI.h>SSDKContentType 的自动判断枚举值为 .auto(不是 .typeAuto)<ShareSDK/ShareSDK.h>、 <MOBFoundation/MOBFoundation.h>纯 Swift 工程需要创建 {Target}-Bridging-Header.h,导入 ObjC 头文件后才可调用 MobSDK / ShareSDK API:
objc
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKUI/ShareSDKUI.h>
#import <MOBFoundation/MOBFoundation.h>
并在 project.pbxproj 的目标 build settings 中添加:
text
SWIFT_OBJC_BRIDGING_HEADER = {Target}/{Target}-Bridging-Header.h;
onStateChanged 回调签名showShareActionSheet 的 onStateChanged 回调包含 6 个参数(不是 4 个):
swift
onStateChanged: { state, platformType, userData, entity, error, flag in
switch state {
case .success:
print("分享成功")
case .fail:
print("分享失败: \(error?.localizedDescription ?? "")")
case .cancel:
print("分享取消")
default:
break
}
}
参数含义: (SSDKResponseState, SSDKPlatformType, [AnyHashable: Any]?, SSDKContentEntity?, (any Error)?, Bool)
正确的自动类型枚举值为 .auto(不是 .typeAuto,该case不存在):
swift
let shareParams = NSMutableDictionary()
shareParams.ssdkSetupShareParams(
byText: "分享文本",
images: nil,
url: URL(string: "https://example.com"),
title: "标题",
type: .auto // ✅ 正确
)
不要编造以下内容:
如果文档没有明确说明,或者当前工程无法安全推断,必须写:
文档未明确,需向用户确认
CocoaPodsShareSDK_Config.xlsx 为准决定平台范围:填写则集成,未填写则默认不集成pod install / pod update,先给用户看计划,再执行严格按以下顺序推进:
优先扫描以下内容:
.xcodeproj / .xcworkspacePodfilePackage.swiftAppDelegate / SceneDelegate / SwiftUI @mainInfo.plistShareSDK、 MobSDK、 MOBAppKey、 LSApplicationQueriesSchemes、 CFBundleURLTypesAssociated DomainsBundle Identifier推荐命令:
rg --files -g '*.xcodeproj' -g '*.xcworkspace' -g 'Podfile' -g 'Package.swift'rg -n 'ShareSDK|MobSDK|MOBAppKey|MOBAppSecret|LSApplicationQueriesSchemes|CFBundleURLTypes|Associated Domains|uploadPrivacyPermissionStatus|registPlatforms'扫描后先给出一段简短结论,包含:
ShareSDK_Config.xlsx扫描工程后,如未发现用户项目根目录已有 ShareSDK_Config.xlsx,执行:
assets/generate_excel_template.py。assets/ShareSDK_Config_Template.xlsx。assets/ShareSDK_Config_Template.xlsx 复制到用户项目根目录。ShareSDK_Config.xlsx。模板必须包含:
基础信息 Sheet平台申请地址 Sheet支持的 iOS Share 平台至少包含以下这些,模板中都要出现:
国内平台:
国外平台:
复制完成后,必须告知用户:
text
已在你项目的根目录生成 {path}/ShareSDK_Config.xlsx 配置文件。
请打开该文件,按以下步骤填写:
1. 在"基础信息"Sheet 中填写 MobTech 的 appKey 和 appSecret
(从 https://www.mob.com/ 注册应用获取)
2. 在相应平台的 Sheet 中填写需要启用的平台配置
(填写则集成,不填写则默认不集成)
3. "平台申请地址"Sheet 中有各开放平台的申请链接
填写完成后告诉我"填好了",我将继续下一步。
生成 ShareSDK_Config.xlsx 后必须暂停,不要继续修改工程。
等待用户回复:
填好了已填写配置好了用户未明确表示填写完成前,不读取配置、不改 Podfile、不改 Info.plist、不写初始化代码。
不要在这一步先问用户“你想集成哪些平台”。
用户表示填写完成后,读取用户项目根目录的 ShareSDK_Config.xlsx。
平台启用规则:
验证规则:
检查项规则不通过时的提示appKey必填,不能为空字符串基础信息 Sheet 中的 appKey 未填写,请从 MobTech 官网获取``appSecret必填,不能为空字符串基础信息 Sheet 中的 appSecret 未填写微信 appId如填写,必须以 wx 开头微信 appId 格式不正确,应以 wx 开头(如 wx1234567890abcdef)微信 appSecret如填写,长度应为 32 位微信 appSecret 格式不正确,应为 32 位字符串QQ appId如填写,必须为纯数字QQ appId 格式不正确,应为纯数字(如 100371282)QQ appKey如填写,长度应为 16 位QQ appKey 格式不正确,应为 16 位字符串微博 appKey如填写,不能为空微博 appKey 未填写
类型转换规则:
appId、 appKey、 appSecret、 userName、 path 等标识符字段,强制转为字符串,即使 Excel 中填写的是数字,如 12345,也要转为 "12345"。withShareTicket、 bypassApproval、 shareByAppClient 等布尔字段,转为 true / false,不加引号。miniprogramType 等数字字段,转为整数,不加引号。如果不合法,必须停止并提示:
text
配置信息验证失败,请修正以下问题:
{具体问题列表}
- 第 1 条:{问题描述}
- 第 2 条:{问题描述}
请修改 Excel 文件后保存,然后重新告诉我"填好了"。
如果合法,提取配置信息,进入第三步。
从已验证通过的 ShareSDK_Config.xlsx 提取后续集成所需配置。
基础信息:
mobAppKeymobAppSecretbundleIdentifierteamIdintegrationModeneedShareUIneedAuth按平台提取时,遵守:
Podfile、 Info.plist、URL Scheme、白名单、平台注册代码按平台提取:
appId、 appSecret、 universalLink、 useWeChatFullappId、 appKey、 enableUniversalLink、 universalLinkappKey、 appSecret、 redirectUrl、 universalLink其它平台:
文档未明确,需向用户确认扫描工程后再确认:
Associated Domains修改任何文件前,先给出最小改动计划。典型涉及:
PodfileInfo.plistAppDelegate.*SceneDelegate.*ShareSDKRegister 或 ShareSDKServiceShareSDKIntegrationNotes.md计划应说明:
默认按 CocoaPods 集成。
Pod 选择规则:
pod 'mob_sharesdk'pod 'mob_sharesdk/ShareSDKUI'pod 'mob_sharesdk/ShareSDKExtension'pod 'mob_sharesdk/ShareSDKConfigFile'pod 'mob_sharesdk/ShareSDKPlatforms/WeChat'pod 'mob_sharesdk/ShareSDKPlatforms/WeChatFull'pod 'mob_sharesdk/ShareSDKPlatforms/QQ'pod 'mob_sharesdk/ShareSDKPlatforms/SinaWeibo'依赖安装动作规则:
改 Podfile 之前先告知用户
运行 pod install 或 pod update 前先询问用户
若 mob_sharesdk 搜索不到,可建议:
pod setup如果本机 Ruby 版本 ≥ 4.0, pod install 可能遇到 Encoding::CompatibilityError(Unicode Normalization 兼容问题),需要先设置:
bash
export LANG=en_US.UTF-8
pod install
不要在 skill 中默认删除 CocoaPods 缓存;如必须清缓存,先征求用户确认
向用户说明
text
根据 MobTech 隐私合规要求和中国区 App 上架规范,使用 ShareSDK 需要在用户同意隐私政策后才能初始化 SDK。
你需要在 App 中:
1. 首次启动时展示《隐私政策》弹窗
2. 用户点击"同意"按钮后,调用隐私授权代码
3. 用户点击"不同意"则不应调用
初始化顺序必须遵守:
MobSDK uploadPrivacyPermissionStatus:YES ...可使用的官方接口:
objective-c
+ (void)uploadPrivacyPermissionStatus:(BOOL)isAgree
onResult:(void (^_Nullable)(BOOL success))handler;
或:
objective-c
+ (void)uploadPrivacyPermissionStatus:(BOOL)isAgree
privacyDataDelegate:(id<MOBFoundationPrivacyDelegate> _Nullable)privacyDataDelegate
onResult:(void (^_Nullable)(BOOL success))handler;
如果工程已有统一隐私网关,优先挂到已有同意回调之后。
如果工程没有隐私弹窗,不要直接帮用户创建完整产品方案;先明确指出这是阻塞项。
平台注册优先放在启动阶段,并保持集中管理。
可采用:
官方示例可确认的平台注册方法包括:
setupQQWithAppId:appkey:enableUniversalLink:universalLink:setupWeChatWithAppId:appSecret:universalLink:setupSinaWeiboWithAppkey:appSecret:redirectUrl:universalLink:只注册当前启用的平台。
至少校验并按需写入:
MOBAppKeyMOBAppSecretCFBundleURLTypesLSApplicationQueriesSchemes可按需写入:
MOBTwitterVerMOBForceHttps⚠️ 物理 Info.plist 要点(替代 GENERATE_INFOPLIST_FILE 时)
如果工程使用 GENERATE_INFOPLIST_FILE = YES(Xcode 自动生成),而你需要改为物理 Info.plist 文件,务必在 Info.plist 中包含以下关键键,否则安装会失败:
xml
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
同时,在 project.pbxproj 中将目标的:
GENERATE_INFOPLIST_FILE = YES → 删除INFOPLIST_FILE = {Target}/Info.plist;INFOPLIST_KEY_* 条目(因为它们已被物理文件覆盖)URL Scheme 规则,当前官方已明确:
wb{appKey}{wxAppId}fb{apiKey}twitterkit-{consumerKey}tencent{appId}QQ{appId的8位大写十六进制}如果只启用微信 / QQ / 微博,就不要把 Facebook / Twitter 相关项写进工程。
LSApplicationQueriesSchemes 只加入当前启用平台需要的条目。
官方文档已列出常见平台白名单,尤其关注:
sinaweibo、 sinaweibohd、 sinaweibosso、 sinaweibohdsso、 weibosdk、 weibosdk2.5、 weibosdk3.3weixin、 weixinULAPI、 weixinURLParamsAPImqqOpensdkSSoLogin、 mqqopensdkapiV2、 tim、 mqq、 mqqapi、 mqqopensdknopasteboard、 mqqopensdknopasteboardios16、 mqqopensdkminiapp、 mqzone、 mqqopensdkapiV4 等不要在未启用平台时预埋其白名单。
当启用微博、微信、QQ、Line 时,优先检查是否需要:
Associated Domainsapplinks:xxxxTeam IDBundle ID只有在用户已经提供 Universal Link,或工程中已有明确值时,才直接落地。
如果缺少 Universal Link,先告诉用户该项会阻塞对应平台在 iOS 13+ 的正常能力。
如果用户要求接分享功能,可基于官方 API 接入:
showShareActionSheet:customItems:shareParams:sheetConfiguration:onStateChanged:share:parameters:onStateChanged:authorize:settings:onStateChanged:⚠️ showShareActionSheet 完整签名(含 sheetConfiguration:)
swift
let config = SSUIShareSheetConfiguration()
ShareSDK.showShareActionSheet(
nil, // view (iPad 弹出参照视图)
customItems: nil, // items (nil 显示所有已集成平台)
shareParams: shareParams, // 分享参数
sheetConfiguration: config // 必传,不可省略
) { state, platformType, userData, entity, error, flag in
// state: SSDKResponseState (.success / .fail / .cancel)
// error: (any Error)? — 失败时才有值
switch state {
case .success:
print("分享成功")
case .fail:
print("失败: \(error?.localizedDescription ?? "")")
case .cancel:
print("已取消")
default:
break
}
}
⚠️ onStateChanged 回调签名(6 个参数)
swift
onStateChanged: { state, platformType, userData, entity, error, flag in
⚠️ ssdkSetupShareParams 的 type 参数
官方支持的枚举值为 SSDKContentType,正确 case 是 .auto(不要写 .typeAuto,该值不存在):
swift
shareParams.ssdkSetupShareParams(
byText: "文本",
images: nil,
url: URL(string: "https://example.com"),
title: "标题",
type: .auto // ✅
)
但默认不要擅自把测试文案、测试图片 URL、测试标题直接写进正式业务代码。
完成修改后至少做这些校验:
Podfile 语法看起来无破坏
Info.plist 中关键键存在且结构未损坏:
CFBundleIdentifier、 CFBundlePackageType、 CFBundleExecutableMOBAppKey / MOBAppSecret 已填入LSApplicationQueriesSchemes 只包含已启用平台的白名单CFBundleURLTypes 中 URL Scheme 格式正确入口文件已调用隐私同意后的初始化逻辑(先 uploadPrivacyPermissionStatus,再 registPlatforms)
注册代码只包含本次启用的平台
未把无关 demo 平台带入工程
如果是纯 Swift 工程,确认已创建 ObjC 桥接头并配置了 SWIFT_OBJC_BRIDGING_HEADER
确认 project.pbxproj 中已删除 GENERATE_INFOPLIST_FILE 和 INFOPLIST_KEY_*(当使用物理 Info.plist 时)
如用户允许安装依赖,再补:
pod install如果失败,要区分:
完成后最终输出至少包含:
Info.plist 键如用户允许,额外生成项目内说明文档,例如:
ShareSDKIntegrationNotes.md建议说明文档内容:
不要做这些事:
pod install