PagecallSDK - Integrate Pagecall for your iOS Application

Overview

Integrate Pagecall for your iOS Application

[!] Bitcode is not supported, because it depends on WebRTC framework which does not supported bitcode for now.

Prerequisites

  • Make sure you set NSMicrophoneUsageDescription, and NSCameraUsageDescription if you are creating a video call application.
  • Also, Those UIBackgroundModes should be enabled: audio, fetch, voip.

Usage

  • It is not suppored to instantiate from a storyboard, because a required WKWebViewConfiguration cannot be applied with it.

1. Programatically create a PagecallWebView

import UIKit
import WebKit
import PagecallSDK

class ViewController: UIViewController, WKUIDelegate {
    var webView: PagecallWebView?

    override func viewDidLoad() {
        super.viewDidLoad()
        let webView = PagecallWebView(frame: CGRect.zero)
        webView.load(URLRequest(url: "https://app.pagecall.net/my_room_id"))
        self.view.addSubview(webView)
        self.webView = webView

        webView.translatesAutoresizingMaskIntoConstraints = false
        webView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 80.0).isActive = true
        webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -20.0).isActive = true
        webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20.0).isActive = true
        webView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20.0).isActive = true
    }

    override func viewDidDisappear(_ animated: Bool) {
        // If it is not called, the webView can still have the access to microphone or camera
        webView?.dispose()
        webView = nil
    }
}

2. Handle delegate

This SDK uses a native bridge for WebRTC before iOS 15.0, and WKWebView-native WebRTC on iOS 15.0 and after. WKWebView-native WebRTC asks for permission permission everytime an user enters the meeting room, unless you apply changes bloew.

class ViewController: UIViewController, WKUIDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let webView = PagecallWebView(frame: CGRect.zero)
+       webView.uiDelegate = self
        // ...
    }
    
    ...

+   @available(iOS 15.0, *)
+   func webView(_ webView: WKWebView, requestMediaCapturePermissionFor origin: WKSecurityOrigin, initiatedByFrame frame: WKFrameInfo, type: WKMediaCaptureType, decisionHandler: @escaping (WKPermissionDecision) -> Void) {
+       decisionHandler(.grant)
+   }
}

Tips

  • If you want something to happen on a webview closing, you need to handle it in your view controller.
    class ViewController: UIViewController, WKUIDelegate {
        override func viewDidLoad() {
            // Wherever a PagecallWebView is created
            webView.uiDelegate = self
        }
      
        func webViewDidClose(_ webView: WKWebView) {
            self.dismiss(animated: true)
        }
    }
