微信分享去sdk
This commit is contained in:
@@ -379,9 +379,9 @@ window.rootViewController = NavgationController
|
||||
**流程**:
|
||||
1. 下载 AMR 到本地
|
||||
2. `VoiceConverter ConvertAmrToWav` 转 WAV
|
||||
3. `AVAudioPlayer` 播放
|
||||
3. `AVAudioPlayer` 播放(若当前已有语音在播,先停旧、给 H5 发 `gameui_stop_voice(被打断 user)` 再起新播放)
|
||||
4. 开始播放时 callback H5:`gameui_play_voice(user)` (见 §3.2 [7])
|
||||
5. 播放结束 callback H5:`gameui_stop_voice(user)` (见 §3.2 [8])
|
||||
5. 播放结束 / 被打断 callback H5:`gameui_stop_voice(user)` (见 §3.2 [8])
|
||||
|
||||
##### 【6】 `voicePlaying` — 语音播放总开关
|
||||
|
||||
@@ -563,7 +563,7 @@ window.rootViewController = NavgationController
|
||||
| 5 | `shakeEnd` | motionEnded 摇一摇结束 | `nil` | ✓ | ✓ |
|
||||
| 6 | `getlocationinfo` | 定位成功/失败 | 见下方表 B | ✓ | ✓ |
|
||||
| 7 | `gameui_play_voice` | mediaTypeAudio 开始播放(且 voicePlaying=1 时)| 字符串 user_id | ✓ | ✓ |
|
||||
| 8 | `gameui_stop_voice` | mediaTypeAudio AVAudioPlayer 播放结束 | 字符串 user_id(最近一次 mediaTypeAudio 的 user 字段)| ✓ | ✓ |
|
||||
| 8 | `gameui_stop_voice` | mediaTypeAudio AVAudioPlayer 播放结束 / 被新一次 mediaTypeAudio 打断 / 解码失败 | 字符串 user_id(**该次结束 / 被打断的语音**所绑定的 user,不是入参里最新的 user — 与 daoqi 旧实现语义不同,详见下方 `gameui_stop_voice` 行为说明)| ✓ | ✓ |
|
||||
| 9 | `getaudiourl` | 录音 + 上传成功(七牛或旧 PostFile)| `{ "audiourl": "<七牛 URL>", "time": "<秒数字符串>" }` | ✓ | ✓ |
|
||||
| 10 | `sharelogin` | 微信授权 OAuth 拿到 userinfo 后 | 见下方表 C | ✓ | ✓ |
|
||||
| 11 | `sharesuccess` | 分享完成(微信 SendMessageToWXResp / 闲聊 finishBlock)| `{ "success": "2", "type": "<sharefriend 原值如 '1' 或 '2'>" }` | ✓ | ✓ |
|
||||
@@ -586,6 +586,21 @@ H5 端 N 年来收到的实际语义就是:**`"2"` = 进入后台、`"1"` =
|
||||
|
||||
(顺带:原 msext 还有一条 iOS<9 UIWebView 路径 `RootVC.m:516-543` / `fourviewVC.m:1254-1282`,发的值反过来:进入后台 → `"1"` / 回到前台 → `"2"`。该路径在新外壳最低 iOS 15.6 下完全不可达,**不能作为对齐依据**,请忽略。)
|
||||
|
||||
**`gameui_stop_voice` 行为说明**(与 daoqi 旧实现的有意差异,用户反馈驱动):
|
||||
|
||||
daoqi `NewRootVC.m:1736-1748` / `gameController.m:1288-1308` 把 `voicePlayer` / `self.User_id` 都作为 VC 成员变量。覆盖式播放(前一条还在播,第二条到来)的代码路径:
|
||||
1. `self.User_id = userid;` 先覆盖最新 user
|
||||
2. `voicePlayer = [[AVAudioPlayer alloc]...]` 直接换 ivar(MRC 下旧 player 实际泄漏继续在播)
|
||||
3. 旧 player 自然播完触发 `audioPlayerDidFinishPlaying:` → 调 `stopradio` → `callHandler:@"gameui_stop_voice" data:self.User_id`
|
||||
|
||||
结果:旧消息对应的 `gameui_stop_voice` 发出去的 user_id **实际是新消息的 user_id**;H5 收不到旧消息的停止动画信号,旧动画一直转,新消息那条反而停了。
|
||||
|
||||
新外壳实现(`VoicePlayer.swift`)把 user 与 player 一一绑定(`currentUser`):
|
||||
- 覆盖式 play 时**主动**停旧 player,并用旧 player 绑定的 user 触发一次 `gameui_stop_voice`,再起新播放 + `gameui_play_voice(新 user)`
|
||||
- 自然结束 / 解码失败:用结束那个 player 绑定的 user 发 `gameui_stop_voice`,不再读"最近一次入参"
|
||||
|
||||
H5 端无需任何改动:仍然按照"收到 `gameui_stop_voice(user)` 就停这个 user 的动画"处理即可,只是信号现在会更准。验证场景:H5 连发两条 `mediaTypeAudio`(user A → user B,A 还没播完 B 就来),现在 H5 会先收 `gameui_stop_voice(A)` 再收 `gameui_play_voice(B)`,B 播完再收 `gameui_stop_voice(B)`。daoqi 旧路径下 A 那次停止信号永远收不到。
|
||||
|
||||
**表 A — `getphoneinfo`**:
|
||||
```json
|
||||
{
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
| `AppDelegate.swift` | `AMapWrapper.bootstrap()` → 真实调隐私合规 3 步 + apiKey |
|
||||
| `SceneDelegate.swift` | `openURLContexts` → 真实调 `WXApi.handleOpen(url, delegate:)` |
|
||||
| `AccreditLoginHandler` | `accreditlogin` → 真实拉起微信授权 → 反向 callback `sharelogin` 7 字段(Province 大写 P) |
|
||||
| `WechatShare` | `share()` → 真实调 `WXApi.send(SendMessageToWXReq)` |
|
||||
| `WechatShare` | `share()` / `shareLobby()` → 剪贴板 + 引导框 + `weixin://` 跳转(不依赖 SDK 的分享 API,与 QQ / 抖音同款交互) |
|
||||
| `StartLocationHandler` | `startlocation` → 真实调 `AMapLocationManager.requestLocation` → 反向 callback `getlocationinfo` 9 字段(latitude/longitude string, province 小写 p) |
|
||||
| `BackGameDataHandler` | 子游戏 backgameData 退出时自动清 `WXApi.delegate = nil` + `LocationService.stop()` |
|
||||
|
||||
@@ -236,10 +236,10 @@ bridge.register("prepareaudio") { _, callback in
|
||||
|---|---|---|
|
||||
| `Vendor/WechatSDK/WechatOpenSDK.xcframework` | ⏳ 等用户放置 | 项目方从腾讯开放平台下 `OpenSDK2.0.5+_NoPay.zip` 解压 → 放进 `Vendor/WechatSDK/` → 按 §A.1 Embed & Sign |
|
||||
| `Source/SDK/WeChat/WeChatSDK.swift` | ✅ 已写 | `register()` + `handleOpenURL` 包 canImport |
|
||||
| `Source/SDK/WeChat/WeChatManager.swift` | ✅ 已写 | authorize / shareLink async wrapper + WXApiDelegate |
|
||||
| `Source/SDK/WeChat/WeChatManager.swift` | ✅ 已写 | authorize async wrapper + WXApiDelegate(分享路径已剥离,走剪贴板见 `WechatShare`) |
|
||||
| `Source/Login/WeChatAuth.swift` | ✅ 已写 | OAuth2 客户端直拼 sns/oauth2 + userinfo + 7 字段 |
|
||||
| `Source/Bridge/Handlers/AccreditLoginHandler.swift` | ✅ 已升级 | 真实拉起授权 + sharelogin 反向 callback(Province 大写 P) |
|
||||
| `Source/Share/WechatShare.swift` | ✅ 已升级 | 真实链接分享(type=2/3 截图待 Phase 4.F) |
|
||||
| `Source/Share/WechatShare.swift` | ✅ 已改造 | 剪贴板 + 引导框 + `weixin://` 跳转(与 QQ / 抖音一致,不依赖微信 SDK 分享 API) |
|
||||
| `Source/Bridge/Handlers/BackGameDataHandler.swift` | ✅ 已加钩子 | `WXApi.delegate = nil` 子游戏 pop 时清理 |
|
||||
| `AppDelegate.swift` | ✅ 已加注册 | `WeChatSDK.register()` |
|
||||
| `SceneDelegate.swift` | ✅ 已加 openURL | `WeChatSDK.handleOpenURL(ctx.url)` |
|
||||
@@ -248,8 +248,8 @@ bridge.register("prepareaudio") { _, callback in
|
||||
### 1.4 验收(用户 Xcode 加完 framework 后跑)
|
||||
|
||||
- [ ] H5 调 `bridge.callHandler('accreditlogin')` → 拉起微信 → 同意授权 → 大厅 H5 收 `sharelogin({openid,...,Province})`,**Province 大写 P**
|
||||
- [ ] H5 调 `bridge.callHandler('friendsSharetypeUrlToptitleDescript', {sharefriend:"2", ...})` → 拉起微信朋友圈
|
||||
- [ ] H5 调 `sharefriend:"1"` → SharePanel 三按钮,点微信 → 拉起微信好友选择
|
||||
- [ ] H5 调 `bridge.callHandler('friendsSharetypeUrlToptitleDescript', {sharefriend:"2", ...})` → 写剪贴板 + 弹引导框 → 点"立即打开微信"跳转到微信首页(用户自行粘贴到朋友圈)
|
||||
- [ ] H5 调 `sharefriend:"1"` → SharePanel 三按钮,点微信 → 写剪贴板 + 弹引导框 → 跳微信首页(用户自行粘贴到对话框)
|
||||
- [ ] **关键回归**:截图分享 / QQ 分享 / 抖音分享路径不受影响
|
||||
|
||||
### 1.5 风险
|
||||
|
||||
Reference in New Issue
Block a user