Install
openclaw skills install ios-sharesdk-integreation面向 iOS 工程的 MobTech ShareSDK 集成 skill。默认优先使用 CocoaPods,先扫描工程,再串行确认阻塞项,最后以最小改动完成接入、隐私合规与项目内说明文档落地。
openclaw skills install ios-sharesdk-integreation当用户希望把 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:
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKUI/ShareSDKUI.h>
#import <MOBFoundation/MOBFoundation.h>
并在 project.pbxproj 的目标 build settings 中添加:
SWIFT_OBJC_BRIDGING_HEADER = {Target}/{Target}-Bridging-Header.h;
onStateChanged 回调签名showShareActionSheet 的 onStateChanged 回调包含 6 个参数(不是 4 个):
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不存在):
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 平台至少包含以下这些,模板中都要出现:
国内平台:
国外平台:
复制完成后,必须告知用户:
已在你项目的根目录生成 {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 等数字字段,转为整数,不加引号。如果不合法,必须停止并提示:
配置信息验证失败,请修正以下问题:
{具体问题列表}
- 第 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 setuppod install 可能遇到 Encoding::CompatibilityError(Unicode Normalization 兼容问题),需要先设置:
export LANG=en_US.UTF-8
pod install
向用户说明
根据 MobTech 隐私合规要求和中国区 App 上架规范,使用 ShareSDK 需要在用户同意隐私政策后才能初始化 SDK。
你需要在 App 中:
1. 首次启动时展示《隐私政策》弹窗
2. 用户点击"同意"按钮后,调用隐私授权代码
3. 用户点击"不同意"则不应调用
初始化顺序必须遵守:
MobSDK uploadPrivacyPermissionStatus:YES ...可使用的官方接口:
+ (void)uploadPrivacyPermissionStatus:(BOOL)isAgree
onResult:(void (^_Nullable)(BOOL success))handler;
或:
+ (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 中包含以下关键键,否则安装会失败:
<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:)
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 个参数)
onStateChanged: { state, platformType, userData, entity, error, flag in
⚠️ ssdkSetupShareParams 的 type 参数
官方支持的枚举值为 SSDKContentType,正确 case 是 .auto(不要写 .typeAuto,该值不存在):
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)SWIFT_OBJC_BRIDGING_HEADERproject.pbxproj 中已删除 GENERATE_INFOPLIST_FILE 和 INFOPLIST_KEY_*(当使用物理 Info.plist 时)如用户允许安装依赖,再补:
pod install如果失败,要区分:
完成后最终输出至少包含:
Info.plist 键如用户允许,额外生成项目内说明文档,例如:
ShareSDKIntegrationNotes.md建议说明文档内容:
不要做这些事:
pod install