共用方式為


最佳做法:Azure 通訊服務通話 SDK

此文章提供與 Azure 通訊服務通話 SDK 相關的最佳做法相關資訊。

Azure 通訊服務通話 Web SDK 的最佳做法

本節提供相關資訊,說明與適用於語音和視訊通話的 Azure 通訊服務通話 Web (JavaScript) SDK 相關聯的最佳做法。

在通話進行時,插入麥克風或從裝置管理員啟用麥克風

當 Azure 通訊服務通話開始時沒有麥克風可用,而接著麥克風變成可用時,這項變更就會引發 noMicrophoneDevicesEnumerated 診斷事件。 發生這種事件時,您的應用程式必須叫用 askDevicePermission,以取得使用者同意來列舉裝置。 然後,使用者可以將麥克風設為靜音或取消靜音。

處置 VideoStreamRendererView

通訊服務應用程式應在不再需要 VideoStreamRendererView 時加以處置,或是處置其父 VideoStreamRenderer 執行個體。

在發生 onbeforeunload 事件時掛斷通話

您的應用程式應該在發出 onbeforeunload 事件時叫用 call.hangup

處理多個索引標籤上的多個通話

您的應用程式不應該在行動裝置上同時連線至多個瀏覽器索引標籤的通話。 這種情況可能會因為裝置上的麥克風和相機的資源配置而導致未定義的行為。 建議開發人員在開始新的通話之前,一律在背景掛斷已完成的通話。

處理 OS 在來電時將通話靜音

在 (同時針對 iOS 和 Android) 進行 Azure 通訊服務通話期間,如果有來電或是啟用語音助理,OS 會自動將使用者的麥克風和相機靜音。 在 Android 上,通話會在通話結束時自動取消靜音,並重新啟動視訊。 在 iOS 上,將視訊取消靜音並重新啟動需要使用者動作。

您可以使用 microphoneMuteUnexpectedly 的品質事件,接聽麥克風非預期地靜音的通知。 請記住,若要正確重新加入通話,您必須使用 SDK 1.2.3-beta.1 或更新版本。

const latestMediaDiagnostic = call.api(SDK.Features.Diagnostics).media.getLatest();
const isIosSafari = (getOS() === OSName.ios) && (getPlatformName() === BrowserName.safari);
if (isIosSafari && latestMediaDiagnostic.microphoneMuteUnexpectedly && latestMediaDiagnostic.microphoneMuteUnexpectedly.value) {
  // received a QualityEvent on iOS that the microphone was unexpectedly muted - notify user to unmute their microphone and to start their video stream
}

您的應用程式應該叫用 call.startVideo(localVideoStream); 以啟動視訊串流,而且應該使用 this.currentCall.unmute(); 來將音訊取消靜音。

管理裝置

您可以使用 Azure 通訊服務 SDK 來管理您的裝置和媒體作業。

您的應用程式不應使用 getUserMediagetDisplayMedia 之類的原生瀏覽器 API 來取得 SDK 外部的串流。 如果您這麼做,則必須先手動處置媒體串流,再透過通訊服務 SDK 使用 DeviceManager 或其他裝置管理 API。

要求裝置權限

您可以使用 SDK 要求裝置權限。 您的應用程式應該使用 DeviceManager.askDevicePermission 來要求存取音訊和/或視訊裝置。

如果使用者拒絕存取,DeviceManager.askDevicePermission 會於後續通話針對特定的裝置類型 (音訊或視訊) 傳回 false,即使在重新整理頁面之後也一樣。 在此案例中,您的應用程式必須:

  1. 偵測使用者先前拒絕的存取權。
  2. 指示使用者手動重設或明確授與特定裝置類型的存取權。

管理另一個處理序正在使用的相機行為

  • 在 Windows Chrome 和 Windows Microsoft Edge 上:如果您在開啟視訊的情況下啟動、加入或接受通話,且另一個處理序 (非 Web SDK 執行所在的瀏覽器) 正在使用相機裝置,則通話只會以音訊啟動,且不會有視訊。 因為相機無法啟動,因此會引發 cameraStartFailed 使用者面向診斷旗標。

    同樣的情況適用於開啟視訊中通話。 您可以在另一個處理序中關閉相機,讓該處理序釋放相機裝置,然後再次從通話啟動視訊。 然後,會針對該通話開啟視訊,且遠端參與者會開始看到您的視訊。

    macOS Chrome 或 macOS Safari 中並沒有這個問題,因為 OS 可讓處理序和執行緒共用相機裝置。

  • 在行動裝置上:如果 ProcessA 要求相機裝置,且 ProcessB 正在使用相機裝置,則 ProcessA 會取代相機裝置,而 ProcessB 會停止使用相機裝置。

  • 在 iOS Safari 上:您無法在相同索引標籤上或跨索引標籤針對多個通話用戶端開啟相機。 當任何通話用戶端使用相機時,其會取代先前正在使用相機之任何通話用戶端的相機使用權限。 先前的通話用戶端會取得 cameraStoppedUnexpectedly 使用者面向診斷旗標。

管理螢幕畫面分享

關閉應用程式並不會使應用程式無法共用

