WhiteRoom.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. //
  2. // WhiteRoom.h
  3. // dsBridge
  4. //
  5. // Created by leavesster on 2018/8/11.
  6. //
  7. #import <Foundation/Foundation.h>
  8. #import "WhiteGlobalState.h"
  9. #import "WhiteMemberState.h"
  10. #import "WhiteImageInformation.h"
  11. #import "WhitePptPage.h"
  12. #import "WhiteRoomMember.h"
  13. #import "WhiteBroadcastState.h"
  14. #import "WhiteRoomCallbacks.h"
  15. #import "WhiteRoomState.h"
  16. #import "WhiteEvent.h"
  17. #import "WhiteScene.h"
  18. #import "WhiteSceneState.h"
  19. #import "WhitePanEvent.h"
  20. #import "WhiteDisplayer.h"
  21. #import "WhiteSDK+Room.h"
  22. #import "WhiteAppParam.h"
  23. @class WhiteBoardView;
  24. NS_ASSUME_NONNULL_BEGIN
  25. @interface WhiteRoom : WhiteDisplayer
  26. #pragma mark - 同步 API
  27. /** 当前用户在白板上的序号 id。
  28. 从 0 开始,与该用户在 RoomMember 中的 memberId 相同。
  29. */
  30. @property (nonatomic, strong, readonly) NSNumber *observerId;
  31. /** 房间 uuid */
  32. @property (nonatomic, copy, readonly) NSString *uuid;
  33. /** 全局状态,由于遗留问题,目前该 API,不支持 customGlobalState,如需获取 customGlobalState,请使用 room.state.globalState */
  34. @property (nonatomic, strong, readonly) WhiteGlobalState *globalState;
  35. /** 教具信息 */
  36. @property (nonatomic, strong, readonly) WhiteReadonlyMemberState *memberState;
  37. /** 白板在线成员信息 */
  38. @property (nonatomic, strong, readonly) NSArray<WhiteRoomMember *> *roomMembers;
  39. /** 视角状态信息,用户当前场景状态,主播信息 */
  40. @property (nonatomic, strong, readonly) WhiteBroadcastState *broadcastState;
  41. /** 缩放比例 */
  42. @property (nonatomic, assign, readonly) CGFloat scale;
  43. /** 房间状态信息,继承自 WhiteDisplayerState(Room 与 Player 共同状态)*/
  44. @property (nonatomic, strong, readonly) WhiteRoomState *state;
  45. /** 白板页面(场景)状态,属于房间状态之一 */
  46. @property (nonatomic, strong, readonly) WhiteSceneState *sceneState;
  47. /** 连接状态 */
  48. @property (nonatomic, assign, readonly) WhiteRoomPhase phase;
  49. #pragma mark - Set API
  50. /**
  51. 白板所有人共享的全局状态
  52. 1.0 迁移用户,请阅读文档站中 [页面(场景)管理] ,使用setScencePath API 进行翻页。
  53. */
  54. - (void)setGlobalState:(WhiteGlobalState * )globalState;
  55. /** 目前主要用来切换教具 */
  56. - (void)setMemberState:(WhiteMemberState *)modifyState;
  57. /** 切换用户视角模式 */
  58. - (void)setViewMode:(WhiteViewMode)viewMode;
  59. #pragma mark - Action API
  60. /** 白板 debug 用的一些信息 */
  61. - (void)debugInfo:(void (^ _Nullable)(NSDictionary * _Nullable dict))completionHandler;
  62. /**
  63. 如果白板窗口大小改变,需要重新调用该方法刷新尺寸。
  64. 查看父类 WhiteDisplayer 类中方法
  65. */
  66. //- (void)refreshViewSize;
  67. /**
  68. 主动断开与互动白板实时房间的连接。
  69. 该方法会把与当前房间对象相关的所有资源释放掉。如果要再次加入房间,需要重新调用 [joinRoomWithConfig](joinRoomWithConfig)。
  70. @param completeHandler 你可以通过该接口获取 `disconnect` 的调用结果:
  71. - 如果方法调用成功,则返回房间的全局状态。
  72. - 如果方法调用失败,则返回错误信息。
  73. */
  74. - (void)disconnect:(void (^ _Nullable) (void))completeHandler;
  75. /** 用户是否主动断开与白板房间的连接。在调用 `disconnect` 主动断连时,该值会被立即赋值为 `YES`。 */
  76. @property (nonatomic, assign, readonly) BOOL disconnectedBySelf;
  77. /**
  78. 设置用户在房间中是否为互动模式。
  79. 在加入房间前,就可以在 [WhiteRoomConfig](WhiteRoomConfig) 中设置 `isWritable` ,来决定该模式。
  80. @param writable 用户在房间中是否为互动模式:
  81. - `YES`:互动模式,即具有读写权限。
  82. - `NO`:订阅模式,即具有只读权限。
  83. @param completionHandler 你可以通过该接口获取 `setWritable` 的调用结果:
  84. - 如果方法调用成功,则返回用户在房间中的读写状态。
  85. - 如果方法调用失败,则返回错误信息。
  86. */
  87. - (void)setWritable:(BOOL)writable completionHandler:(void (^ _Nullable)(BOOL isWritable, NSError * _Nullable error))completionHandler;
  88. /**
  89. 本地用户在当前互动白板实时房间是否为互动模式。
  90. - `YES`:互动模式,即具有读写权限。
  91. - `NO`:订阅模式,即具有只读权限。
  92. */
  93. @property (nonatomic, assign, readonly, getter=isWritable) BOOL writable;
  94. /**
  95. 禁止/允许用户调整(移动或缩放)视角。
  96. @param disableCameraTransform 是否禁止用户调整视角:
  97. - `YES`:禁止用户调整视角。
  98. - `NO`:(默认)允许用户调整视角。
  99. */
  100. - (void)disableCameraTransform:(BOOL)disableCameraTransform;
  101. /**
  102. 禁止/允许用户操作工具。
  103. @param disable 是否禁止用户操作工具:
  104. - `YES`:禁止用户操作工具操作。
  105. - `NO`:(默认)允许用户操作工具输入操作。
  106. */
  107. - (void)disableDeviceInputs:(BOOL)disable;
  108. /**
  109. 发送自定义事件。
  110. @param eventName 自定义事件名称,详见 [WhiteEvent](WhiteEvent)。
  111. @param payload 自定义事件内容,详见 [WhiteEvent](WhiteEvent)。
  112. */
  113. - (void)dispatchMagixEvent:(NSString *)eventName payload:(NSDictionary *)payload;
  114. #pragma mark - PPT
  115. /**
  116. 播放动态 PPT 下一页。
  117. 当前 PPT 页面的动画已全部执行完成时,SDK 会将场景切换至下一页 PPT。
  118. */
  119. - (void)pptNextStep;
  120. /**
  121. 返回动态 PPT 上一页。
  122. 当前 PPT 页面的动画全部回退完成时,SDK 会将场景切回至上一页 PPT。
  123. */
  124. - (void)pptPreviousStep;
  125. #pragma mark - Text API
  126. /**
  127. * 在指定位置插入文字
  128. * @param x 第一个字的的左侧边中点,世界坐标系中的 x 坐标
  129. * @param y 第一个字的的左侧边中点,世界坐标系中的 y 坐标
  130. * @param textContent 初始化文字的内容
  131. * @param completionHandler 返回该文字的标识符
  132. */
  133. - (void)insertText:(CGFloat)x y:(CGFloat)y textContent:(NSString *)textContent completionHandler:(void (^) (NSString * textId))completionHandler;
  134. #pragma mark - Image API
  135. /**
  136. 插入图片显示区域。
  137. SDK 会根据你传入的 `imageInfo` 在白板上设置并插入图片的显示区域。
  138. **Note:** 你也可以调用 [insertImage](insertImage:src:) 方法同时传入图片信息和图片的 URL 地址,在白板中插入并展示图片。
  139. @param imageInfo 图片信息,详见 [WhiteImageInformation](WhiteImageInformation)。
  140. @param src 图片 URL 地址,详见 [WhiteImageInformation](WhiteImageInformation)。
  141. */
  142. - (void)insertImage:(WhiteImageInformation *)imageInfo src:(NSString *)src;
  143. /**
  144. 插入图片显示区域。
  145. SDK 会根据你传入的 `imageInfo` 在白板上设置并插入图片的显示区域。
  146. @param imageInfo 图片信息,详见 [WhiteImageInformation](WhiteImageInformation)。
  147. */
  148. - (void)insertImage:(WhiteImageInformation *)imageInfo;
  149. /**
  150. 展示图片。
  151. 该方法可以将指定的网络图片展示到指定的图片显示区域。
  152. **Note:** 调用该方法前,请确保你已经调用 [insertImage](insertImage:src:) 方法在白板上插入了图片的显示区域。
  153. @param uuid 图片显示区域的 UUID, 即在 [insertImage](insertImage:src:) 方法的 `imageInfo` 中传入的图片 UUID。
  154. @param src 图片的 URL 地址。必须确保 app 客户端能访问该 URL,否则无法正常展示图片。
  155. */
  156. - (void)completeImageUploadWithUuid:(NSString *)uuid src:(NSString *)src;
  157. /**
  158. 关闭/开启橡皮擦擦除图片功能。
  159. @param disable 是否关闭橡皮擦擦除图片功能:
  160. - `YES`:禁止橡皮擦擦除图片。
  161. - `NO`:(默认)允许橡皮擦擦除图片。
  162. */
  163. - (void)disableEraseImage:(BOOL)disable;
  164. #pragma mark - 延时
  165. /** 同步 UTC 时间与本地时间。
  166. 导入 UTC 时间戳(s)后,白板会根据用户本地时间戳,与传入的 UTC 时间戳进行强行同步。
  167. @since 2.12.24
  168. **Note:** 该 API 要求用户本地时间经过校准,否则可能会造成主动延时。
  169. */
  170. - (void)syncBlockTimestamp:(NSTimeInterval)timestamp;
  171. /**
  172. 设置远端白板画面同步延时。
  173. 调用该方法后,SDK 会延迟同步远端白板画面。
  174. 在 CDN 直播场景,设置远端白板画面同步延时,可以防止用户感知错位。
  175. **Note:** 该方法不影响本地白板画面的显示,即用户在本地白板上的操作,会立即在本地白板上显示。
  176. @param delay 延时时长,单位为秒。
  177. */
  178. - (void)setTimeDelay:(NSTimeInterval)delay;
  179. @property (nonatomic, assign, readonly) NSTimeInterval delay;
  180. @end
  181. #pragma mark - 页面(场景)管理 API
  182. @interface WhiteRoom (Scene)
  183. /**
  184. 获取房间当前场景组下的场景状态。
  185. @param result 回调。返回当前场景组下的场景状态,详见 [WhiteSceneState](WhiteSceneState)。
  186. */
  187. - (void)getSceneStateWithResult:(void (^) (WhiteSceneState *state))result;
  188. /**
  189. 获取房间当前场景组下的场景列表。
  190. @param result 回调。返回当前场景组下的场景列表,详见 [WhiteScene](WhiteScene)。
  191. */
  192. - (void)getScenesWithResult:(void (^) (NSArray<WhiteScene *> *scenes))result;
  193. /**
  194. 切换至指定的场景。
  195. 方法调用成功后,房间内的所有用户看到的白板都会切换到指定场景。
  196. **Note:**
  197. - 该方法为同步调用。
  198. - 调用以下方法修改或新增场景后,无法通过 [setScenePath:](setScenePath:) 立即获取最新的场景状态。此时,如果需要立即获取最新的场景状态,可以调用 [setScenePath:completionHandler:()](setScenePath:completionHandler:)。
  199. 场景切换失败可能有以下原因:
  200. - 路径不合法,请确保场景路径以 "/",由场景组和场景名构成。
  201. - 场景路径对应的场景不存在。
  202. - 传入的路径是场景组的路径,而不是场景路径。
  203. @param path 想要切换到的场景的场景路径,请确保场景路径以 "/",由场景组和场景名构成,例如,`/math/classA`。
  204. */
  205. - (void)setScenePath:(NSString *)path;
  206. /**
  207. 切换至指定的场景。
  208. 方法调用成功后,房间内的所有用户看到的白板都会切换到指定场景。
  209. **Note:**
  210. - 该方法为异步调用。
  211. - 调用以下方法修改或新增场景后,你可以通过 [getSceneStateWithResult:](getSceneStateWithResult:) 立即获取最新的场景状态。
  212. 场景切换失败可能有以下原因:
  213. - 路径不合法,请确保场景路径以 "/",由场景组和场景名构成。
  214. - 场景路径对应的场景不存在。
  215. - 传入的路径是场景组的路径,而不是场景路径。
  216. @param dirOrPath 想要切换到的场景的场景路径,请确保场景路径以 "/",由场景组和场景名构成,例如,`/math/classA`.
  217. @param completionHandler 你可以通过该接口获取 `setScenePath` 的调用结果:
  218. - 如果方法调用成功,则返回 `YES`.
  219. - 如果方法调用失败,则返回错误信息。
  220. */
  221. - (void)setScenePath:(NSString *)dirOrPath completionHandler:(void (^ _Nullable)(BOOL success, NSError * _Nullable error))completionHandler;
  222. /**
  223. 切换至当前场景组下的指定场景。
  224. 方法调用成功后,房间内的所有用户看到的白板都会切换到指定场景。
  225. **Note:** 指定的场景必须在当前场景组中,否则,方法调用会失败。
  226. @param index 目标场景在当前场景组下的索引号。
  227. @param completionHandler 你可以通过该接口获取 `setSceneIndex` 的调用结果:
  228. - 如果方法调用成功,则返回 `YES`.
  229. - 如果方法调用失败,则返回错误信息。
  230. */
  231. - (void)setSceneIndex:(NSUInteger)index completionHandler:(void (^ _Nullable)(BOOL success, NSError * _Nullable error))completionHandler;
  232. /**
  233. 在指定场景组下插入多个场景。
  234. **Note:** 调用该方法插入多个场景后不会切换到新插入的场景。如果要切换至新插入的场景,需要调用 [setScenePath](setScenePath)。
  235. @param dir 场景组名称,必须以 `/` 开头。不能为场景路径。
  236. @param scenes 由多个场景构成的数组。单个场景的字段详见 [WhiteScene](WhiteScene)。
  237. @param index 待插入的多个场景中,第一个场景在该场景组的索引号。如果传入的索引号大于该场景组已有场景总数,新插入的场景会排在现有场景的最后。场景的索引号从 0 开始。
  238. */
  239. - (void)putScenes:(NSString *)dir scenes:(NSArray<WhiteScene *> *)scenes index:(NSUInteger)index;
  240. /**
  241. 清除当前场景的所有内容。
  242. @param retainPPT 是否保留 PPT 内容:
  243. - `YES`:保留 PPT。
  244. - `NO`:连 PPT 一起清空。
  245. */
  246. - (void)cleanScene:(BOOL)retainPPT;
  247. /**
  248. 删除场景或者场景组。
  249. @param dirOrPath 场景组路径或者场景路径。如果传入的是场景组,则会删除该场景组下的所有场景。
  250. **Note:**
  251. - 互动白板实时房间内必须至少有一个场景。当删除所有的场景后,SDK 会自动生成一个路径为 `/init` 初始场景(房间初始化时的默认场景)。
  252. - 如果删除白板当前所在场景,白板会展示被删除场景所在场景组的最后一个场景
  253. - 如果删除的是场景组,则该场景组下的所有场景都会被删除。
  254. - 如果删除的是当前场景所在的场景组,例如 `dirA`,SDK 会执行向上递归逻辑选择新的场景作为当前场景,规则如下:
  255. - 如果当前场景组路径下还有其他场景组,例如 `dirB`,排在被删除的场景组 `dirA` 后面,则将场景切换至
  256. `dirB` 中的第一个场景(index 为 0)。
  257. - 如果当前场景组路径下 `dirA` 后不存在场景组,则查看当前场景组路径下是否存在场景;
  258. 如果存在,则将场景切换至当前场景组路径下的第一个场景(index 为 0)。
  259. - 如果当前场景组路径下 `dirA` 后没有场景组,也不存在任何场景,则查看 `dirA` 前面是否存在场景组 `dirC`;如果存在,则选择 `dirC` 中的第一个场景(index 为 0)。
  260. - 以上都不满足,则继续向上递归执行该逻辑。
  261. */
  262. - (void)removeScenes:(NSString *)dirOrPath;
  263. /**
  264. 移动场景。
  265. 成功移动场景后,场景路径也会改变。
  266. **Note:**
  267. - 该方法只能移动场景,不能移动场景组,即 `source` 只能是场景路径,不能是场景组路径。
  268. - 该方法支持改变指定场景在当前所属场景组下的位置,也支持将指定场景移至其他场景组。
  269. @param source 需要移动的场景原路径。必须为场景路径,不能是场景组的路径。
  270. @param target 目标场景组路径或目标场景路径:
  271. - 当 `target`设置为目标场景组时,表示将指定场景移至其他场景组中,场景路径会发生改变,但是场景名称不变。
  272. - 当 `target`设置为目标场景路径时,表示改变指定场景在当前场景组的位置,场景路径和场景名都会发生改变。
  273. */
  274. - (void)moveScene:(NSString *)source target:(NSString *)target;
  275. /**
  276. * 以下方法可以对使用【选择框】的工具进行操作。
  277. */
  278. #pragma mark - 执行操作 API
  279. /**
  280. 复制选中内容。
  281. 该方法会将选中的内容存储到内存中,不会粘贴到白板中。
  282. **Note:** 该方法仅当 [disableSerialization](disableSerialization) 设为 `NO` 时生效。
  283. */
  284. - (void)copy;
  285. /**
  286. 粘贴复制的内容。
  287. 该方法会将 [copy](copy) 方法复制的内容粘贴到白板中(用户当前的视角中间)。
  288. **Note:**
  289. - 该方法仅当 [disableSerialization](disableSerialization) 设为 `NO` 时生效。
  290. - 多次调用该方法时,不能保证粘贴的内容每次都在用户当前的视角中间,可能会出现随机偏移。
  291. */
  292. - (void)paste;
  293. /**
  294. 复制并粘贴选中的内容。
  295. 该方法会将选中的内容复制并粘贴到白板中(用户当前的视角中间)。
  296. **Note:**
  297. - 该方法仅当 [disableSerialization](disableSerialization) 设为 `NO` 时生效。
  298. - 多次调用该方法时,不能保证粘贴的内容每次都在用户当前的视角中间,可能会出现随机偏移。
  299. */
  300. - (void)duplicate;
  301. - (void)deleteOpertion DEPRECATED_MSG_ATTRIBUTE("use deleteOperation");
  302. /**
  303. * 删除选中内容。
  304. */
  305. - (void)deleteOperation;
  306. /**
  307. 开启/禁止本地序列化。
  308. 设置 `disableSerialization(true)` 后,以下方法将不生效:
  309. - `redo`
  310. - `undo`
  311. - `duplicate`
  312. - `copy`
  313. - `paste`
  314. @warning
  315. 如果要设置 `disableSerialization(false)`,必须确保同一房间内所有用户使用的 SDK 满足以下版本要求,否则会导致 app 客户端崩溃。
  316. - Web SDK 2.9.2 或之后版本
  317. - Android SDK 2.9.3 或之后版本
  318. - iOS SDK 2.9.3 或之后版本
  319. @param disable 是否禁止本地序列化:
  320. - `YES`:(默认)禁止开启本地序列化;
  321. - `NO`: 开启本地序列化,即可以对本地操作进行解析。
  322. */
  323. - (void)disableSerialization:(BOOL)disable;
  324. /**
  325. 重做,即回退撤销操作。
  326. **Note:** 该方法仅当 [disableSerialization](disableSerialization:) 设为 `NO` 时生效。
  327. */
  328. - (void)redo;
  329. /**
  330. 撤销上一步操作。
  331. **Note:** 该方法仅当 [disableSerialization](disableSerialization:) 设为 `NO` 时生效。
  332. */
  333. - (void)undo;
  334. @end
  335. #pragma mark - 异步 API
  336. @interface WhiteRoom (Asynchronous)
  337. /**
  338. 获取房间的全局状态。
  339. **Note:**
  340. - 该方法为异步调用。
  341. - 通过 [setCustomGlobalStateClass](setCustomGlobalStateClass) 设置自定义状态后,如需异步获取,可以通过 [getRoomStateWithResult](getRoomStateWithResult) 获取自定义 [GlobalState](GlobalState)。
  342. - 调用 [setGlobalState](setGlobalState) 方法后,可以立刻调用该方法。
  343. @param result 回调。返回房间的全局状态,详见 [GlobalState](GlobalState)。
  344. */
  345. - (void)getGlobalStateWithResult:(void (^) (WhiteGlobalState *state))result;
  346. /**
  347. 获取当前的工具状态。
  348. **Note:** 该方法为异步调用。调用 [setMemberState](setMemberState:) 方法后,可以立刻调用该方法。
  349. @param result 回调。返回当前的工具状态,详见 [MemberState](MemberState)。
  350. */
  351. - (void)getMemberStateWithResult:(void (^) (WhiteMemberState *state))result;
  352. /**
  353. 获取实时房间用户列表。
  354. **Note:**
  355. - 该方法为异步调用。
  356. - 房间的用户列表仅包含互动模式(具有读写权限)的用户,不包含订阅模式(只读权限)的用户。
  357. @param result 回调。返回当前房间的用户列表,详见 [WhiteRoomMember](WhiteRoomMember)。
  358. */
  359. - (void)getRoomMembersWithResult:(void (^) (NSArray<WhiteRoomMember *> *roomMembers))result;
  360. /**
  361. 获取用户视角状态。
  362. **Note:** 该方法为异步调用。
  363. @param result 回调。返回当前用户视角状态,详见 [WhiteBroadcastState](WhiteBroadcastState)。
  364. */
  365. - (void)getBroadcastStateWithResult:(void (^) (WhiteBroadcastState *state))result;
  366. /**
  367. 获取房间连接状态。
  368. **Note:** 该方法为异步调用。
  369. @param result 回调。返回当前房间连接状态,详见 [WhiteRoomPhase](WhiteRoomPhase)。
  370. */
  371. - (void)getRoomPhaseWithResult:(void (^) (WhiteRoomPhase phase))result;
  372. /**
  373. 获取用户当前的视角缩放比例。该方法为异步调用。
  374. @param result 回调。返回当前视角缩放比例。
  375. */
  376. - (void)getZoomScaleWithResult:(void (^) (CGFloat scale))result;
  377. /**
  378. 获取当前房间状态。
  379. **Note:** 该方法为异步调用。
  380. @param result 回调。返回当前房间状态,详见 [WhiteRoomState](WhiteRoomState)。
  381. */
  382. - (void)getRoomStateWithResult:(void (^) (WhiteRoomState *state))result;
  383. @end
  384. @interface WhiteRoom(MainView)
  385. - (void)disableWindowOperation:(BOOL)disable;
  386. /**
  387. * 添加窗口
  388. * @param appParams app 类型以及配置内容
  389. */
  390. - (void)addApp:(WhiteAppParam *)appParams completionHandler:(void (^)(NSString *appId))completionHandler;
  391. /** 获取 syncedState 所有状态值 */
  392. - (void)getSyncedState:(void (^)(NSDictionary *state))result;
  393. /** 更新 syncedState 中的值,逻辑与 GlobalState 相似,只会更新有值的 key value。room writable false 时,不会任何效果。 */
  394. - (void)safeSetAttributes:(NSDictionary *)result;
  395. /** 更新 syncedState 特定 key 的值,逻辑与 GlobalState 相似。
  396. * 只会更新有值的 key value。room writable false 时,不会任何效果。
  397. * keyPaths 参考 KVC 的效果
  398. */
  399. - (void)safeUpdateAttributes:(NSArray<NSString *>*)keyPaths attributes:(id)attributes;
  400. @end
  401. #pragma mark - 弃用方法
  402. @interface WhiteRoom (Deprecated)
  403. /**
  404. @deprecated 该方法已废弃,请使用 [disableDeviceInputs](disableDeviceInputs:) 和 [disableCameraTransform](disableCameraTransform:)。
  405. 禁止操作。
  406. @param disable 是否禁止操作,true 为禁止。
  407. */
  408. - (void)disableOperations:(BOOL)disable DEPRECATED_MSG_ATTRIBUTE("use disableDeviceInputs and disableCameraTransform");
  409. /**
  410. @deprecated 该方法已废弃,请使用 [moveCamera](moveCamera:)。
  411. 缩小放大白板。
  412. @param scale 相对于原始大小的比例。
  413. */
  414. - (void)zoomChange:(CGFloat)scale DEPRECATED_MSG_ATTRIBUTE("use moveCamera:");
  415. /**
  416. @deprecated 该方法已废弃,请使用 [getScenesWithResult](getScenesWithResult:)。
  417. 获取所有 ppt 图片。
  418. @param result 回调。返回所有 ppt 图片的地址。
  419. */
  420. - (void)getPptImagesWithResult:(void (^) (NSArray<NSString *> *pptPages))result DEPRECATED_MSG_ATTRIBUTE("use getScenesWithResult:");
  421. @end
  422. NS_ASSUME_NONNULL_END