'client'에 해당되는 글 2건

  1. 2019.05.01 javascript 웹소켓 클라이언트
  2. 2019.04.13 Push Notification (iOS, client)

HTML5와 웹소켓이 나오기 전까지, 홈페이지는 그저 요청에 대한 서버 결과를 돌려 주는 형태로만 제작이 가능했습니다. 물론 여러가지 방법을 통해, 비슷한 형태로 제작이 가능했지만, 근본적인 대책은 아니였습니다. TCP/IP 통신을 하지 못해, 챗팅 게임등의 서버로 사용하기 힘들었지만, 웹소켓이 나온 이후로는 매우 편리해 졌습니다.

거기다, 쉬운 방식으로 구현히 가능해, 적어도 한 시간 이내에 기능을 구현하는 것이 가능합니다. 제가 TCP, UDP통신을 모두 구현해 보았지만, 웹소켓만큼 구현히 쉽지는 않았습니다.

이 문서에는 javascript를 통한, 클라이언트를 구현해 보도록 하겠습니다. websocket.org 라는 사이트에서 웹소켓 에코 서버를 지원해 주므로, 클라이언트 부터 만들고, 이 클라이언트를 바탕으로 서버를 만들면 서버 또한 깔금하게 만들수 있습니다.

 

[공식문서]

공식 사이트 : websocket org : https://www.websocket.org .

 

 

1. 샘플 보기 및 샘플 테스트.

공식 사이트에 가면, 샘플에 대한 구현 방법과 에코서버를 어떻게 테스트 하는지 잘 설명하고 있습니다.

먼저, 공식 사이트로 이동합니다. ( 링크 ) 그럼, 아래와 같이 페이지가 나오는데 화면 중앙의 GET STARTED 버튼을 눌러 주도록 합니다.

그럼 에코 테스트 페이지가 나옵니다. 화면 중앙의 녹색 This browser supports WebSocket 이라는 문구는, 여러분이 사용하는 브라우저가 웹소켓을 지원하고 있음을 알려주고 있습니다. 요즘은 거의 모든 브라우저가 웹소켓을 지원하지만, 얼마전까지만 해도 그렇지 않았습니다.

원할한 서비스를 위해 여러분도 여려분의 홈페이지에 방문자의 브라우저가 웹소켓을 지원하는지 여부를 알려줄 필요가 있을 지 모릅니다. (구현은 간단합니다.) location: 부분에 입력된 값은 테스트를 위한 에코서버의 주소 입니다. 일단 그대로 두고, 컨넥트 버튼을 눌러 보도록 하겠습니다.

그럼 에코 서버와 연결이 되어 Log에, CONNECTED라고 표시됩니다.

메시지 부분에 적당한 메시지를 입력하고, Send를 눌러 보도록 하겠습니다.

그럼 아래와 같이 보낸 메시지를 서버가 그대로 돌려 줍니다.

마지막으로 서버와의 접속을 끊어주는 Disconnect 를 눌러 주도록 합니다.

그럼 아래와 같이 DISCONNECTED 라는 로그가 남기며 접속이 종료됩니다.

간단한 기능이지만, 챗팅 및 게임을 구현하기에 충분한 역할을 하고 있는 것을 확인할 수 있습니다. 하지만, 이렇게 구현하는데, 코드 몇 줄으면 끝이난다는 것이 더 매력적입니다.

 

 

 

2. 소스 보기.

위의 페이지에서 아래로 스크로를 해 보면, 위 코드에 대해서 간단히 구현해 놓은 코드를 제공합니다.

