다음을 통해 공유


ASP.NET Core SignalR Swift 클라이언트

SignalR Swift는 Swift 애플리케이션에서 서버에 연결하기 SignalR 위한 클라이언트 라이브러리입니다. 이 문서에서는 클라이언트를 설치하고, 연결을 설정하고, 서버 간 호출을 처리하고, 서버 메서드를 호출하고, 스트리밍 응답을 사용하고, 자동 다시 연결 및 기타 옵션을 구성하는 방법에 대한 개요를 제공합니다.

SignalR 클라이언트 패키지를 설치합니다.

SignalR Swift 클라이언트 라이브러리는 Swift 패키지로 제공됩니다. Swift 패키지 관리자를 사용하여 프로젝트에 추가할 수 있습니다.

요구 사항

  • Swift >= 5.10
  • macOS >= 11.0
  • iOS >= 14

Swift 패키지 관리자를 사용하여 설치

SignalR Swift 패키지를 파일에 종속성으로 추가합니다Package.swift.

// swift-tools-version: 5.10
import PackageDescription

let package = Package(
    name: "signalr-client-app",
    dependencies: [
        .package(url: "https://github.com/dotnet/signalr-client-swift", branch: "main")
    ],
    targets: [
        .executableTarget(name: "YourTargetName", dependencies: [.product(name: "SignalRClient", package: "signalr-client-swift")])
    ]
)

종속성을 추가한 후 Swift 코드에서 라이브러리를 가져옵니다.

import SignalRClient

허브에 연결

연결을 설정하려면 HubConnectionBuilder을 생성하고, SignalR 메서드를 사용하여 withUrl() 서버의 URL로 설정하십시오. 연결이 빌드되면 다음을 호출 start() 하여 서버에 연결합니다.

import SignalRClient

let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server")
    .build()

try await connection.start()

허브에서 클라이언트 메서드 호출

서버에서 메시지를 받으려면 메서드를 사용하여 처리기를 등록합니다 on . 이 메서드는 on 허브 메서드의 이름과 서버가 해당 메서드를 호출할 때 실행될 닫기를 사용합니다.

다음에서 메서드 이름은 .입니다 ReceiveMessage. 인수 이름은 usermessage입니다.

await connection.on("ReceiveMessage") { (user: String, message: String) in
    print("\(user) says: \(message)")
}

connection.on의 이전 코드는 서버 쪽 코드가 SendAsync 메서드를 사용하여 호출할 때 실행됩니다.

using Microsoft.AspNetCore.SignalR;
namespace SignalRChat.Hubs;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

SignalR은 SendAsyncconnection.on에 정의된 메서드 이름과 인수를 일치시켜 호출할 클라이언트 메서드를 결정합니다.

후에 try await connection.start()에서 HubConnection 메서드를 호출하는 것이 on입니다. 이렇게 하면 메시지를 받기 전에 처리기가 등록됩니다.

클라이언트에서 허브 메서드 호출

Swift 클라이언트는 HubConnection의 invoke 메서드 또는 send 메서드를 사용하여 서버에서 허브 메서드를 호출할 수 있습니다. 메서드는 invoke 서버의 응답을 대기하고 호출이 실패하면 오류를 throw하지만 send 메서드는 응답을 기다리지 않습니다.

다음 코드에서 허브의 메서드 이름은 .입니다 SendMessage. invoke에 전달된 두 번째 및 세 번째 인수는 허브 메서드의 usermessage 인수에 매핑됩니다.

// Using invoke, which waits for a response
try await connection.invoke(method: "SendMessage", arguments: "myUser", "Hello")

// Using send, which does not wait for a response
try await connection.send(method: "SendMessage", arguments: "myUser", "Hello")

서버의 메서드가 반환될 때, invoke 메서드는 반환 값(있는 경우)과 함께 반환됩니다. 서버의 메서드가 "오류"를 발생시키면, 함수도 "오류"를 발생시킵니다.

로깅 (로그 기록)

Swift 클라이언트 라이브러리에는 Swift 애플리케이션용으로 설계된 경량 로깅 시스템이 포함되어 있습니다. 사용자 지정 가능한 로그 처리기를 사용하여 다양한 심각도 수준에서 메시지를 기록할 수 있는 구조화된 방법을 제공합니다. Apple 플랫폼에서는 효율적인 시스템 로깅을 활용 os.Logger 하지만 다른 플랫폼에서는 표준 콘솔 출력으로 돌아갑니다.

로그 수준

로그 수준을 설정하는 데 사용합니다 HubConnectionBuilder().withLogLevel(LogLevel:) . 메시지는 지정된 로그 수준 이상으로 기록됩니다.

  • LogLevel.debug: 디버깅에 유용한 자세한 정보입니다.
  • LogLevel.information: 일반 애플리케이션 메시지입니다.
  • LogLevel.warning: 잠재적인 문제에 대한 경고입니다.
  • LogLevel.error: 즉각적인 주의가 필요한 오류입니다.

