# MPM 설정

## 1. 상세 설정

iOS MPM 프레임워크에는 다양한 설정을 지원하고 있습니다.&#x20;

### 수집 주기 설정

IMQA MPM 프레임워크가 데이터를 저장하는 주기와 수집하는 주기에 대해서 초 단위로 설정할 수 있습니다.&#x20;

* **Objective-C 설정 방법**

{% code title="AppDelegate.m" %}

```objectivec
IMQAConfig* mpmConfig = [[IMQAConfig alloc] init:@"PROJECT_KEY"];
mpmConfig.dump_interval = 10; // 성능 데이터 덤프를 뜨는 주기 (sec)
mpmConfig.save_interval = 60; // 성능 데이터를 수집서버로 전송하는 주기 (sec)
```

{% endcode %}

* **Swift 설정 방법**

{% code title="AppDelegate.swift" %}

```swift
let mpmConfig = IMQAConfig("<PROJECT_KEY>")
mpmConfig.dump_interval = 10 // 성능 데이터 덤프를 뜨는 주기 (sec)
mpmConfig.save_interval = 60 // 성능 데이터를 수집서버로 전송하는 주기 (sec)
```

{% endcode %}

### 설치형 고객사 수집 서버 설정

{% hint style="warning" %}
설치형으로 진행 된 고객사에서는 반드시 이 부분 설정이 필요합니다.
{% endhint %}

IMQA MPM 프레임워크가 수집하는 데이터를 보내는 수집 서버를 별도로 설정하실 수 있습니다. 기본적으로는 SaaS 서비스를 이용하는 고객은 별도 설정이 필요하지 않습니다.&#x20;

* **Objective-C 설정 방법**

{% code title="AppDelegate.m" %}

```objectivec
NSString* imqaUrl = @"https://custom-url"; 
IMQAConfig* mpmConfig = [[IMQAConfig alloc] init:PROJECT_KEY]; 
mpmConfig.api_url = imqaUrl;
```

{% endcode %}

* **Swift 설정 방법**

{% code title="AppDelegate.swift" %}

```swift
let imqaUrl = "https://custom-url" 
let mpmConfig = IMQAConfig(PROJECT_KEY) 
mpmConfig.api_url = imqaUrl
```

{% endcode %}

### 네트워크 수집 설정&#x20;

IMQA MPM 프레임워크에서는 네트워크 수집에 대해서 수집 여부를 설정 할 수 있습니다. 또한, 특정 URL 에 대한 수집을 무시할 수 있는 기능을 제공하고 있어, 보안이 필요한 URL은 무시 할 수 있습니다.&#x20;

* **Objective-C 설정 방법**

{% code title="AppDelegate.m" %}

```objectivec
IMQAConfig* mpmConfig = [[IMQAConfig alloc] init:@"PROJECT_KEY"];
mpmConfig.useNetworkCollect = YES; // YES: 수집함, NO: 수집안함
mpmConfig.blacklistUrls = @[@"https://url1.com", @"http://url.com"]; // 특정 URL 무시 Array
```

{% endcode %}

* **Swift 설정 방법**

{% code title="AppDelegate.swift" %}

```swift
let mpmConfig = IMQAConfig("<PROJECT_KEY>")
mpmConfig.useNetworkCollect = true // true: 수집함 ,  false: 수집안함
mpmConfig.blacklistUrls = ["https://url1.com", "http://url.com"] // 특정 URL 무시 Array
```

{% endcode %}

### 수집 데이터 확인&#x20;

IMQA MPM 프레임워크에서 수집하고 있는 데이터가 궁금한 경우 자체 옵션을 통해서 데이터를 Console 로 확인 하실 수 있습니다.&#x20;

* **Objective-C 설정 방법**

{% code title="AppDelegate.m" %}

```objectivec
IMQAConfig* mpmConfig = [[IMQAConfig alloc] init:@"PROJECT_KEY"];
mpmConfig.downloadDumpData = YES;
```

{% endcode %}

* **Swift 설정 방법**