워낙 소스가 잘되어 있어서, 따로 무언가를 할 필요가 없어서, 공식예제에 주석만 달아 아래에 소스를 공개합니다.

  <!DOCTYPE html>
  <meta charset="utf-8" />
  <title>WebSocket Test</title>
  <script language="javascript" type="text/javascript">

  var wsUri = "wss://echo.websocket.org/";
  var output;

  // DOM 이 형성되었을 때 가장 먼저 호출되는 메소드 입니다.
  function init()
  {
    output = document.getElementById("output");
    testWebSocket();
  }

  // 서버와의 접속을 시작하는 메소드 입니다.
  function testWebSocket()
  {
  
    // 지정한 주소로 웹소켓 연결을 시도하는 코드 입니다.
    websocket = new WebSocket(wsUri);
    
    // 웹소켓의 각 이벤트에 대한 처리 메소드들을 연결한 코드들 입니다.
    // 위의 호출 이후 이벤트를 연결해도 문제가 없는 이유는 위의 웹소켓은 콜백 처리를 하게되는데,
    // 콜백으로 호출되는 메소드들은 무조건 다음 프레임에 처리됩니다. 그래서 뒤에 호출해도 됩니다.
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
    
    
  }

  // 서버와 접속이 완료되었을 때 호출되는 메소드 입니다.
  function onOpen(evt)
  {
    writeToScreen("CONNECTED");
    doSend("WebSocket rocks");
  }

  // 어떤 이유로든 서버와의 접속이 종료되었을 때, 호출되는 메소드 입니다.
  function onClose(evt)
  {
    writeToScreen("DISCONNECTED");
  }

  // 메시지를 받았을 때, 처리하는 메소드 입니다.
  function onMessage(evt)
  {
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
    websocket.close();
  }

  // 에러가 발생했을 때, 처리 메소드 입니다.
  function onError(evt)
  {
    writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
  }

  // 서버로 메시지를 보냅니다.
  function doSend(message)
  {
    writeToScreen("SENT: " + message);
    websocket.send(message);
  }

  // 로그에 메시지를 남겨 줍니다.
  function writeToScreen(message)
  {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    output.appendChild(pre);
  }

  // 브라우저의, DOM 구성이 완료되면, 가장 먼저 실행할 메소드를 지정하는 메소드 입니다.
  // (즉, 가장 먼저 실행될 메소드 지정).
  window.addEventListener("load", init, false);

  </script>

  <h2>WebSocket Test</h2>

  <div id="output"></div>

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

Push Notification (일명 : 푸쉬)는 서버에서 사용자에게 일방적으로 메시지를 보내는 기능 입니다. 주로, 운영자가 특정 소식을 전할 때 사용됩니다. 사인할 프로비저닝 파일이 필요하며, App id에는 Push를 사용할 것으로 설정이되어 있어야 합니다. (앱 아이디 수정도 가능합니다.)

 

선행작업.

프로비저닝 프로파일 만들기 (푸쉬 인증서 설명도 같이 있음) : https://nicgoon.tistory.com/202 (숙지하셔야 합니다.)

 

공식문서

유저 노티피케이션 : https://developer.apple.com/documentation/usernotifications ( 이 문서에 스텝이 있습니다.).
푸쉬 킷 : https://developer.apple.com/documentation/pushkit ( 함께 사용되지만, 참고만 있습니다. )

 

참고 문서

예제1: https://faith-developer.tistory.com/153 (끝부분만 보시면됩니다.).
예제2: http://monibu1548.github.io/2018/05/29/push-cert/ ( 역시 끝 부부만 보시면됩니다.)

 

1. 준비.

Xcode 프로젝트를 생성합니다. 위의 [프로비저닝 프로파일 만들기], 를 참고해, 프로젝트를 듭니다. 저는 [com.tistory.yeslife.hello] 라는 번들 아이디로 프로젝트를 만들었습니다. 이 페이지에서 참고한 기준 문서는 유저 노티피케이션 입니다. 아래 Topics 부분을 보면, 순서로 나열된 것이 있습니다.

 

2. 프레임 워크 추가.

프로젝트 > Build Phases 탭을 차례로 선택하고, Link Binary With Libraries를 확장 시킵니다.

+ 버튼을 눌러, UserNotifications.framework 와 PushKit.framework를 추가해 줍니다.

 

3. Capabilities 탭을 선택해 푸쉬를 활성화 해 줍니다.

프로젝트 > Capabilities 탭을 차례로 선택해 줍니다. 그리고, 페이지를 스크롤해 Push Notifications를 활성화 해 줍니다. (Provisioning Profile이 서정되어 있지 않다면, 활성화 할 수 없습니다.).

 

4. 사용자에게 알림을 사용할 것인지 묻기.

UserNotifications 문서 토픽에 보면, 첫 스텝으로 Asking Permission to Use Notifications 문서 ( 링크 ) 가 있습니다. 그 문서를 참고해 사용할 것인지 묻는 코드를 작성하였습니다.

 

1) 앱 델리 게이트 부분에 사용자 물음 추가. (Application 메소드 속에 넣으면 좋습니다.).

// 유저 노티피 케이션 센터를 가지고 옵니다.
let center = UNUserNotificationCenter.current()

// 사용 여부를 묻습니다.
center.requestAuthorization(options: [.alert, .sound])
{ (granted, error) in

    // 승인 받았는지 여부를 여기서 확인할 수 있습니다.
    guard granted else {
        print( "유저가 푸쉬 알림을 허락하지 않았습니다." )
        return
    }

    print( "유저가 푸쉬 알림을 허락하였습니다." )

}

 