클라이언트 결과

서버 메서드를 호출하는 것 외에도 서버는 클라이언트에서 메서드를 호출하고 응답을 기다릴 수 있습니다. 이를 지원하려면 닫기에서 결과를 반환하는 클라이언트 처리기를 정의합니다.

await connection.on("ClientResult") { (message: String) in
    return "client response"
}

예를 들어 서버는 클라이언트에서 메서드를 ClientResult 호출하고 반환된 값을 기다릴 수 있습니다.

public class ChatHub : Hub
{
    public async Task TriggerClientResult()
    {
        var message = await Clients.Client(connectionId).InvokeAsync<string>("ClientResult");
    }
}

스트리밍 응답 처리

서버에서 데이터 스트림을 받으려면 이 메서드를 stream 사용합니다. 메서드는 비동기적으로 반복할 수 있는 스트림을 반환합니다.

let streamResult: any StreamResult<String> = try await connection.stream(method: "StreamMethod")
for try await item in streamResult.stream {
    print("Received item: \(item)")
}

연결 끊기 처리

자동 다시 연결

Swift 클라이언트는 SignalR 자동 다시 연결이 지원됩니다. 사용하도록 설정하려면 연결을 빌드하는 동안AutomaticReconnect()를 호출합니다. 자동 다시 연결은 기본적으로 사용하지 않도록 설정됩니다.

let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server")
    .withAutomaticReconnect()
    .build()

매개 변수가 없으면 withAutomaticReconnect()는 각 다시 연결 시도 전에 각각 0, 2, 10 및 30초를 기다리도록 클라이언트를 구성합니다. 네 번의 시도가 실패한 후 클라이언트는 다시 연결 시도를 중지합니다.

HubConnection 연결 시도를 시작하기 전에 Reconnecting 상태로 전환되고 onReconnecting 콜백이 실행됩니다.

연결이 성공적이면 HubConnectionconnected 상태로 전환되고 onReconnected 콜백이 실행됩니다.

일반적인 사용 방법은 onReconnectingonReconnected 연결 상태 변경 내용을 표시하는 것입니다.

connection.onReconnecting { error in
    // connection is disconnected because of error
}

connection.onReconnected {
    // connection is connected back
}

자동 다시 연결에서 전략 구성

다시 연결 동작을 사용자 지정하려면 각 다시 연결 시도 전에 지연 시간을 초 단위로 나타내는 숫자 배열을 전달할 수 있습니다. 보다 세부적인 제어를 위해 RetryPolicy 프로토콜을 준수하는 개체를 전달합니다.

지연 값 배열 사용

let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server")
    .withAutomaticReconnect([0, 0, 1]) // Wait 0, 0, and 1 second before each reconnect attempt; stop after 3 attempts.
    .build()

사용자 지정 재시도 정책 사용

RetryPolicy 프로토콜을 구현하여 다시 연결 타이밍을 제어합니다.

// Define a custom retry policy
struct CustomRetryPolicy: RetryPolicy {
    func nextRetryInterval(retryContext: RetryContext) -> TimeInterval? {
        // For example, retry every 1 second indefinitely.
        return 1
    }
}

let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server")
    .withAutomaticReconnect(CustomRetryPolicy())
    .build()

시간 제한 및 연결 유지 옵션 구성

HubConnectionBuilder를 통해 클라이언트의 시간 제한 및 연결 유지 설정을 사용자 지정할 수 있습니다.

옵션 기본값 설명
with적활성간격 15(초) 클라이언트가 ping 메시지를 보낼 때의 설정된 간격을 결정하며, 이는 HubConnectionBuilder에서 직접 설정됩니다. 이 설정을 사용하면 클라이언트가 네트워크에서 컴퓨터를 분리하는 경우 등 서버에서 하드 연결 끊기를 감지할 수 있습니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 ClientTimeoutInterval 집합에서 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다.
withServerTimeout 30(초) 서버 연결이 끊긴 것으로 간주하기 전에 클라이언트가 서버의 응답을 기다리는 간격을 결정합니다. 이 설정은 HubConnectionBuilder에서 직접 설정됩니다.

전송 구성

Swift 클라이언트는 SignalR LongPolling, ServerSentEvents 및 WebSocket의 세 가지 전송을 지원합니다. 기본적으로 클라이언트는 서버에서 지원하는 경우 WebSocket을 사용하고, 그렇지 않으면 ServerSentEvents 및 LongPolling으로 대체합니다. 연결을 빌드하는 동안 호출 withUrl(url:transport:) 하여 특정 전송을 사용하도록 클라이언트를 구성할 수 있습니다.

let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server", transport: .webSockets) // use websocket only
    .build()
let connection = HubConnectionBuilder()
    .withUrl(url: "https://your-signalr-server", transport: [.webSockets, .serverSentEvents]) // use websockets and server sent events
    .build()

추가 리소스