{% code title="AppDelegate.swift" %}

```swift
let mpmConfig = IMQAConfig("<PROJECT_KEY>")
mpmConfig.downloadDumpData = true
```

{% endcode %}

### Custom User ID 등록

성능 데이터 수집 시 특정 사용자를 식별하기 위한 ID 정보를 설정할 수 있습니다. 사용자 ID 정보를 설정한 후, MPM 행동분석 에서 사용자 ID 정보로 행동 흐름을 조회할 수 있습니다.

{% hint style="warning" %}
**Custom User ID 등록시,** 사용자 식별을 위해 사용자 로그인 후의 화면, 홈 화면 또는 스플래시 화면에 추가해 주세요.
{% endhint %}

{% hint style="info" %}
SDK 옵션 상, MethodName은 사용자ID, 사용자 이름, 사용자 이메일로 작성되었으나 사용 예시이며, 실제 개인을 특정할 수 있는 직접 식별 정보 (특정 이름, 주민등록번호, 이메일 주소, 기타 유사 데이터) 보다는 **2차 가공한 임의의 식별 정보**를 사용하시기를 권고 드립니다.\
\
예를 들어, 2차 가공한 식별자 (예: 2013133, A39233 등), 등급 정보 (예: VIP, Gold, Member), 유입 경로 (예: Google, N, K) 등으로 사용자의 유형 분류에 따른 분석이 가능합니다.
{% endhint %}

<table><thead><tr><th width="282.4795378120725">Option Name</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>사용자 ID-1 (Primary)</td></tr><tr><td>name</td><td>사용자 ID-2</td></tr><tr><td>email</td><td>사용자 ID-3</td></tr></tbody></table>

* **Swift 설정 방법 (MPM/Crash 설정)**

```javascript
// Crash 설정
let crashConfig = IMQACrashConfiguration(PROJECT_KEY!)
crashConfig.setUser(userId, withEmail: userEmail, andName: userName)

// MPM 설정
IMQAMpm.sharedInstance.saveUserProfile(id: userId, name: userName, email: userEmail)
```

SDK에서 사전 정의한 사용자의 ID 정보가 수집되었을 경우, MPM 행동분석 및 Crash 사용자별 에러 목록에서 사용자 ID 정보로 데이터 조회가 가능합니다.

<figure><img src="https://3726060384-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzFyCopc6yAp3UcEYW6la%2Fuploads%2FHay9gmDOWPzUOQ44hXxW%2FScreenshot%202024-08-30%20at%209.21.41%E2%80%AFAM.png?alt=media&#x26;token=fe4b100c-64e1-4a0f-a67e-4f8aeb7cc5bf" alt=""><figcaption></figcaption></figure>

## 2. **MPM Webview Guide (**&#x57;KWebView)&#x20;

IMQA MPM 프레임워크는 WKWebView에 대해서 성능 정보도 수집하고 있습니다. UIWebView는 Apple사의 정책으로 인해 지원하고 있지 않은 점 참고 바랍니다.&#x20;

### **MPM** 단독 사용 (WebviewAgent 설치)&#x20;

{% hint style="info" %}
MPM 서비스만을 이용하며, 모바일 애플리케이션 구성에서의 웹뷰 성능 분석을 위한 webviewAgent 설치 방법입니다.

