์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ Callkit์ ์ด์ฉํด์ ์ ํ์ค๋ ํ๋ฉด์ ๋์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๋ฐ๋ก ์์ํ ๊ฒ์~
Xcode
ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ฃผ์ ๋ค Signing & Capabitities ๋ก ์ด๋ํ์ ์ Background modes๋ฅผ ์ถ๊ฐํด์ฃผ์๊ณ
Voice over IP๋ฅผ ์ฒดํฌํด์ฃผ์ธ์!
ViewController
์๋์ ๊ฐ์ด ๋ถ์ฌ๋ฃ์ผ์ ๋ค ์คํ์์ผ์ฃผ์ธ์. (์ค์ ๋๋ฐ์ด์ค๋ก ์คํ์์ผ์ผ ํฉ๋๋ค!)
import UIKit
import CallKit
class ViewController: UIViewController, CXProviderDelegate {
override func viewDidLoad() {
let provider = CXProvider(configuration: CXProviderConfiguration())
provider.setDelegate(self, queue: nil)
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: "Fomagran")
provider.reportNewIncomingCall(with: UUID(), update: update, completion: { error in })
}
func providerDidReset(_ provider: CXProvider) {
}
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
action.fulfill()
}
}
๋ค์๊ณผ ๊ฐ์ด ์ ํด์ค ์ด๋ฆ์ผ๋ก ์ค์ ๋๋ฐ์ด์ค์ ์ ํ๊ฐ ์ค๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
์ ํ ํธ์ฌํ๊ธฐ
Apple Developer
์ ํ ๊ฐ๋ฐ์ ์ฌ์ดํธ๋ก ์ด๋ํด์ฃผ์ธ์.
Register a Identifier
์ผ์ชฝํญ์์ identifier๋ฅผ ๋๋ฅด์ ํ ์๋ก์ด identifier๋ฅผ ๋ฑ๋กํด์ฃผ์ธ์.
App IDs ๋ฅผ ๋๋ฅด์๊ณ
App์ ํด๋ฆญํ ๋ค continue๋ฅผ ๋๋ฌ์ค๋๋ค.
ํด๋น ํ๋ก์ ํธ์ Bundle ID๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.
์๋๋ก ๋ด๋ ค์ Push Notifications๋ ์ฒดํฌํด์ค๋๋ค.
์ด๋ ๊ฒ ํ ๋ค Register๋ฅผ ๋๋ฌ ๋ฑ๋กํด์ค๋๋ค.
Create a Certiciate
๊ทธ ๋ค์์ผ๋ก Certificate๋ฅผ ์์ฑํ ๊ฑด๋ฐ์.
Certificates์ +๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.
์๋๋ก ๋ด๋ฆฐ ๋ค VoIP Services Certificate๋ฅผ ํด๋ฆญํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณค ์์์ ๋ง๋ค์ด์ฃผ์ identifier ์ฑ์ ๊ณจ๋ผ์ค๋๋ค.
์ด๋๋ก ์ ์งํ์ ๋ค์ ํค์ฒด์ธ ์ ๊ทผ ์ฑ์ ์ผ์ฃผ์ธ์!
KeyChainAccess
์ธ์ฆ ๊ธฐ๊ด์์ ์ธ์ฆ์ ์์ฒญ์ ๋๋ฌ์ฃผ์ธ์.
๋ค์๊ณผ ๊ฐ์ด ์ด๋ฉ์ผ์ ์ ๊ณ ๋์คํฌ์ ์ ์ฅ๋จ์ ์ฒดํฌํด์ฃผ์ธ์.
์ธ์ฆ์ ์์ฒญ์ ์ ์ ์ฅํด๋ก๋๋ค.
๊ทธ๋ฆฌ๊ณค ๋ค์ ์ ํ ๊ฐ๋ฐ์ ์ฌ์ดํธ๋ก ์์
์์์ ์ ์ฅํด๋ ์ธ์ฆ์ ์์ฒญ ํ์ผ์ Choose File์ ์ ํํด ๊ณจ๋ผ์ฃผ๊ณ Continue๋ฅผ ๋๋ฌ์ฃผ์ธ์.
๋ง์ง๋ง์ผ๋ก Certificate๋ฅผ Downloadํด์ค๋๋ค.
๋ค์ด๋ก๋ํ Certificate ํ์ผ์ ๋๋ฅด๋ฉด ํค์ฒด์ธ ์ ๊ทผ์ฑ์ด ๋ฐ๊ฑฐ์์.
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด VoIP ์ธ์ฆ์๊ฐ ๋ณด์ผ๊ฑฐ์์ ์ด๊ฑธ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค๋ก ํด๋ฆญํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณค ์๋์ ๊ฐ์ด ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํด์ฃผ์ธ์.
์ด๋ฆ์ ์ ํด์ฃผ์๊ณ
ํ์ผ ํฌ๋งท์ .p12๋ฅผ ์ ํํด์ฃผ์ธ์.
์ํธ๋ฅผ ์ ํด์ฃผ์๋ฉด
์๋์ ๊ฐ์ด p12 ํ์ผ์ด ์ ์ฅ๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
Terminal
์ด์ ํฐ๋ฏธ๋๋ก ์ด๋ํด์ค๋๋ค.
p12ํ์ผ์ด ์ ์ฅ๋์ด ์๋๊ณณ์ผ๋ก ์ด๋ํด์ฃผ์ธ์ cd ๊ฒฝ๋ก
๊ทธ๋ฆฌ๊ณค ์๋์ ๊ฐ์ด p12ํ์ผ์ ์ด๋ฆ๊ณผ ๋ณํํด์ค pemํ์ผ์ ์ด๋ฆ์ ์ ์ด์ฃผ๊ณ ์์์ ์ค์ ํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ด์ฃผ์ธ์.
openssl pkcs12 -in ์ธ์ฆ์์ด๋ฆ.p12 -out ์ธ์ฆ์์ด๋ฆ.pem
pemํ์ผ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ํด์ค๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋์ ๊ฐ์ด pemํ์ผ์ด ์๊ธด๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
Xcode
xcode๋ก ์์ target์์ Signing & Capabitities ์์ Push Notifications๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋์์ Remote notifications๋ ์ฒดํฌํด์ฃผ์ธ์!
ViewController
์๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ด์ฃผ์ธ์!
import UIKit
import CallKit
import PushKit
class ViewController: UIViewController, CXProviderDelegate, PKPushRegistryDelegate {
override func viewDidLoad() {
let registry = PKPushRegistry(queue: nil)
registry.delegate = self
registry.desiredPushTypes = [PKPushType.voIP]
}
func providerDidReset(_ provider: CXProvider) {
}
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
action.fulfill()
}
func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
action.fulfill()
}
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
print(pushCredentials.token.map { String(format: "%02.2hhx", $0) }.joined())
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
let config = CXProviderConfiguration()
config.includesCallsInRecents = false
config.supportsVideo = true;
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: "Fomagran")
update.hasVideo = true
provider.reportNewIncomingCall(with: UUID(), update: update, completion: { error in })
}
}
์ด๋ ๊ฒ ์คํ์ํค๊ณ ์ ํ๋ฅผ ๋ฐ๊ฒ ๋๋ฉด ํ์ฌ ๋๋ฐ์ด์ค์ ํ ํฐ๊ฐ์ ์ ์ ์์ต๋๋ค.
Terminal
ํฐ๋ฏธ๋๋ก ์ด๋ํ์ ์ ํจํ์ผ์ด ์๋ ๊ฒฝ๋ก๋ก ์ด๋ํ์ ๋ค
์๋์ ๊ฐ์ด pemํ์ผ๊ณผ pemํ์ผ์ ๋น๋ฐ๋ฒํธ ๊ทธ๋ฆฌ๊ณ ๋๋ฐ์ด์ค ํ ํฐ๊ฐ์ ๋ฃ์ด์ค๋ค enter๋ฅผ ์น๋ฉด
curl -v -d '{"aps":{"alert":"ํ์ด"}}' --http2 --cert ์ธ์ฆ์์ด๋ฆ.pem:๋น๋ฐ๋ฒํธ https://api.development.push.apple.com/3/device/๋๋ฐ์ด์คํ ํฐ๊ฐ
์ฑ์ด ์ผ์ ธ์์ง ์์๋ ๋๋ฐ์ด์ค ํ ํฐ๊ฐ์ ๊ฐ์ง ๋๋ฐ์ด์ค์ ์ ํ๊ฐ ๊ฐ๊ฒ ๋ฉ๋๋ค!
Reference
๋๊ธ