Skip to content

yeonduing/Project01-A-User-Event-Collector

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Team DIVE introduction

iOS

S002 S015
강병민(mike123789-dev) 류연수(yeonduing)

Link to iOS Dev Logs

Web

J124 J153 J190
유선규(sunkest) 이유택(lcpnine) 조병건(marulloc)

Project introduction

프로젝트의 목적은 다양한 프로젝트에서 독립적으로 적용 가능한 User Event Collector 제작 입니다.

DIVE 의 동작을 보이기 위하여 NAVER 스트리밍 서비스 VIBE를 Clone하여 이벤트를 수집했습니다.

User Event Collector DIVE는 자유도 높게 설계되어 프로젝트 마다 복합적인 이벤트를 수집할 수 있으며,

수집한 데이터는 UI/UX 개선에 중요한 데이터가 될 것입니다.

Link to iOS DIVE ReadMe


Technology Stack

Technology Stack


Vibe Clone

Today / Playlist / Magazine

TodayFavoriteMagazine

Chart / Search / Library

ChartSearchLibrary

NowPlaying

NowPlaying

iOS Event Collector


구성요소

  1. Event
    • Event Collector에서 제공하는 모든 이벤트.
    • Event 프로토콜 채택
  2. EventManager
    • 이벤트를 로깅하기 위한 최상단 API, 실제로 로깅을하지는 않고,
    • EventEngine을 이용하여 보냄.
  3. EventEngine
    • 직접적으로 로깅 전송/저장을 담당.
    • EventSendable, EventFetchable 프로토콜 채택

Event

public protocol Event: Codable {
    var name: String { get }
    var createdAt: String? { get }
    var metadata: [String: String]? { get }
}

기본적으로 제공되는 이벤트

class BaseEvent: Event {
    var name: String
    var createdAt: String?
    var metadata: [String: String]?

    public init(name: String, createdAt: String?, metadata: [String: String]?) {
        self.name = name
        self.createdAt = createdAt
        self.metadata = metadata
    }
}

Event 프로토콜을 채택하는 Custom Event의 예시

struct ScreenEvent: Event {
    var name: String
    var metadata: [String: String]?

    private init(name: String, metadata: [String: String]? = nil) {
        self.name = name
        self.metadata = metadata
    }

    static let playerPushed = ScreenEvent(name: "playerPushed")

    static let playerPopped = ScreenEvent(name: "playerPopped")

}

Event Engine

public protocol EventSendable: class {
    func send<T: Event>(_ event: T)
}

public protocol EventFetchable: class {
    func fetch() -> [BaseEvent]
}
public protocol EventSendableAndFetchable: EventSendable, EventFetchable {
}

기본적으로 제공되는 Engine

public final class MockServerEngine: EventSendable {
    public init() {

    }
    public func send<T: Event>(_ event: T) {
        print("MockServer - \(event.name)")
        event.metadata?.forEach { key, value in
            print("\(key) : \(value)")
        }
    }
}

이벤트의 흐름

이벤트의 간편한 확장성

Event protocol로 구현함으로써, 새로운 이벤트를 추가하는것은 매우 간편해집니다.

New Model Version

이벤트 type checking

Event protocol을 채택하는 custom type의 이벤트를 구현함으로써, 원하는 이벤트에 대한 자동완성 결과를 볼수 있습니다.

엔진의 다양한 구현

EventSendable, EventFetchableprotocol을 채택하는 엔진을 다양하게 구현할수 있습니다. 그리고 상황에 맞게 필요한 엔진을 갈아 끼우는것도 매우 쉽습니다.

New Model Version

또한, EventManager는 다수의 엔진을 가질 수도 있습니다. 실제로 저희 앱에서는 back end server를 위한 engine과 core data를 위한 engine 두개를 구현하고 주입했습니다.

설치

어느 프로젝트에서도 사용 가능하도록 Swift package manager를 이용한 설치가 가능합니다.

  1. Xcode 메뉴에서 File > Swift Packages > Add Package Dependency를 선택후
  2. https://github.com/mike123789-dev/DiveEventCollector 를 입력합니다

iOS Dev Logs

iOS Dev Logs Author
노래 track list를 만들어보자! (part1: SwiftUI를 이용하여 Cell 디자인하기) 강병민
노래 track list를 만들어보자! (part2: List로 보여주기 및 ViewModel적용하기) 강병민
SwiftUI에서 View와 Model Binding (part1: @State와 @Binding) 강병민
SwiftUI에서 View와 Model Binding (part2: @StateObject, @ObservedObject, @Published) 강병민
SwiftUI에서 View와 Model Binding (part3: @EnvironmentObject) 강병민
Combine을 이용힌 chaining 강병민
Protocol 기반의 Analytics System을 만들어보자 강병민
SwiftUI) 사용자 이벤트 수집 및 Alert로 확인 류연수
서버로 post할 때 json 형식으로 보내기 류연수
코어데이터 마이그레이션 류연수
CoreData로 오프라인에서도 이용 가능한 앱 만들기 류연수
SwiftUI) NavigationLink와 Memory Leak 류연수
URL로 비동기 이미지 생성하기 - Combine과 Network 류연수
SwiftUI) ViewBuilder 와 guard let 류연수
SwiftUI) ObservableObject와 상속 류연수
SwiftUI) MVVM과 Combine 류연수
SwiftUI) 다이나믹 리스트 류연수


Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 64.8%
  • Swift 34.7%
  • Other 0.5%