Comments
  • feat: implement NativeBridge (swift)

    feat: implement NativeBridge (swift)

    changes

    • chore: requestId를 조금 더 simple하게 만들었습니다.
    • fix: PagecallNative.emit, PagecallNative.response는 payload를 string으로 받아 JSON.parse하여 Controller에게 전달합니다.
    • feat: swift native 단에서 message를 듣고 emit하거나 response 할 수 있습니다.

    test

    • Pagecall core에서 addListener 이후 emit하면 이벤트가 listen 됨을 확인하였습니다.
    • Pagecall core에서 requestController를 통한 promise가 resolve 됨을 확인하였습니다.
    opened by lockcept 2
  • feat: getAudioDevices, setAudioDevice, pauseAudio, resumeAudio, audioVolume 구현

    feat: getAudioDevices, setAudioDevice, pauseAudio, resumeAudio, audioVolume 구현

    changed

    • pauseAudio, resumeAudio 를 구현하였습니다.
    • ChimeRealtimeObserver에서 Core에게 local & remote Audio의 mute, unmute 여부를 알려줍니다.
    • ChimeRealtimeObserver에서 Core에게 local AudioVolume의 변화를 알려줍니다.
    • getAudioDevices에서 MediaDeviceInfo List를 알려줍니다. deviceId에 대응 되는 개념이 없어 label을 id로 사용합니다.
    • eventName의 후보를 enum으로 만들었습니다.

    tested

    샘플앱과 pagecall webapp 간에 음성 패킷, pause or resume 여부가 잘 소통됨

    opened by lockcept 1
  • feat: implement NativeBridge (js)

    feat: implement NativeBridge (js)

    PagecallNative.js 를 생산하는 부분을 구현하였습니다.

    • rollup을 통해 .js 파일을 빌드하고, browserify를 통해 브라우저 환경에서 사용할 수 있도록 굽습니다.
    • require('crypto') 때문에 browserify 결과가 26000줄을 넘어갑니다. (제외하면 2000줄) https://caniuse.com/?search=crypto 에 따르면 Pagecall 지원 브라우저 환경에서는 crypto를 사용할 수 있지만, xcode simulator에서 사용할 수 없어 일단 exclude 하지 않았습니다.
    opened by lockcept 1
  • fix: git-lfs를 사용하지 않습니다.

    fix: git-lfs를 사용하지 않습니다.

    git-lfs 사용시 SPM에서 import 할 때에 문제가 많이 발생하였습니다. git-lfs 사용을 강제하던 Binaries/AmazonChimeSDKMedia.xcframework/ios-arm64_armv7/AmazonChimeSDKMedia.framework/AmazonChimeSDKMedia (203MB) 를 삭제하기 위해 AmazonChimeSDKMedia Binary를 bitcode를 사용하지 않는 버전으로 대체하였습니다.

    이 경우 다른 패키지에서 쉽게 import가 됨을 확인하였습니다.

    opened by lockcept 0
  • fix: 블루투스 이어폰 연결이 잘 안되는 이슈 등

    fix: 블루투스 이어폰 연결이 잘 안되는 이슈 등

    changed

    .allowBluetooth option을 통해 첫 접속 시 블루투스 연결이 잘 안되는 이슈를 해결했습니다. .mixWithOthers option을 통해 enterpage에서 스피커 테스트를 진행하면 마이크 연결이 해제되는 이슈를 해결했습니다. (아직 enter 이후는 이슈가 존재합니다) voiceFocus 모드를 항상 enable합니다.

    opened by lockcept 0
  • feat: enter page에서 audioVolume이 표시됩니다.

    feat: enter page에서 audioVolume이 표시됩니다.

    Changed

    Chime의 인터페이스를 통해서는 세션 연결 전, 마이크 정보를 받아올 수가 없습니다. 따라서 직접 iOS의 인터페이스를 이용하여 받아옵니다.

    마이크 장치는 OS의 Default를 사용하도록 우선 설정했습니다. 앱의 권한이 없는 경우 큰 문제가 되지 않습니다. (동작하지는 않습니다.)

    Tested

    아이패드 앱에서 & 시뮬레이터에서 Chime Session 연결 전 audioVolume이 동작합니다.

    opened by lockcept 0
  • feat: getPermissions

    feat: getPermissions

    changed

    getPermissions 함수를 구현하였습니다. swift에서 기본적으로 JSON에 null을 넣을 수 없어 custom encoder를 구현하여야하는데, 일단 리턴 값을 null 대신 optional로 선언하였습니다.

    tested

    core에서 getPermission으로 결과물을 잘 받아옵니다.

    opened by lockcept 0
  • chore: NativeBridge의 함수 개선

    chore: NativeBridge의 함수 개선

    changed

    • swift단에서 BridgeAction을 string && enum으로 만들었습니다.
    • 비동기함수의 response에 errorMessage를 던져 reject 시킬 수 있습니다.
    • getPermissions, requestPermissions는 아직 Swift 쪽 속이 빈 bridge interface에만 구현된 함수입니다

    tested

    • error를 던질 경우 core 단에서 에러를 확인 함
    opened by lockcept 0
  • fix: Pagecall sample app에서 패키지를 잘 가져다 쓸 수 있도록 합니다.

    fix: Pagecall sample app에서 패키지를 잘 가져다 쓸 수 있도록 합니다.

    changed

    • SDK를 사용하는 app에서 javascript 리소스를 잘 가져다 쓸 수 있도록 했습니다.

    설명 번들에서 js파일을 가져다가 웹뷰에서 실행하는 코드가 있습니다. 번들된 리소스의 path를 가져오는 과정에서, 기존에는 Bundle(for: type(of: self)).path(forResource: "PagecallNative", ofType: "js") 를 사용하였으나 이는 절대경로 같은 판정이 있는지, SDK를 import한 sample app에서도 resource 추가를 해주어야 동작하였습니다. 그렇지 않기 위해서는 2020년 이후 권장하는 Bundle.Module 을 사용해야합니다. (Bundle.module.path(forResource: "PagecallNative", ofType: "js")) 그러나, Bundle에는 기본적으로 Module 속성이 없고, SDK가 빌드 되는 과정에서 아래 사진과 같은 extension이 자동으로 추가되어 타이핑이 가능한 형태입니다. 다만 알 수 없는 이유로 아래 파일이 생기지 않아 Module을 사용할 수 없어 문제를 겪었습니다. 해결: package.swift 명세에 path를 지정해주니 빌드 과정에서 'resource_bundle_accessor.swift' 가 생기게 되어 Bundle.Module이 사용 가능해졌습니다. image

    도움이 된 자료: https://developer.apple.com/videos/play/wwdc2020/10169/, https://developer.apple.com/documentation/xcode/bundling-resources-with-a-swift-package

    • init 함수를 public으로 바꾸었습니다.
    opened by lockcept 0
  • feat: Chime DefaultMeetingSession을 만들기

    feat: Chime DefaultMeetingSession을 만들기

    changes

    • core의 nativeBridge에서 보내준 JoinMeetingResponse를 토대로 DefaultMeetingSession을 만듭니다.
    • AmazonChimeSDK는 아직 SPM Package로 배포되지 않고 있어서, 바이너리를 넣었습니다. https://github.com/aws/amazon-chime-sdk-ios/issues/338 (200MB 넘는 파일이 하나 있어, git-lts를 사용했습니다.)

    테스트

    DefaultMeetingSession을 잘 생성합니다.

    opened by lockcept 0