5. 장치를 푸쉬 서버에 등록.

유저가 푸쉬를 허락한 경우, 장치를 APNs에 등록하고, 등록된 키 값을 받아 오는 부분 입니다. 공식 문서는 Registering Your App with APNs 부분을 확인하시면 되겠습니다. 

1) 위에서 푸쉬 알림 허락한 부분에 등록을 요청하는 코드를 등록 합니다.

주의 할 점은, 응답이 왔을 때 메인 쓰레드 (UI)와 동기화 처리가 필요하므로, DispatchQueue.main.async 메소드 속에서 호출해야 합니다.

위에서 작성했던 코드가 아래와 같이 됩니다.

let notificationCenter = UNUserNotificationCenter.current()
        
        notificationCenter.getNotificationSettings
        { (settings) in
            
            // Do not schedule notifications if not authorized.
            let center = UNUserNotificationCenter.current()
            
            // Request permission to display alerts and play sounds.
            center.requestAuthorization(options: [.alert, .sound])
            { (granted, error) in
                
                
                // 유저가 푸쉬를 사용하지 않겠다고 한 경우, 여기서 처리합니다.
                guard granted else {
                    print("유저가 푸쉬 알림을 승인하지 않았습니다.")
                    return
                }
                
                
                // 푸쉬를 처리한 경우, 여기서 처리 합니다.
                print("유저가 푸쉬를 승인하였습니다.")
                
                
                // 메인 쓰레드 UI와 Thread 동기화 처리 될 수 있도록, DispatchQueue.main.async 메소드로 감싸 줍니다.
                DispatchQueue.main.async {
                    
                    // APNs 에 스마트폰을 등록하는 메소드 입니다. (네트워크)
                    UIApplication.shared.registerForRemoteNotifications()
                    
                }
                
                
            }
        }

 

2) APNs로 부터 응답처리.

2개의 메소드 모두 AppDelegate 클래스에 추가하도록 합니다.

// APNs 서버에 등록한 경우 표시.
func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken
    deviceToken: Data) {

    // 토큰 값을 가지고 옵니다.
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    // 콘솔에 토큰 값을 표시해 줍니다.
    print("APNs device token: \(deviceTokenString)")


}



// APNs 서버에 등록하지 못한 경우, 오류를 표시.
func application(_ application: UIApplication,
                 didFailToRegisterForRemoteNotificationsWithError
    error: Error) {

    // Try again later.


}

 

6 클라이언트 검증해 보기.

일단 클라이언트 부분의 푸쉬 부분은 끝났지만, 이게 잘 동작하는 지 확인할 필요가 있습니다. 서버까지 구축 후 푸쉬를 보내어 보았는데, 안되면, 과연 서버 문제인지, 클라이언트 문제인지 파악하기 힘들 수 있습니다. 그래서 다른 사람들이 구축해 놓은 서버 프로그램으로 푸쉬가 잘되는지 확인할 수 있습니다. 우리는 http://apns-gcm.bryantan.info 라는 사이트를 이용할 것 입니다.

당연한 이야기 일 수 있습니다만, 앱이 종료된 상태여야 푸쉬가 옵니다. 앱이 켜진 상태에서는 푸쉬를 보내도 푸쉬가 오지 않습니다.!!

그리고, 이 것을 테스트 하기 위해서는 푸쉬 인증서가 필요하며, 위의 인증서 설명 링크를 통해 인증서를 만들 도록 하시기 바랍니다.

먼저 pans-gcm ( http://apns-gcm.bryantan.info ) 에 접속 합니다. 아래와 같은 화면이 나오면, 각 값을 입력해 줍니다.

Device Token에는 기기를 APNs에 등록하고, 받아 왔던 토큰, Message는 보낼 메시지를 넣어주세요. Pem File은 인증서로 만들었던, 파일을 넣어주세요. Environment는 Sandbox를 선택해 줍니다. 그리고 Submit 버튼을 누르면, 메시지가 보내어 집니다.

 

원래 계획은 이곳에 서버 제작도 넣으려고 했으나, 따로 분리하는 것이 좋겠다 생각되어, 클라이언트 제작 내용만 남깁니다. 이 후 서버 제작 부분도 페이지를 만들도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'iOS' 카테고리의 다른 글

iOS Firebase Push 사용하기  (3) 2019.04.26
iOS in-app purchase  (7) 2019.04.14
애플 앱을 기기에서, 실행하기 위한 방법  (0) 2019.04.12
웹 뷰 추가 및 웹통신 (UIWebView 이용)  (1) 2019.04.05
Posted by 창업닉군
,