**MPM / WPM 통합 사용시 Agent 설치 방법**은 ‘[IMQA WPM/WCrash 설치 가이드 > 1.2. WPM / MPM 통합 사용 (WebAgent + WebviewAgent 설치)](https://docs.imqa.io/imqa-guide/web-wpm#id-1.2.-wpm-mpm-webagent--webviewagent)'를 참고하세요.
{% endhint %}

WKWebView 데이터 수집을 원한다면 웹 페이지에 IMQA WebView JavaScript라이브러리를 삽입해 주어야 합니다. 원하는 경우 파일을 다운로드 받아 웹 페이지에서 직접 경로를 추가하여 사용 할 수 있습니다. \
(크로스 오리진 문제 발생시 직접 import 해서 쓰시는걸 권장드립니다.)

**IMQA WebviewAgent**는 2가지 방식으로 설치 방법을 제공하고 있습니다. CDN 서버로 연결하거나, 설치형 혹은 CDN으로 요청을 못하시는 경우 해당 스크립트를 다운로드 받아서 사용 가능합니다. 아래의 링크를 통해서 마우스 오른쪽 버튼을 누른 후 “다른 이름으로 저장”을 눌러서 연결해 주세요.

**WebviewAgent** : <https://cdn.imqa.io/agent/webview-agent.js>

**CDN 서버에서 받아오기**

IMQA WebviewAgent는 스크립트를 html의 \<head> 내부 최상단에 삽입해 주셔야 합니다.

{% code title="webview-agent.js 연결 할 html <head>" overflow="wrap" %}

```html
// IMQA webview-agent.js 연결
<script src="https://cdn.imqa.io/agent/webview-agent.js"></script>

// IMQA webview-agent 스크립트 필수 값
<script>
    ((w, c, _wv, _w, _wk, _mh, _b) => { 
       w[c] = w[c] || {};                                           
       w[_wv](w); // 웹뷰 에이전트 실행함수
    })(window, 'imqaClientConfig', 'IMQAWebviewMain', 'IMQAWebMain', 'webkit', 'messageHandlers', 'ImqaBridge')
</script>
```

{% endcode %}

**로컬에 설치하기**

설치형 혹은 CDN으로 요청을 못하시는 경우 해당 스크립트를 다운로드 받아서 사용 가능합니다. [이 링크](https://cdn.imqa.io/agent/webview-agent.js)를 통해서 마우스 오른쪽 버튼을 누른 후 “다른 이름으로 저장”을 눌러서 연결해 주세요.

<pre class="language-html" data-title="webview-agent.js 연결 할 html <head>" data-overflow="wrap"><code class="lang-html">// 로컬에 받은 IMQA webview-agent.js 연결
&#x3C;script src="사용자 경로/webview-agent.js">&#x3C;/script>

// IMQA webview-agent 스크립트 필수 값
&#x3C;script>
    ((w, c, _wv, _w, _wk, _mh, _b) => {    
<strong>       w[c] = w[c] || {};                     
</strong>       w[_wv](w); // 웹뷰 에이전트 실행함수
    })(window, 'imqaClientConfig', 'IMQAWebviewMain', 'IMQAWebMain', 'webkit', 'messageHandlers', 'ImqaBridge')
&#x3C;/script>
</code></pre>

#### **iOS Agent 설정**

성능 수집이 필요한 WebView에 아래와 같은 설정이 필요합니다. 또한 WebView 에서 발생한 에러 정보를 수집할 수 있습니다.&#x20;

{% hint style="info" %}

* Webview Crash 수집을 위해서는 ImqaBridgeCrash 를 추가해 주어야 합니다.
  {% endhint %}

* **Objective-C 설정 방법**

{% code title="ViewController.m " %}

```objectivec
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
   // IMQA 설정 부분
   if([message.name isEqual: @"ImqaBridge"]) {
        [[IMQAMpm sharedInstance] saveWebviewPostMessage:self :message.body];
   }
   // 추가 설정 코드 (Webview Agent (1.1.2버전 이상) WebView Crash 수집)
   if(message.name == "ImqaBridgeCrash") {
    IMQACrash.notifyWebCrash("\(message.body)")
   }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL* url = [[NSURL alloc] initWithString:@""];
    NSURLRequest* reqeust = [[NSURLRequest alloc] initWithURL:url];
    [_webView loadRequest:request];
    [_webView.configuration.userContentController addScriptMessageHandler:self           name:@"ImqaBridge"];
}
```

{% endcode %}

* **Swift 설정 방법**

{% code title="ViewController.swift" %}

```swift
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    // IMQA 설정 부분
    if(message.name == "ImqaBridge") {
        IMQAMpm.sharedInstance.saveWebviewPostMessage(self,"\(message.body)")
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    let request = URLRequest(url: URL(string: url)!) webView.load(request)

    // IMQA 설정 부분
    webView.configuration.userContentController.add(self, name: "ImqaBridge")
}
```

{% endcode %}

### SPA 전용 옵션 <a href="#mpm-webviewagent-spa" id="mpm-webviewagent-spa"></a>

SPA에서는 하나의 index.html을 기준으로 수집되기에 page 변경에 대한 이벤트가 없습니다. SPA 전용 옵션을 설정하여 path가 변경되었을 때 기준으로 일정 시간까지를 수집하실 수 있습니다. SPA에서는 path 변경 시 특정 DOM이 교체되므로, 이 특정 DOM을 Agent 옵션에 타겟으로 설정하면 정상적으로 SPA에서도 페이지 로딩시간을 수집할 수 있습니다.&#x20;

<table><thead><tr><th width="158" align="center">Option Name</th><th width="111" align="center">Type</th><th width="142" align="center">Default Value</th><th>Description</th></tr></thead><tbody><tr><td align="center">SPACollectInitTime</td><td align="center">number</td><td align="center">3000</td><td><p>- 기본값: 3000 (3초)<br>- SPA 성능 데이터 수집 간격을 ms(밀리초) 단위로 설정합니다.</p><p>- path가 변경되면 설정된 수집 시간 동안 데이터를 수집합니다.</p></td></tr><tr><td align="center">SPARootDom</td><td align="center">string</td><td align="center">“#app”</td><td><p>- CSS 셀렉터 스타일로 타겟이되는 DOM을 설정합니다.</p><p>- 타겟이된 DOM 기준으로 DOM 변경을 감지합니다.</p><p>(ID :  #app, Class : .app)</p><p>- 중복되는 셀렉터를 타겟으로 설정하면 정상적으로 수집이 되지 않습니다.</p></td></tr></tbody></table>

필수 설정과 SPA 전용 옵션을 적용한 스크립트는 아래와 같습니다.

{% code title="webview-agent.js 연결 할 html <head>" overflow="wrap" %}

```html
// IMQA webview-agent.js 연결
<script src="https://cdn.imqa.io/agent/webview-agent.js"></script>

// IMQA webview-agent 스크립트 필수 값
<script>
    ((w, c, _wv, _w, _wk, _mh, _b) => {
        w[c] = w[c] || {};
    function imqaConf(key, value){w[c][key]=value};

    // SPA 전용 옵션 설정
    imqaConf("SPACollectInitTime", 5000); // SPA 수집시간설정
    imqaConf("SPARootDom", "#container"); // SPA ROOT DOM            
                                                    
       w[_wv](w); // 웹뷰 에이전트 실행함수
    })(window, 'imqaClientConfig', 'IMQAWebviewMain', 'IMQAWebMain', 'webkit', 'messageHandlers', 'ImqaBridge')
</script>
```

{% endcode %}

### WebviewAgent Console.log 표시 옵션 <a href="#mpm-webviewagent-consolelog" id="mpm-webviewagent-consolelog"></a>

IMQA WebviewAgent의 콘솔 로그를 표시하거나 끌 수 있습니다.

<table><thead><tr><th width="158" align="center">Option Name</th><th width="111" align="center">Type</th><th width="142" align="center">Default Value</th><th>Description</th></tr></thead><tbody><tr><td align="center">imqa_log</td><td align="center">boolean</td><td align="center">true</td><td><p>- true: IMQA Agent의 콘솔 로그를 표시합니다.</p><p>- false: IMQA Agent의 콘솔 로그를 표시하지 않습니다.</p></td></tr></tbody></table>

필수 설정과 console.log 표시 옵션을 적용한 스크립트는 아래와 같습니다.

{% code title="webview-agent.js 연결 할 html <head>" overflow="wrap" %}

```html
// IMQA webview-agent.js 연결
<script src="https://cdn.imqa.io/agent/webview-agent.js"></script>

// IMQA webview-agent 스크립트 필수 값
<script>
    ((w, c, _wv, _w, _wk, _mh, _b) => {
        w[c] = w[c] || {};
    function imqaConf(key, value){w[c][key]=value};

    // console.log 표시 옵션 설정
    imqaConf("imqa_log", false); // IMQA Agent 콘솔 로그 끔
                                                          
       w[_wv](w); // 웹뷰 에이전트 실행함수
    })(window, 'imqaClientConfig', 'IMQAWebviewMain', 'IMQAWebMain', 'webkit', 'messageHandlers', 'ImqaBridge')
</script>
```

{% endcode %}

{% hint style="info" %}
그 외 WebviewAgent Custom Web Crash 발생, 특정 웹 크래시 수집 제한 옵션을 설정할 수 있습니다.\
'[iOS > Crash 설정 > Custom Web Crash 발생](https://docs.imqa.io/imqa-guide/installation/ios/crash-sdk-setting#id-3.-custom-web-crash)' 및 '[iOS > Crash 설정 > 특정 웹 크래시 수집 제한 옵션](https://docs.imqa.io/imqa-guide/installation/ios/crash-sdk-setting#filtererror)'을 참고하세요.
{% endhint %}

## 3. 네트워크 수집 (NSURLSession 또는 URLSession 을 사용하는 경우)

NSURLSession 또는 URLSession을 이용하여 네트워크를 통신하는 경우에 일부 상황에서 네트워크 수집을 위해 설정이 필요합니다.

* **Objective-C 설정 방법**

```swift
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; // or default
configuration.protocolClasses = [[IMQAMpm sharedInstance] imqaURLSessionProtocol];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
```

* **Swift 설정 방법**

```objectivec
let configuration = URLSessionConfiguration.ephemeral // or default
configuration.protocolClasses = IMQAMpm.sharedInstance.imqaURLSessionProtocol()
let session = URLSession.init(configuration: configuration)
```

## 4. dSYM 설정

iOS의 Symbolication(기호화) 적용이 된 앱의 경우, dSYM 설정을 통해 클래스 명과 함수 명을 확인할 수 있습니다.&#x20;

<figure><img src="https://lh5.googleusercontent.com/rkImE72Kx6O3Pz7OF9scghMIPhh0wpxb-gVsm1py8Dten1WDU0p3fGEh8njQJyU9XiwmPGHUrFL_zwdJhAulu3mcuvu5POXOP-FPy8l_ArPigb_x-8grKBP7tjvf09Zr2xiQ5gNBdLRztqG_RztCzpg" alt=""><figcaption></figcaption></figure>

❶ **매핑 파일 업로드**\
1\. \[파일 선택]을 클릭하여 ‘dSYM’ 패키지 안의 바이너리 파일을 선택합니다.

{% hint style="info" %}
‘\*.dSYM’ 파일 \[패키지 내용 보기] → ‘Contents > Resources > DWARF > (바이너리 파일)’ 경로 예시\
![](https://lh6.googleusercontent.com/EzVtMu5r0oL7cdBmYQJ5uoZzlKbkPQTTYWVLZkLNRK4w7uZma9OvcD68W2J1vVZDMgJS1YF7vo1QgO31hKGZM4BZsBKHukQve16xO1qnyaIh5pYrd75dgzoch8zzpc0oFjiUoY7gLiQ7IBUntBTCY3Q)
{% endhint %}

2\. 적용할 앱 버전을 입력하고 \[등록]을 클릭합니다. \
3\. 데이터의 클래스 명과 함수 명을 IMQA에서 확인할 수 있습니다.

❷ **등록된 매핑 파일**\
등록된 매핑 파일과 적용된 앱 버전, 업로드 시간을 확인할 수 있습니다.

❸ **매핑 파일 관리**\
\[삭제] 아이콘을 클릭하면 해당 매핑 파일을 삭제합니다.

{% hint style="warning" %}
최신 앱 버전이 릴리즈 된 경우, 해당 버전에서 발생한 크래시 정보를 보기 위해서는 동일한 앱 버전의 매핑 파일을 추가 등록해 주세요.
{% endhint %}

<br>