假設您從 Chromium 共用 Microsoft Teams 應用程式的螢幕。 然後,您選取 Teams 應用程式上的 [X] 按鈕以將其關閉。 雖然視窗已關閉,但 Teams 應用程式會持續在背景中執行。 圖示仍會出現在桌面工作列上。 因為 Teams 應用程式仍在執行中,所以其仍與遠端參與者進行螢幕畫面分享。

若要停止應用程式進行螢幕畫面分享,您必須採取下列其中一個動作:

  • 以滑鼠右鍵按一下桌面工作列上的應用程式圖示,然後選取 [結束]
  • 選取瀏覽器上的 [停止共用] 按鈕。
  • 撥打 SDK 的 Call.stopScreenSharing() API 作業。

Safari 只能執行全螢幕畫面分享

Safari 只允許整個螢幕的螢幕畫面分享。 該行為不同於 Chromium,其可讓您以全螢幕、特定傳統型應用程式或特定瀏覽器索引標籤的形式進行螢幕共用。

您可以授與 macOS 上的螢幕畫面分享權限

若要在 macOS Safari 或 macOS Chrome 中進行螢幕畫面分享,請在 OS 功能表上將必要的權限授與瀏覽器:[系統喜好設定]>[安全性與隱私]>[螢幕錄製]

Azure 通訊服務通話原生 SDK 的最佳做法

本節提供相關資訊,說明與語音和視訊通話的 Azure 通訊服務通話原生 SDK 相關聯的最佳做法。

支援的平台

以下是最低 OS 平台需求,以確保通話原生 SDK 的最佳功能。

  • 在建置時間支援 iOS 10.0+,以及在執行階段支援 iOS 12.0+
  • Xcode 12.0+
  • 支援 iPadOS 13.0+

確認應用程式要求的裝置權限

若要使用通話原生 SDK 撥打或接聽通話,取用者必須授權每個平台存取裝置資源。 身為開發人員,您必須提示使用者存取權,並確保權限已啟用。 取用者會授權這些存取權限,因此請確認其目前具有必要權限。

  • NSMicrophoneUsageDescription 以取得麥克風存取權
  • NSCameraUsageDescription 以取得相機存取權

設定記錄

實作記錄,如擷取記錄檔教學課程中所述,比以往更為重要。 詳細的記錄有助於診斷符合最低 SDK 準則的裝置型號或 OS 版本特有的問題。 建議開發人員使用記錄 API 來設定記錄。 如果沒有記錄,則 Microsoft 支援服務小組無法協助偵錯通話並進行疑難排解。

追蹤 CallID

CallID 是通話的唯一識別碼。 其會識別來自在單一通話期間連線之所有參與者和端點的相互關聯事件。 在大部分情況下,您可以將其用來檢閱記錄。 Microsoft 支援服務小組會要求其協助針對通話進行疑難排解。

您應該在您於應用程式設定的遙測中追蹤 CallID 值。 若要了解如何擷取每個平台的值,請遵循疑難排解指南中的指導方針。

訂閱使用者面向的診斷和媒體品質統計資料

您可以使用這些 Azure 通訊服務功能來協助改善使用者體驗:

  • 使用者面向診斷:檢查通話的屬性,以判斷影響客戶問題的原因。
  • 媒體品質統計資料:檢查傳入和傳出通話計量的低階音訊、視訊和螢幕共用品質計量。 建議您收集資料,並在通話結束後,將其傳送至管線擷取。

管理錯誤處理

如果在通話或實作期間發生任何錯誤,則方法會傳回包含錯誤碼的錯誤物件。 請務必使用這些錯誤物件進行適當的錯誤處理,以及顯示警示。 通話狀態也會傳回錯誤碼,以協助識別通話失敗背後的原因。 您可以參考疑難排解指南,以解決任何問題。

管理影片串流

當 UI 不再顯示視訊時,請務必處置 VideoStreamRendererView。 使用 VideoStreamType 來判斷資料流的類型。

進行一般記憶體管理

預先配置資源。 在應用程式的啟動階段 (而不是隨選) 初始化通話用戶端和任何必要的資源。 這個方法可減少啟動通話時的延遲。

正確處置。 在使用後處置所有通話物件,以釋放系統資源並避免記憶體流失。 請務必取消訂閱可能導致記憶體流失的事件

考慮處理序存取相機或麥克風的方式

如果在行動裝置上有多個處理序同時嘗試存取相機或麥克風,要求存取的第一個處理序會取得裝置的控制權。 因此,第二個處理序會立即失去其存取權。

最佳化程式庫大小

在軟體開發過程中將程式庫的大小最佳化十分重要,特別是隨著應用程式變得更複雜且資源密集,原因如下:

  • 應用程式效能:較小型連結庫可減少應用程式必須載入、剖析及執行的程式碼數量。 這項減少可大幅提升應用程式的啟動時間和整體效能,特別是在資源有限的裝置上。

  • 記憶體使用量:您可以將程式庫大小降到最低,藉此減少應用程式的執行階段記憶體使用量。 對於記憶體經常受限的行動裝置而言,這項減少很重要。 較低的記憶體使用量可能會致使系統當機次數減少,且效能更佳。

如需詳細資訊,請參閱