iOS
I. Thiết lập XCode project
Bước 1: Tải portsipSDK tại đây
Bước 2: Khai báo permission sử dụng Microphone, Camera (để gọi video) trong file Info.plist

Bước 3: Add các thư viện, frameworks này vào TARGETS → Tên App trong XCode
Các thư viện VideoToolbox, MetalKit, GLKit, libresolv.tbd, libc++.tbd thì được XCode hỗ trợ sẵn, chỉ việc bấm dấu "+" và search tên thư viện rồi add vào.
PortSIPVoIPSDK.frameworknằm trong thư mụciOSSampleđược giải nén từ file.zipdownload ở bước 1.

chú ý TARGETS không phải PROJECT
Bước 4: Trong Build Settings → Linking → Other Linker Flags: thêm vào giá trị -ObjC

Tài liệu tham khảo: https://www.portsip.com/docs/sdk/manual/portsip-voip-sdk-user-manual-ios.pdf
II. Khởi tạo SDK
Bước 1: Khai báo biến global let portsipSDK: PortSIPSDK! = PortSIPSDK() . Dùng để gọi các API của PortsipSDK.
Bước 2: Mở file Runner-Bridging-Header.h, import thêm dòng này vào #import <PortSIPVoIPSDK/PortSIPVoIPSDK.h>
Bước 3: Phải implement interface: **PortSIPEventDelegate .** trong Class AppDelegate
Hàm này nên được gọi chung lúc với đăng nhập máy nhánh.
III. Đăng nhập máy nhánh (extension)
Nên có 1 biến portsipRegistered dùng để lưu trạng thái đã register với portsip thành công hay chưa. Nếu đã register thành công thì chỉ cần gọi API refreshRegistration() , không cần qua 2 bước initPortsipSDK() và registerPortsip() bên trên.
Nếu muốn register lại từ đầu thì phải Khởi tạo SDK lại như mục II.
⇒ Khi đăng nhập thành công: sự kiện onRegisterSuccess() xảy ra.
⇒ Ngược lại, khi không thành công thì sự kiện onRegisterFailure() xảy ra.
IV. Đăng xuất máy nhánh (extension)
V. Thực hiện cuộc gọi (outgoing call)
Để thực hiện cuộc gọi:
Khi người nhận cuộc gọi chấp nhận cuộc gọi:
sự kiện onInviteAnswered() xảy ra.
Khi người nhận cuộc gọi từ chối cuộc gọi/cuộc gọi không được bắt máy/hay vì 1 lý do nào đó mà cuộc gọi không thành công:
sự kiện onInviteFailure() xảy ra.
Chủ động kết thúc cuộc gọi:
VI. Nhận cuộc gọi (incoming call)
Cần áp dụng Portsip Mobile Push để ứng dụng có thể nhận cuộc gọi trong các trường hợp không active:
Người dùng không ở màn hình ứng dụng
Khoá màn hình
Kill app
6.1. Thiết lập mobile push
Để sử dụng mobile push, cần khai báo ứng dụng iOS với hệ thống portsip thông qua các bước:
Tạo certificate cho VoIP Push và APN Push cho app iOS
Tạo ra 1
Apple Certificate filevàApple Private key file (no password)(2 file.pem)Gửi cho eTelecom 2 file này để tạo thêm Mobile Push
Xem chi tiết tại: https://www.portsip.com/ios-mobile-push-portsip-pbx mục 4,5 và 9
6.2. Hiện thực
Khi có một cuộc gọi đến máy nhánh:
Sự kiện onInviteIncoming() xảy ra.
Để nhận được cuộc gọi: cần phải sử dụng Portsip Mobile Push, các service của iOS như CallKit, ForceBackground, PushKit.
Liên hệ eTelecom để tạo thêm Mobile Push
Bật những tính năng này trên XCode:

