Hey guys,
Wanted to check in on the SDK, share some experiences, and maybe see what Zoom’s commitment to maintaining this product is, if there are roadmaps available, and if we can expect some better resources.
Some background:
We’re currently using it in our production application to perform telehealth appointments. We are an enterprise, we do pay for this, and while we aren’t some Fortune 100 giant, we’re still a serious customer. For the most part, the basic functions are working — we can have video calls and that’s great. The actual infrastructure itself has been very solid with reliable calls, etc.
But as far as getting the technology integrated into our application, it’s taken a lot of trial and error and a ton of workarounds to make even this work. That has me really wondering if it’s just a flawed implementation on my part or if the SDK itself is lacking.
Example issues:
One of the biggest challenges — and the most egregious so far — has been the zIndex/elevation of mounted ZoomView videos (particularly bad on Android). Anecdotally, it seems like the SDK under the hood is using the ZoomView’s position to determine where to stick a video surface and attach a video to it. But it seems to do this asynchronously and can take an indeterminate amount of time to actually attach the video streams to the containers. This results in black boxes, components being rendered out of order within the zIndex (videos covering other components, videos covering each other when they shouldn’t, etc.).
To circumvent this, I had to unmount, destroy, and remount every single ZoomView using setTimeout
s to make sure the video streams actually got mounted when and how they should.
On iOS, ZoomViews often render black. This seems related to video streams not reattaching. The only way I was able to consistently get them to render was to use keys on the ZoomViews to force them to be removed and destroyed… then setTimeout
and pray before remounting them. They’re very flaky when it comes to re-renders and have to be kept as stable as possible to stay locked in — particularly if you’re trying to make draggable components. Very brittle.
Which brings me to some of the interfaces. For example, isPiPView
— is this even a thing? It’s an interface on the ZoomView, but it seems to have no effect. There’s zero documentation on it besides a mention in the patch notes as having been added. This would have been super useful instead of having to create a draggable component.
Camera orientation:
My app is locked in portrait mode unless a screen-sharing session is started. When sharing starts, we unlock the device to let the user transition into landscape. This mostly works fine aside from once again having to unmount and remount every ZoomView. However, there seems to be a strange issue specific to rotating clockwise (top of device to the right). The values for camera rotation get goofy — 0 ends up being the right way up, but it’s also the camera rotation for portrait. If you rotate the device 270 degrees counter-clockwise, this hack fails to work. It does this even if you unlock everything and just let the SDK manage the camera rotation, so definitely a bug in there somewhere.
There also seems to be some Zoom context cleanup that doesn’t happen when leaving an active session. Sometimes the zoomClient
just gets into a bad state, causing joining a new session to fail. The only thing I was able to come up with was to check if the client thought it was in a session or not, call leaveSession, and then repeat the checks/cleanup until it was actually cleaned up.
Some of the interfaces that exist in the types don’t work, like the aforementioned PiP view and the flashlight, just as examples. Some of the event listeners don’t return useful information, resulting in situations where you have to make follow-up calls to the client to figure out what actually changed in order to update the interface.
This all could genuinely be a skill issue on my end, but if it is, I would really love a more comprehensive example app that shows off these features and how to implement them. Something more than what we have now, which just mounts some ZoomViews with flex thrown into a container.
Anyway, if anyone has experienced these issues and found solutions, please share them. There aren’t a ton of users on the React Native SDK based on the weekly downloads, so we’re kind of at the mercy of these forums.
Thanks!