Owner
PPLINK
Break down constraints of space and link people.
PPLINK
SandboxKit - Framework that makes it easy to launch a single Scene of your application

SandboxKit This framework makes debugging more efficient in your application. Sandbox is the name of a structure that improves the efficiency of debug

Aoi Okawa 10 Apr 24, 2022
ExpoMod - a small application tool that lets you quickly setting up your computer for presentations / exhibitions

ExpoMod is a small application tool that lets you quickly setting up your computer for presentations / exhibitions. Or simply having useful shortcut to not being distract and keep awake your computer.

Niemes 10 Jun 29, 2022
Kushal Shingote 1 Feb 2, 2022
Displays your HomeKit temperature sensors in your menu bar

Temperature Glance Displays your HomeKit temperature sensors in your menu bar Screenshot Note This is a very simple app that I made for myself but dec

Fernando Bunn 15 Nov 14, 2022
The Art World in Your Pocket or Your Trendy Tech Company's Tote, Artsy's mobile app.

Meta State: production Point People: Brian Beckerle, Mounir Dhahri, Pavlos Vinieratos CI : This is an Artsy OSS project. Other mobile projects are Ene

Artsy 3.2k Jan 4, 2023
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Introduction Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the latest

Respresso 10 Nov 8, 2022
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Respresso Android client Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import

Respresso 11 May 27, 2021
Save development time! Respresso automatically transforms and delivers your digital assets into your projects

Respresso iOS client Respresso is a centralized resource manager for shared Android, iOS and Web frontend projects. It allows you to simply import the

Respresso 50 May 1, 2021
You can monitor your APIs and websites on your menubar. Gives you status code 🎉 Cool & good

Hope not. Monitor your APIs and websites on your menubar. For macOS. Right now! YyeeeHav!

Steven J. Selcuk 10 Nov 29, 2022
Home Assistant Native iOS Application built with SwiftUI for iOS 15+

Home Assistant - Native iOS SwiftUI Application Screenshots Disclaimer - Please read This application is mostly a not-working mockup written in SwiftU

Alessio Santoru 34 Dec 13, 2022
iOS application to extract accession numbers from wall labels using Vision and VisionKit frameworks.

iOS application to extract accession numbers from wall labels using Vision and VisionKit frameworks. Important This is experimenta

San Francisco International Airport Museum 6 Feb 2, 2022
Tip Calculator is a tip calculator application for iOS.

Pre-work - Tip Calculator Tip Calculator is a tip calculator application for iOS. Submitted by: MohammadAmin Montazeri Time spent: 1 hours spent in to

Amin M 0 Nov 23, 2021
IOS Swift Application using VIPER Architecture

IOS Swift Application using VIPER Architecture. This is a simple design application for E-Commerce using VIPER architecture and CoreData, I prefer using Delegate Protocols rather than Third Party Library such as Rx but at this project I make it as an example on how to using VIPER.The application also support localization.

Mahmoud Salah 0 Dec 1, 2021
How to develop an iOS 14 application with SwiftUI 2.0 framework. How to create an Onboarding Screen with Page Tab View

Ama-Fruits USER INTERFACE AND USER EXPERIENCE APP DESIGN How to develop an iOS 14 application with SwiftUI 2.0 framework. How to create an Onboarding

Noye Samuel 1 Dec 11, 2021
iOS application to rate songs in Spotify playlists

Description Reviewery is an iOS application to rate songs in Spotify playlists. It's a hobby project built in React Native. Read more in my Medium art

Vadym Markov 15 May 11, 2022
Joplin - an open source note taking and to-do application with synchronization capabilities for Windows, macOS, Linux, Android and iOS. Forum: https://discourse.joplinapp.org/

Joplin® is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are sea

Laurent 33.7k Dec 30, 2022
The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms.

Bitwarden Mobile Application The Bitwarden mobile application is written in C# with Xamarin Android, Xamarin iOS, and Xamarin Forms. Build/Run Require

Bitwarden 4.2k Dec 29, 2022
3DProject: MR based IOS application

3DProject Driving Question This is MR based IOS application. MR is to place a me

null 1 Feb 16, 2022
XCSnippetsApp - macOS application to explore code snippets from the Swift and iOS community, view and edit the snippets before adding them conveniently to Xcode

XCSnippetsApp macOS application to explore code snippets from the Swift and iOS community, view and edit the snippets before adding them conveniently

Marco Eidinger 119 Dec 27, 2022