Tham khảo về CallKit: https://developer.apple.com/documentation/callkit(opens new window)
Khai báo các biến global sau đây:
voipRegistry: PKPushRegistry! = PKPushRegistry(queue: DispatchQueue.main). Dùng để khai báo về việc nhận notification từ Portsip Mobile Push._VoIPPushToken: String = "". Token dùng để nhận notification VoIP._APNsPushToken: String = "". Token dùng để nhận notification chung._cxProvider: CXProvider!. Dùng để hiển thị popup cuộc gọi đến_cxCallController: CXCallController = CXCallController(). Dùng để thao tác với các cuộc gọi CallKit như ngắt máy, bắt máy, ...
class AppDelegate implement thêm các interface sau: UIApplicationDelegate, PKPushRegistryDelegate, CXProviderDelegate
class AppDelegate import thêm các service sau: PushKit, UserNotifications, CallKit
Phải có tối thiểu 2 hàm application() ở file AppDelegate.swift
1 hàm application mặc định. Tại đây, enable CallKit (để có thể nhận cuộc gọi, nghe-gọi khi ở background mode), PushNotification (để sử dụng Portsip Mobile Push), ForceBackground (để app chạy ở chế độ background)
1 hàm application dùng để lấy device token dùng cho việc nhận notification
Phải có tối thiểu 2 hàm pushRegistry() ở file AppDelegate.swift
1 hàm pushRegistry dùng để lấy token dùng cho việc nhận notification VoIP
1 hàm pushRegistry dùng để hứng notification VoIP từ Portsip Mobile Push. Khi có cuộc gọi đến, thì portsip sẽ bắn notification về cho thiết bị của người dùng.
Khai báo Header với _VoIPPushToken và _APNsPushToken trước khi gọi API Register hay RefreshRegistration của portsipSDK (mục II bước 1).
Dùng CallKit để thông báo cuộc gọi đến, có thể hiện thực như sau:
Một số thao tác user có thể thực hiện khi có cuộc gọi từ CallKit: Chấp nhận (bắt máy), Từ chối, Ngắt máy (sau khi đã chấp nhận), ...
Khi cuộc gọi kết thúc, để tắt màn hình gọi điện của CallKit đi:
Khi người dùng tắt app, tắt màn hình điện thoại hoặc kill app thì cần phải giữ cho portsipSDK awake, để ứng dụng luôn sẵn sàng nhận cuộc gọi đến.
VII. Cuộc gọi video
Đầu tiên, ta tạo 1 file swift (ví dụ: VideoCallViewController.swift) kế thừa UIViewController. File này sẽ được link với 1 ViewController được tạo ra qua các bước 2 và 3.
Open file Main.storyboard dưới dạng Interface Builder

Tạo 1 ViewController (ví dụ: VideoCallViewController). Bấm dấu "+" phía góc phải-trên của màn hình xCode ⇒ search từ "View Controller" ⇒ Double Click hoặc Enter.

⇒ Ta sẽ có 1 ViewController như thế này:

Tại màn hình này, ở phần Custom Class ở bên phải, ta tìm và chọn class VideoCallViewController được tạo trước ở bước 1.

Sau đó, ở phần Identity, mục Storyboard ID ta tuỳ ý đặt cho ViewController này 1 ID, đồng thời check vào checkbox Use Storyboard ID bên dưới.

⇒ Thử Open file Main.storyboard dưới dạng Source Code, ta sẽ thấy đoạn code như sau:

Trong ViewController này, ta tiến hành dựng các component cần thiết (1 vùng để chứa RemoteVideo - tức video từ phía khách hàng, 1 vùng để chứa LocalVideo - tức video của chính bạn, 1 button để Kết thúc cuộc gọi, các button như Bật/Tắt loa ngoài, chuyển đổi Camera trước và sau, ...)
Tạo 2 connection outlets, dùng để gắn video vào 2 vùng RemoteVideo và LocalVideo. Cách gắn sẽ trình bày ở bước sau.
Ở đoạn code demo bên dưới, chỉ bao gồm 1 vùng để chứa RemoteVideo, 1 vùng để chứa LocalVideo, 1 button để Kết thúc cuộc gọi.

Trong file VideoCallViewController.swift (đã tạo ở bước 1), khai báo các biến sau:
Trong file AppDelegate.swift:
Khai báo thêm biến
var videoCallView: VideoCallViewController!.Khi đăng nhập máy nhánh thành công, sự kiện
onRegisterSuccess()xảy ra, trong sự kiện này, khởi tạo các giá trị cho VideoCallView:
Thực hiện cuộc gọi video, gọi hàm call() với tham số videoCall = true
⇒ Khi người được gọi nhấc máy: sự kiện onInviteAnswered() xảy ra.

Trong file VideoCallViewController.swift:
Khai báo thêm 2 biến
Khi view được init lần đầu tiên, ta phải gọi hàm initVideoRender() cho remoteVideo và localVideo.
Khi view đã hiển thị, gắn video cho localVideo và remoteVideo.
Khi bấm vào nút Kết thúc cuộc gọi:
Khi view đã tắt, gỡ video hiện tại ra khỏi localVideo và remoteVideo.
Khi có cuộc gọi đến, sự kiện onInviteIncoming() xảy ra
⇒ Khi bạn nhấc máy:
Last updated