Showing
2 changed files
with
486 additions
and
378 deletions
Document.md
0 → 100644
1 | + | ||
2 | +## 和缓视频医生 iOS SDK 3.4.0 | ||
3 | + | ||
4 | +<p align="right"> | ||
5 | +北京和缓医疗科技有限公司<br/> | ||
6 | +网址:https://www.hh-medic.com <br/> | ||
7 | +地址:北京市东城区东直门来福士7层 | ||
8 | +</p> | ||
9 | +[toc] | ||
10 | + | ||
11 | + | ||
12 | + | ||
13 | +## 0. 更新日志 | ||
14 | +> 3.4.0.03021612 | ||
15 | + - 功能优化 | ||
16 | +> 3.4.0.02151124 | ||
17 | + - 功能优化 | ||
18 | + | ||
19 | +> 3.2.0.01261430 | ||
20 | + - 功能优化 | ||
21 | + | ||
22 | +> 3.1.8.12271737 | ||
23 | + - 功能优化 | ||
24 | + - 适配xcode15 iOS13 | ||
25 | + | ||
26 | +> 3.1.4.10281906 | ||
27 | + | ||
28 | + - 细节优化 | ||
29 | + | ||
30 | +> 3.1.2 | ||
31 | + | ||
32 | + - 增加视频中开关本地摄像头的配置 | ||
33 | + | ||
34 | + ``` | ||
35 | + 配置方式: | ||
36 | + HHSDKOptions.default.mVideoOptions.enableCloseCamera // 视频中支持开关摄像头 默认不支持 | ||
37 | + HHSDKOptions.default.mVideoOptions.isCloseCameraCall // 支持关闭摄像头呼叫 默认不支持 | ||
38 | + ``` | ||
39 | + | ||
40 | +> 3.1.0 | ||
41 | + | ||
42 | + - 增加购买会员配置 | ||
43 | + | ||
44 | + ``` | ||
45 | + 配置方式: | ||
46 | + HHSDKOptions.default.mUserCenterOptions.enableBuyService // 默认不支持 | ||
47 | + ``` | ||
48 | + | ||
49 | + | ||
50 | +> 3.0.8 | ||
51 | + | ||
52 | + - 增加多人视频功能 | ||
53 | + - 适配模拟器运行 | ||
54 | + | ||
55 | + | ||
56 | +> 3.0.6 | ||
57 | + | ||
58 | + - HHMVideoDelegate增加getChatParentView(_ view : UIView),以便开发者在呼叫页面添加自定义view | ||
59 | + - 增加跳转信息流的接口 | ||
60 | + - 删除项目中UIWebview的引用 | ||
61 | + - 适配不同版本的xcode | ||
62 | + | ||
63 | +> 2.0.2 | ||
64 | + | ||
65 | + - 适配 Xcode 10, swift4.2 | ||
66 | + | ||
67 | + | ||
68 | +## 1. 集成方式 | ||
69 | + | ||
70 | +说明: 接入 HHDoctorSDK 大概会使 ipa 包增加 15M. | ||
71 | + HHDoctorSDK 提供两种集成方式:您既可以通过 CocoaPods 自动集成我们的 SDK,也可以通过手动下载 SDK, 然后添加到您的项目中。 | ||
72 | +我们提供的下载地址: | ||
73 | + | ||
74 | + 我们提供了发布仓库: [HHVDoctorSDK](https://code.hh-medic.com/hh_public/hhvDoctorSDK.ios)。 | ||
75 | + 集成demo地址: [HHDoctorSDK_demo_iOS](https://code.hh-medic.com/hh_public/HHVDoctorSDK-Demo/tree/master) | ||
76 | + | ||
77 | +由于呼叫视频需要相机相册权限,需要在info.plist中添加对应的权限,否则会导致无法调用。 | ||
78 | + | ||
79 | +``` | ||
80 | +<key>NSPhotoLibraryUsageDescription</key> | ||
81 | +<string>应用需要使用相册权限,以便您向医生发送健康资料。</string> | ||
82 | +<key>NSCameraUsageDescription</key> | ||
83 | +<string>应用需使用相机权限,以便您向医生进行视频咨询。</string> | ||
84 | +<key>NSMicrophoneUsageDescription</key> | ||
85 | +<string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string> | ||
86 | +``` | ||
87 | + | ||
88 | +### 1.1. 手动集成 | ||
89 | + | ||
90 | +1. 根据自己工程需要,下载对应版本的 HHMSDK,得到 NIMSDK.framework ,NIMAVChat.framework,NVS.framework,SecurityKit.framework 和 HHDoctorSDK.framework,以及未链接的全部三方依赖库 ,将他们导入工程。 | ||
91 | +2. 添加其他 HHDoctorSDK 依赖库。 | ||
92 | + | ||
93 | + - SystemConfiguration.framework | ||
94 | + - MobileCoreServices.framework | ||
95 | + - AVFoundation.framwork | ||
96 | + - CoreTelephony.framework | ||
97 | + - CoreMedia.framework | ||
98 | + - VideoToolbox.framework | ||
99 | + - AudioToolbox.framework | ||
100 | + - libz | ||
101 | + - libsqlite3.0 | ||
102 | + - libc++ | ||
103 | +3. 在 `Build Settings` -> `Other Linker Flags` 里,添加选项 `-ObjC`。 | ||
104 | +4. 在 `Build Settings` -> `Enable Bitcode` 里,设置为 `No`。 | ||
105 | +5. 如果需要在后台时保持音频通话状态,在 `Capabilities` -> `Background Modes` 里勾选 `audio, airplay, and Picture in Picture`。 | ||
106 | + | ||
107 | +### 1.2. 自动集成(推荐) | ||
108 | +* 在 `Podfile` 文件中加入 | ||
109 | + | ||
110 | +```shell | ||
111 | +use_frameworks! | ||
112 | +pod 'HHVDoctorSDK', :git => "http://code.hh-medic.com/hh_public/hhvDoctorSDK.ios.git" | ||
113 | +``` | ||
114 | +* 安装 | ||
115 | + | ||
116 | +``` shell | ||
117 | +pod install | ||
118 | +``` | ||
119 | + | ||
120 | +### 1.3. 调用规则 | ||
121 | +所有 HHDoctorSDK 业务均通过 HHMSDK 单例调用 | ||
122 | + | ||
123 | +```swift | ||
124 | +public class HHMSDK : NSObject { | ||
125 | + | ||
126 | + public static let `default`: HHDoctorSDK.HHMSDK | ||
127 | +} | ||
128 | +``` | ||
129 | + | ||
130 | +## 2. 初始化 | ||
131 | +在使用 HHDoctorSDK 任何方法之前,都应该首先调用初始化方法。正常业务情况下,初始化方法有仅只应调用一次。 | ||
132 | + | ||
133 | +HHSDKOptions 选项参数列表 | ||
134 | + | ||
135 | +参数|类型|说明 | ||
136 | +------|---|-------- | ||
137 | +productId|String|和缓分配的产品ID(必填) | ||
138 | +isDevelopment|Bool|服务器模式(测试/正式) | ||
139 | +isDebug|Bool|调试模式(是否打印日志) | ||
140 | +hudManager| HHHUDable|自定义 progressHUD | ||
141 | +hudDisTime| Double|hud 自动消失时间 | ||
142 | + | ||
143 | +调用示例 | ||
144 | + | ||
145 | +```swift | ||
146 | +let option = HHSDKOptions(productId: sdkProductId, isDebug: true, isDevelop: true) | ||
147 | +HHMSDK.default.start(option: option) | ||
148 | +``` | ||
149 | + | ||
150 | + | ||
151 | +## 3. 登录账户 | ||
152 | +在对医生视频呼叫之前,需要先登录账号信息。账号的 userToken 由和缓提供。 | ||
153 | +### 3.1. 登录 | ||
154 | + | ||
155 | +*注意: 不能多次调用登录 SDK,否则会导致视频故障。* | ||
156 | + | ||
157 | +* 原型 | ||
158 | + | ||
159 | +```swift | ||
160 | +public class HHMSDK : NSObject { | ||
161 | + | ||
162 | + /// 登录账户 | ||
163 | + /// | ||
164 | + /// - Parameters: | ||
165 | + /// - userToken: 用户的唯一标志 | ||
166 | + /// - completion: 完成的回调 | ||
167 | + @objc public func login(userToken: String, completion: @escaping HHLoginHandler) { | ||
168 | +} | ||
169 | +``` | ||
170 | + | ||
171 | +* 调用示例 | ||
172 | + | ||
173 | +```swift | ||
174 | +// 登录 | ||
175 | +HHMSDK.default.login(userToken: "token") { [weak self] in | ||
176 | + if let aError = $0 { | ||
177 | + print("登录错误: " + aError.localizedDescription) | ||
178 | + } else { | ||
179 | + print("登录成功") | ||
180 | + } | ||
181 | +} | ||
182 | +``` | ||
183 | +error 为登录错误信息,成功则为 nil。 | ||
184 | + | ||
185 | +### 3.2. 登出 | ||
186 | +应用层登出/注销/切换自己的账号时需要调用 HHMSDK 的登出操作,该操作会通知和缓服务器进行 APNs 推送信息的解绑操作,避免用户已登出但推送依然发送到当前设备的情况发生。 | ||
187 | + | ||
188 | +* 原型 | ||
189 | + | ||
190 | +```swift | ||
191 | +public class HHMSDK : NSObject { | ||
192 | + | ||
193 | + /// 登出 | ||
194 | + public func logout() | ||
195 | +} | ||
196 | +``` | ||
197 | + | ||
198 | +* 调用示例 | ||
199 | + | ||
200 | +```swift | ||
201 | +// 登出 | ||
202 | +HHMSDK.default.logout() | ||
203 | +``` | ||
204 | + | ||
205 | +## 4. 视频呼叫 | ||
206 | +* 原型 | ||
207 | + | ||
208 | +```swift | ||
209 | +public class HHMSDK : NSObject { | ||
210 | + | ||
211 | + /// 发起呼叫 | ||
212 | + /// | ||
213 | + /// - Parameters:咨询人的userToken | ||
214 | + @objc dynamic public func call(userToken: String) | ||
215 | +} | ||
216 | +``` | ||
217 | + | ||
218 | +* 调用示例 | ||
219 | + | ||
220 | +```swift | ||
221 | +// 呼叫 | ||
222 | +HHMSDK.default.call("109CF62C95E7F58E2C0C129CAE48FC953F0D04F68EA2608F6783B874E4F50EEF") | ||
223 | +``` | ||
224 | + | ||
225 | + | ||
226 | + | ||
227 | +## 5. 指定成员呼叫 | ||
228 | + | ||
229 | +* 原型 | ||
230 | + | ||
231 | +```swift | ||
232 | +public class HHMSDK : NSObject { | ||
233 | + | ||
234 | + /// 指定人发起呼叫(带 UI) | ||
235 | + /// | ||
236 | + /// - Parameters:needSelectMember 是否需要显示选成员弹窗,默认需要 | ||
237 | + @objc dynamic public func startMemberCall(needSelectMember: Bool = true) | ||
238 | +} | ||
239 | +``` | ||
240 | + | ||
241 | +* 调用示例 | ||
242 | + | ||
243 | +```swift | ||
244 | +HHMSDK.default.startMemberCall() | ||
245 | +``` | ||
246 | + | ||
247 | + | ||
248 | + | ||
249 | + | ||
250 | + | ||
251 | +## 6. 代理(delegate)(可选) | ||
252 | + | ||
253 | +代理主要用于视频过程中的状态反馈。如果不需要状态反馈,可以不考虑该代理。 | ||
254 | +所有的代理方法都是可选的,可以根据自己的实际需要实现不同的代理方法。 | ||
255 | + | ||
256 | +* 原型 | ||
257 | + | ||
258 | +```swift | ||
259 | +/// 视频管理器代理 | ||
260 | +public protocol HHMVideoDelegate : NSObjectProtocol { | ||
261 | + | ||
262 | + /// 主动视频时的呼叫状态变化 | ||
263 | + /// | ||
264 | + /// - Parameter state: 当前呼叫状态 | ||
265 | + public func callStateChange(_ state: HHMedicSDK.HHMCallingState) | ||
266 | + | ||
267 | + /// 通话已接通 | ||
268 | + public func callDidEstablish() | ||
269 | + | ||
270 | + /// 呼叫失败 | ||
271 | + public func onFail(error: Error) | ||
272 | + | ||
273 | + public func onCancel() | ||
274 | + | ||
275 | + /// 通话已结束 (接通之后才有结束) | ||
276 | + public func callDidFinish() | ||
277 | + | ||
278 | + /// 转呼医生 | ||
279 | + public func onExtensionDoctor() | ||
280 | + | ||
281 | + /// 接收到呼叫(被呼叫方) | ||
282 | + /// | ||
283 | + /// - Parameters: | ||
284 | + /// - callID: 呼叫的 id | ||
285 | + /// - from: 呼叫人 id | ||
286 | + public func onReceive(_ callID: String, from: String) | ||
287 | + | ||
288 | + /// 收到视频呼入时的操作(被呼叫方) | ||
289 | + /// | ||
290 | + /// - Parameter accept: 接受或者拒接 | ||
291 | + public func onResponse(_ accept: Bool) | ||
292 | + | ||
293 | + /// 缺少必要权限 | ||
294 | + /// | ||
295 | + /// - Parameter type: 缺少的权限类型 | ||
296 | + public func onLeakPermission(_ type: HHMedicSDK.PermissionType) | ||
297 | +} | ||
298 | +``` | ||
299 | + | ||
300 | +### 6.1. 加入 | ||
301 | +代理支持同时设置多个。 | ||
302 | + | ||
303 | +```swift | ||
304 | +HHMSDK.default.add(delegate: self) | ||
305 | +``` | ||
306 | + | ||
307 | +### 6.2. 移除 | ||
308 | + | ||
309 | +```swift | ||
310 | +HHMSDK.default.remove(delegate: self) | ||
311 | +``` | ||
312 | + | ||
313 | +## 7. 信息流 | ||
314 | + | ||
315 | + | ||
316 | + | ||
317 | +### 7.1. 跳转信息流 | ||
318 | + | ||
319 | +``` | ||
320 | +HHMSDK.default.skipChatHome(skipType: .present, vc: self) | ||
321 | +``` | ||
322 | + | ||
323 | + | ||
324 | + | ||
325 | +### 7.2. 饿了么购药 | ||
326 | + | ||
327 | +正常情况下呼叫完成后,如有必要,医生会发送药卡,如需医生发送饿了么药卡,需在呼叫之前调用发送本地定位的接口。 | ||
328 | + | ||
329 | +如需关掉该功能只需发送(0,0)的坐标。具体可参照demo里SettingVC里关于定位的设置。 | ||
330 | + | ||
331 | +``` | ||
332 | +HHLocation.default.startLocation(lng: "116.431941", lat: "39.940199") /// 此为测试坐标,需替换为用户本地的坐标 | ||
333 | +``` | ||
334 | + | ||
335 | +在饿了么购药过程中,会涉及到微信支付和支付宝支付。开发者需在自己的项目主Target中配置对应的回调scheme。 | ||
336 | + | ||
337 | +分别为,具体可参照demo里的配置 | ||
338 | + | ||
339 | +``` | ||
340 | +1. identifier : eleme URL Schemes : cash.tb.ele.me | ||
341 | +2. identifier : none URL Schemes : HHPay | ||
342 | +3. identifier : none URL Schemes : alipays | ||
343 | +``` | ||
344 | + | ||
345 | + | ||
346 | + | ||
347 | +## 8. 其他配置 | ||
348 | + | ||
349 | +### 8.1. APNs | ||
350 | + | ||
351 | +在 appDelegate 中向 SDK 传入 deviceToken 即可。 | ||
352 | + | ||
353 | +```swift | ||
354 | +func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { | ||
355 | + HHMSDK.default.updateAPNS(token: deviceToken) | ||
356 | +} | ||
357 | +``` | ||
358 | + | ||
359 | +*注意:需要上传 APNs 的 p12 文件,请联系我们上传。* | ||
360 | + | ||
361 | +### 8.2. Background Modes | ||
362 | + | ||
363 | +为了支持用户压后台后音视频的正常使用,需要设置 Background Modes。具体设置如下: | ||
364 | + | ||
365 | +``` | ||
366 | +xxx target -> Capabilities -> Background Modes -> 勾选 Audio,Airplay and Picture in Picture | ||
367 | +``` | ||
368 | + | ||
369 | +### 8.3. 扩展参数 | ||
370 | + | ||
371 | +为了支持收集渠道日志,SDK支持在初始化时传递自定义参数(长度限制小于64位,不支持JSON)。 | ||
372 | + | ||
373 | +``` | ||
374 | +HHSDKOptions.default.setCallExtension(callExtension: "xxx") | ||
375 | +``` | ||
376 | + | ||
377 | + | ||
378 | + | ||
379 | +### 8.4. 支付跳转配置 | ||
380 | + | ||
381 | +在使用SDK叮当购药或会员购买服务时,需要为项目配置支付跳转的scheme. | ||
382 | + | ||
383 | +配置步骤如下: | ||
384 | + | ||
385 | +Step1: 在 Targets - Info - URL Types下增加: | ||
386 | + | ||
387 | +``` | ||
388 | +URL1: | ||
389 | +identifier: '' | ||
390 | +URL Schemes: hh-medic.com | ||
391 | + | ||
392 | +URL2: | ||
393 | +identifier: '' | ||
394 | +URL Schemes: alipays | ||
395 | + | ||
396 | +URL3: | ||
397 | +identifier: 'eleme' | ||
398 | +URL Schemes: cash.tb.ele.me | ||
399 | +``` | ||
400 | + | ||
401 | + | ||
402 | + | ||
403 | +Step2: 在AppDelegate下配置如下代码: | ||
404 | + | ||
405 | +``` | ||
406 | +func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { | ||
407 | + | ||
408 | + if url.scheme == "hh-medic.com" { | ||
409 | + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WX_H5_PAY"), object: nil) | ||
410 | + return true | ||
411 | + } | ||
412 | + | ||
413 | + return true | ||
414 | + } | ||
415 | +``` | ||
416 | + | ||
417 | + | ||
418 | + | ||
419 | +### 8.5. 上架 App Store 时,出现 x86_64, i386 架构错误该如何解决? | ||
420 | + | ||
421 | +该问题是由于 App Store 不支持 x86_64, i386 架构引起的,具体解决方法如下: | ||
422 | + | ||
423 | +1. 清空项目编译缓存: | ||
424 | + 选择【Product】>【clean】,按住Alt变成 clean build Folder...,等待操作完成。 | ||
425 | +2. 剔除 App Store 不支持的 x86_64 和 i386 架构: | ||
426 | + a. 选择【TARGETS】>【Build Phases】。 | ||
427 | + b. 单击加号,选择【New Run Script Phase】。 | ||
428 | + c. 添加如下代码: | ||
429 | + | ||
430 | +``` | ||
431 | +APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" | ||
432 | + | ||
433 | +# This script loops through the frameworks embedded in the application and | ||
434 | + | ||
435 | +# removes unused architectures. | ||
436 | + | ||
437 | + find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK | ||
438 | + do | ||
439 | + FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) | ||
440 | + FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" | ||
441 | + echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" | ||
442 | + | ||
443 | + EXTRACTED_ARCHS=() | ||
444 | + | ||
445 | + for ARCH in $ARCHS | ||
446 | + do | ||
447 | + echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" | ||
448 | + lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" | ||
449 | + EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") | ||
450 | + done | ||
451 | + | ||
452 | + echo "Merging extracted architectures: ${ARCHS}" | ||
453 | + lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" | ||
454 | + rm "${EXTRACTED_ARCHS[@]}" | ||
455 | + | ||
456 | + echo "Replacing original executable with thinned version" | ||
457 | + rm "$FRAMEWORK_EXECUTABLE_PATH" | ||
458 | + mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" | ||
459 | + | ||
460 | + done | ||
461 | +``` | ||
462 | + | ||
463 | +### 8.6. 宿主app是基于Object-C时需要注意的问题 | ||
464 | + | ||
465 | +1. 需勾选 Always embed swift standard libraries 为 YES 否则在低版本系统会闪退。 |
1 | +## 和缓视频医生 iOS SDK对接文档 3.4.0(快速接入版本) | ||
1 | 2 | ||
2 | - | ||
3 | -<p align="right"> | ||
4 | -北京和缓医疗科技有限公司<br/> | ||
5 | -网址:https://www.hh-medic.com <br/> | ||
6 | -地址:北京市东城区东直门来福士7层 | ||
7 | -</p> | ||
8 | -[toc] | ||
9 | - | ||
10 | - | ||
11 | - | ||
12 | -## 0. 更新日志 | ||
13 | - | ||
14 | -> 3.1.0 | ||
15 | - | ||
16 | - - 增加购买会员配置 | ||
17 | - | ||
18 | - ``` | ||
19 | - 配置方式: | ||
20 | - HHSDKOptions.default.mUserCenterOptions.enableBuyService // 默认不支持 | ||
21 | - ``` | ||
22 | - | ||
23 | - | ||
24 | -> 3.0.8 | ||
25 | - | ||
26 | - - 增加多人视频功能 | ||
27 | - - 适配模拟器运行 | ||
28 | - | ||
29 | - | ||
30 | -> 3.0.6 | ||
31 | - | ||
32 | - - HHMVideoDelegate增加getChatParentView(_ view : UIView),以便开发者在呼叫页面添加自定义view | ||
33 | - - 增加跳转信息流的接口 | ||
34 | - - 删除项目中UIWebview的引用 | ||
35 | - - 适配不同版本的xcode | ||
36 | - | ||
37 | -> 2.0.2 | ||
38 | - | ||
39 | - - 适配 Xcode 10, swift4.2 | ||
40 | - | ||
41 | - | ||
42 | -## 1. 集成方式 | ||
43 | - | ||
44 | -说明: 接入 HHDoctorSDK 大概会使 ipa 包增加 15M. | ||
45 | - HHDoctorSDK 提供两种集成方式:您既可以通过 CocoaPods 自动集成我们的 SDK,也可以通过手动下载 SDK, 然后添加到您的项目中。 | ||
46 | -我们提供的下载地址: | ||
47 | - | ||
48 | - 我们提供了发布仓库: [HHVDoctorSDK](https://code.hh-medic.com/hh_public/hhvDoctorSDK.ios)。 | ||
49 | - 集成demo地址: [HHDoctorSDK_demo_iOS](https://code.hh-medic.com/hh_public/HHVDoctorSDK-Demo/tree/master) | 3 | +### 一、引入SDK |
4 | +* 配置 | ||
50 | 5 | ||
51 | 由于呼叫视频需要相机相册权限,需要在info.plist中添加对应的权限,否则会导致无法调用。 | 6 | 由于呼叫视频需要相机相册权限,需要在info.plist中添加对应的权限,否则会导致无法调用。 |
52 | 7 | ||
@@ -59,27 +14,7 @@ | @@ -59,27 +14,7 @@ | ||
59 | <string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string> | 14 | <string>应用需使用麦克风权限,以便您向医生进行视频咨询。</string> |
60 | ``` | 15 | ``` |
61 | 16 | ||
62 | -### 1.1. 手动集成 | ||
63 | - | ||
64 | -1. 根据自己工程需要,下载对应版本的 HHMSDK,得到 NIMSDK.framework ,NIMAVChat.framework,NVS.framework,SecurityKit.framework 和 HHDoctorSDK.framework,以及未链接的全部三方依赖库 ,将他们导入工程。 | ||
65 | -2. 添加其他 HHDoctorSDK 依赖库。 | ||
66 | - | ||
67 | - - SystemConfiguration.framework | ||
68 | - - MobileCoreServices.framework | ||
69 | - - AVFoundation.framwork | ||
70 | - - CoreTelephony.framework | ||
71 | - - CoreMedia.framework | ||
72 | - - VideoToolbox.framework | ||
73 | - - AudioToolbox.framework | ||
74 | - - libz | ||
75 | - - libsqlite3.0 | ||
76 | - - libc++ | ||
77 | -3. 在 `Build Settings` -> `Other Linker Flags` 里,添加选项 `-ObjC`。 | ||
78 | -4. 在 `Build Settings` -> `Enable Bitcode` 里,设置为 `No`。 | ||
79 | -5. 如果需要在后台时保持音频通话状态,在 `Capabilities` -> `Background Modes` 里勾选 `audio, airplay, and Picture in Picture`。 | ||
80 | - | ||
81 | -### 1.2. 自动集成(推荐) | ||
82 | -* 在 `Podfile` 文件中加入 | 17 | +* 在 `Podfile` 文件中加入 |
83 | 18 | ||
84 | ```shell | 19 | ```shell |
85 | use_frameworks! | 20 | use_frameworks! |
@@ -91,338 +26,46 @@ pod 'HHVDoctorSDK', :git => "http://code.hh-medic.com/hh_public/hhvDoctorSDK.ios | @@ -91,338 +26,46 @@ pod 'HHVDoctorSDK', :git => "http://code.hh-medic.com/hh_public/hhvDoctorSDK.ios | ||
91 | pod install | 26 | pod install |
92 | ``` | 27 | ``` |
93 | 28 | ||
94 | -### 1.3. 调用规则 | ||
95 | -所有 HHDoctorSDK 业务均通过 HHMSDK 单例调用 | ||
96 | 29 | ||
97 | -```swift | ||
98 | -public class HHMSDK : NSObject { | 30 | +### 二、 初始化SDK |
99 | 31 | ||
100 | - public static let `default`: HHDoctorSDK.HHMSDK | ||
101 | -} | ||
102 | ``` | 32 | ``` |
103 | - | ||
104 | -## 2. 初始化 | ||
105 | -在使用 HHDoctorSDK 任何方法之前,都应该首先调用初始化方法。正常业务情况下,初始化方法有仅只应调用一次。 | ||
106 | - | ||
107 | -HHSDKOptions 选项参数列表 | ||
108 | - | ||
109 | -参数|类型|说明 | ||
110 | -------|---|-------- | ||
111 | -productId|String|和缓分配的产品ID(必填) | ||
112 | -isDevelopment|Bool|服务器模式(测试/正式) | ||
113 | -isDebug|Bool|调试模式(是否打印日志) | ||
114 | -APNs|String |推送证书名(由和缓生成) | ||
115 | -hudManager| HHHUDable|自定义 progressHUD | ||
116 | -hudDisTime| Double|hud 自动消失时间 | ||
117 | - | ||
118 | -调用示例 | ||
119 | - | ||
120 | -```swift | ||
121 | -let option = HHSDKOptions(isDebug: true, isDevelop: true) | ||
122 | -option.cerName = "2cDevTest" | ||
123 | -// let option = HHSDKOptions() | ||
124 | -// option.isDevelopment = true | ||
125 | -// option.isDebug = true | ||
126 | -// option.hudDisTime = 2 | 33 | +swift |
34 | +let option = HHSDKOptions(productId: sdkProductId, isDebug: true, isDevelop: true) | ||
127 | HHMSDK.default.start(option: option) | 35 | HHMSDK.default.start(option: option) |
128 | ``` | 36 | ``` |
129 | 37 | ||
38 | +### 三、登录登出 | ||
130 | 39 | ||
131 | -## 3. 登录账户 | ||
132 | -在对医生视频呼叫之前,需要先登录账号信息。账号的 uuid 由和缓提供。 | ||
133 | -### 3.1. 登录 | ||
134 | - | ||
135 | -*注意: 不能多次调用登录 SDK,否则会导致视频故障。* | ||
136 | - | ||
137 | -* 原型 | ||
138 | - | ||
139 | -```swift | ||
140 | -public class HHMSDK : NSObject { | ||
141 | - | ||
142 | - /// 登录账号 | ||
143 | - /// | ||
144 | - /// - Parameters: | ||
145 | - /// - uuid: 用户的 唯一标志符 | ||
146 | - /// - completion: 完成回调 | ||
147 | - public func login(uuid: Int, completion: @escaping HHMedicSDK.HHLoginHandler) | ||
148 | -} | ||
149 | ``` | 40 | ``` |
150 | - | ||
151 | -* 调用示例 | ||
152 | - | ||
153 | -```swift | 41 | +swift |
154 | // 登录 | 42 | // 登录 |
155 | -HHMSDK.default.login(uuid: 100001531) { (error) in | ||
156 | - if let aError = error { | 43 | +HHMSDK.default.login(userToken: "token") { [weak self] in |
44 | + if let aError = $0 { | ||
157 | print("登录错误: " + aError.localizedDescription) | 45 | print("登录错误: " + aError.localizedDescription) |
46 | + } else { | ||
47 | + print("登录成功") | ||
158 | } | 48 | } |
159 | } | 49 | } |
160 | ``` | 50 | ``` |
161 | error 为登录错误信息,成功则为 nil。 | 51 | error 为登录错误信息,成功则为 nil。 |
162 | - | ||
163 | -### 3.2. 登出 | ||
164 | -应用层登出/注销/切换自己的账号时需要调用 HHMSDK 的登出操作,该操作会通知和缓服务器进行 APNs 推送信息的解绑操作,避免用户已登出但推送依然发送到当前设备的情况发生。 | ||
165 | - | ||
166 | -* 原型 | ||
167 | - | ||
168 | -```swift | ||
169 | -public class HHMSDK : NSObject { | ||
170 | - | ||
171 | - /// 登出 | ||
172 | - public func logout() | ||
173 | -} | ||
174 | ``` | 52 | ``` |
175 | - | ||
176 | -* 调用示例 | ||
177 | - | ||
178 | -```swift | 53 | +swift |
179 | // 登出 | 54 | // 登出 |
180 | HHMSDK.default.logout() | 55 | HHMSDK.default.logout() |
181 | ``` | 56 | ``` |
182 | 57 | ||
183 | -## 4. 视频呼叫 | ||
184 | -根据实际场景的不同,可以进行成人、儿童方向的向医生咨询。 | ||
185 | - | ||
186 | -* 原型 | 58 | +### 四、跳转首页(必须登录后) |
187 | 59 | ||
188 | -```swift | ||
189 | -public class HHMSDK : NSObject { | ||
190 | - | ||
191 | - /// 主叫发起通话 | ||
192 | - /// | ||
193 | - /// - Parameter type: 呼叫类型 | ||
194 | - public func startCall(_ type: HHMedicSDK.HHCallType) | ||
195 | -} | ||
196 | ``` | 60 | ``` |
61 | +HHMSDK.default.skipChatHome(skipType: .present, vc: self) | ||
197 | 62 | ||
198 | -* 调用示例 | ||
199 | - | ||
200 | -```swift | ||
201 | -// 咨询儿童问题 | ||
202 | -HHMSDK.default.startCall(.child) | ||
203 | - | ||
204 | -// 咨询成人问题 | ||
205 | -HHMSDK.default.startCall(.adult) | ||
206 | ``` | 63 | ``` |
207 | 64 | ||
208 | -HHCallType 枚举列表 | ||
209 | - | ||
210 | -值 | 说明 | ||
211 | ---------- | ------------- | ||
212 | -child | 儿童 | ||
213 | -adult | 成人 | ||
214 | - | ||
215 | -## 5. 代理(delegate)(可选) | ||
216 | -代理主要用于视频过程中的状态反馈。如果不需要状态反馈,可以不考虑该代理。 | ||
217 | -所有的代理方法都是可选的,可以根据自己的实际需要实现不同的代理方法。 | ||
218 | - | ||
219 | -* 原型 | ||
220 | - | ||
221 | -```swift | ||
222 | -/// 视频管理器代理 | ||
223 | -public protocol HHMVideoDelegate : NSObjectProtocol { | ||
224 | - | ||
225 | - /// 主动视频时的呼叫状态变化 | ||
226 | - /// | ||
227 | - /// - Parameter state: 当前呼叫状态 | ||
228 | - public func callStateChange(_ state: HHMedicSDK.HHMCallingState) | ||
229 | - | ||
230 | - /// 通话已接通 | ||
231 | - public func callDidEstablish() | ||
232 | - | ||
233 | - /// 呼叫失败 | ||
234 | - public func onFail(error: Error) | ||
235 | - | ||
236 | - public func onCancel() | ||
237 | - | ||
238 | - /// 通话已结束 (接通之后才有结束) | ||
239 | - public func callDidFinish() | ||
240 | - | ||
241 | - /// 转呼医生 | ||
242 | - public func onExtensionDoctor() | ||
243 | - | ||
244 | - /// 接收到呼叫(被呼叫方) | ||
245 | - /// | ||
246 | - /// - Parameters: | ||
247 | - /// - callID: 呼叫的 id | ||
248 | - /// - from: 呼叫人 id | ||
249 | - public func onReceive(_ callID: String, from: String) | ||
250 | - | ||
251 | - /// 收到视频呼入时的操作(被呼叫方) | ||
252 | - /// | ||
253 | - /// - Parameter accept: 接受或者拒接 | ||
254 | - public func onResponse(_ accept: Bool) | ||
255 | - | ||
256 | - /// 缺少必要权限 | ||
257 | - /// | ||
258 | - /// - Parameter type: 缺少的权限类型 | ||
259 | - public func onLeakPermission(_ type: HHMedicSDK.PermissionType) | ||
260 | -} | ||
261 | -``` | ||
262 | - | ||
263 | -### 5.1. 加入 | ||
264 | -代理支持同时设置多个。 | ||
265 | - | ||
266 | -```swift | ||
267 | -HHMSDK.default.add(delegate: self) | ||
268 | -``` | ||
269 | - | ||
270 | -### 5.2. 移除 | ||
271 | - | ||
272 | -```swift | ||
273 | -HHMSDK.default.remove(delegate: self) | ||
274 | -``` | ||
275 | - | ||
276 | -## 6. 信息流 | ||
277 | - | ||
278 | - | ||
279 | - | ||
280 | -### 6.1. 跳转信息流 | ||
281 | - | ||
282 | -``` | ||
283 | -HHMSDK.default.skipChatHome() | ||
284 | -``` | ||
285 | - | ||
286 | - | ||
287 | - | ||
288 | -### 6.2. 饿了么购药 | ||
289 | - | ||
290 | -正常情况下呼叫完成后,如有必要,医生会发送药卡,如需医生发送饿了么药卡,需在呼叫之前调用发送本地定位的接口。 | ||
291 | - | ||
292 | -如需关掉该功能只需发送(0,0)的坐标。具体可参照demo里SettingVC里关于定位的设置。 | ||
293 | - | ||
294 | -``` | ||
295 | -HHLocation.default.startLocation(lng: "116.431941", lat: "39.940199") /// 此为测试坐标,需替换为用户本地的坐标 | ||
296 | -``` | ||
297 | - | ||
298 | -在饿了么购药过程中,会涉及到微信支付和支付宝支付。开发者需在自己的项目主Target中配置对应的回调scheme。 | ||
299 | - | ||
300 | -分别为,具体可参照demo里的配置 | ||
301 | - | ||
302 | -``` | ||
303 | -1. identifier : eleme URL Schemes : cash.tb.ele.me | ||
304 | -2. identifier : none URL Schemes : HHPay | ||
305 | -3. identifier : none URL Schemes : alipays | ||
306 | -``` | ||
307 | - | ||
308 | - | ||
309 | - | ||
310 | -## 7. 其他配置 | ||
311 | - | ||
312 | -### 7.1. APNs | ||
313 | - | ||
314 | -在 appDelegate 中向 SDK 传入 deviceToken 即可。 | ||
315 | - | ||
316 | -```swift | ||
317 | -func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { | ||
318 | - HHMSDK.default.updateAPNS(token: deviceToken) | ||
319 | -} | ||
320 | -``` | ||
321 | - | ||
322 | -*注意:需要上传 APNs 的 p12 文件,请联系我们上传。* | ||
323 | - | ||
324 | -### 7.2. Background Modes | ||
325 | - | ||
326 | -为了支持用户压后台后音视频的正常使用,需要设置 Background Modes。具体设置如下: | ||
327 | - | ||
328 | -``` | ||
329 | -xxx target -> Capabilities -> Background Modes -> 勾选 Audio,Airplay and Picture in Picture | ||
330 | -``` | ||
331 | - | ||
332 | -### 7.3. 扩展参数 | ||
333 | - | ||
334 | -为了支持收集渠道日志,SDK支持在初始化时传递自定义参数(支持JSON格式)。 | ||
335 | - | ||
336 | -``` | ||
337 | -HHSDKOptions.default.setCallExtension(callExtension: "xxx") | ||
338 | -``` | ||
339 | - | ||
340 | - | ||
341 | - | ||
342 | -### 7.4. 支付跳转配置 | ||
343 | - | ||
344 | -在使用SDK叮当购药或会员购买服务时,需要为项目配置支付跳转的scheme. | ||
345 | - | ||
346 | -配置步骤如下: | ||
347 | - | ||
348 | -Step1: 在 Targets - Info - URL Types下增加: | ||
349 | - | ||
350 | -``` | ||
351 | -URL1: | ||
352 | -identifier: '' | ||
353 | -URL Schemes: hh-medic.com | ||
354 | - | ||
355 | -URL2: | ||
356 | -identifier: '' | ||
357 | -URL Schemes: alipays | ||
358 | - | ||
359 | -URL3: | ||
360 | -identifier: 'eleme' | ||
361 | -URL Schemes: cash.tb.ele.me | ||
362 | -``` | ||
363 | - | ||
364 | - | ||
365 | - | ||
366 | -Step2: 在AppDelegate下配置如下代码: | ||
367 | - | ||
368 | -``` | ||
369 | -func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { | ||
370 | - | ||
371 | - if url.scheme == "hh-medic.com" { | ||
372 | - NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WX_H5_PAY"), object: nil) | ||
373 | - return true | ||
374 | - } | ||
375 | - | ||
376 | - return true | ||
377 | - } | ||
378 | -``` | ||
379 | - | ||
380 | - | ||
381 | - | ||
382 | -### 7.5. 上架 App Store 时,出现 x86_64, i386 架构错误该如何解决? | ||
383 | - | ||
384 | -该问题是由于 App Store 不支持 x86_64, i386 架构引起的,具体解决方法如下: | ||
385 | - | ||
386 | -1. 清空项目编译缓存: | ||
387 | - 选择【Product】>【clean】,按住Alt变成 clean build Folder...,等待操作完成。 | ||
388 | -2. 剔除 App Store 不支持的 x86_64 和 i386 架构: | ||
389 | - a. 选择【TARGETS】>【Build Phases】。 | ||
390 | - b. 单击加号,选择【New Run Script Phase】。 | ||
391 | - c. 添加如下代码: | ||
392 | - | ||
393 | -``` | ||
394 | -APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" | ||
395 | - | ||
396 | -# This script loops through the frameworks embedded in the application and | ||
397 | - | ||
398 | -# removes unused architectures. | ||
399 | - | ||
400 | - find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK | ||
401 | - do | ||
402 | - FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) | ||
403 | - FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" | ||
404 | - echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" | ||
405 | - | ||
406 | - EXTRACTED_ARCHS=() | ||
407 | - | ||
408 | - for ARCH in $ARCHS | ||
409 | - do | ||
410 | - echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" | ||
411 | - lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" | ||
412 | - EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") | ||
413 | - done | ||
414 | - | ||
415 | - echo "Merging extracted architectures: ${ARCHS}" | ||
416 | - lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" | ||
417 | - rm "${EXTRACTED_ARCHS[@]}" | ||
418 | - | ||
419 | - echo "Replacing original executable with thinned version" | ||
420 | - rm "$FRAMEWORK_EXECUTABLE_PATH" | ||
421 | - mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" | ||
422 | - | ||
423 | - done | ||
424 | -``` | 65 | +### 五、Demo及详细文档 |
425 | 66 | ||
426 | -### 7.6. 宿主app是基于Object-C时需要注意的问题 | 67 | +Demo |
68 | +https://github.com/HHMedic/HHDoctorSDK_demo_iOS_TRTC | ||
427 | 69 | ||
428 | -1. 需勾选 Always embed swift standard libraries 为 YES 否则在低版本系统会闪退。 | 70 | +详细接入文档 |
71 | +https://github.com/HHMedic/HHDoctorSDK_demo_iOS_TRTC/blob/main/Document.md |
-
Please register or login to post a comment