# SDKデリゲート

{% hint style="danger" %}
すべての SDK デリゲートをアプリケーションの `AppDelegate` クラス内に含めることを推奨します。これにより、すべてのイベントを適切に処理できます。
{% endhint %}

## SDK ライフサイクル デリゲート

これらのデリゲートを実装すると、SDK の読み込みと終了を監視できます。

このプロトコルを実装するクラスを SDK に通知する必要があります。これは、 `setSDKLifecycleDelegate` メソッドを SDK で使用して行えます:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.setSDKLifecycleDelegate(self)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDK setSDKLifecycleDelegate:self];
```

{% endtab %}
{% endtabs %}

以下の SDK ライフサイクル デリゲートが利用できます:

### 読み込み完了

このデリゲートは、SDK が初期化を完了し、操作可能になったときに呼び出されます。

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(didFinishLoading configuration: PNApplicationConfig, withNotificationSettings settings: UNNotificationSettings) {
    // SDK の読み込み完了後に実行するコードを追加
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (void)pushSDKDidFinishLoading:(PNApplicationConfig *)configuration withNotificationSettings:(UNNotificationSettings *)settings {
    // SDK の読み込み完了後に実行するコードを追加
}
```

{% endtab %}
{% endtabs %}

## 権限ライフサイクルデリゲート

これらのデリゲートを実装すると、ユーザーの権限承認の変更を監視できます。

このプロトコルを実装するクラスを SDK に通知する必要があります。これは、 `setPermissionLifecycleDelegate` メソッドを SDK で使用して行えます:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.setPermissionLifecycleDelegate(self)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDK setPermissionLifecycleDelegate:self];
```

{% endtab %}
{% endtabs %}

以下の権限ライフサイクル デリゲートが利用できます:

### 権限ステータスの変更

このデリゲートは、ユーザーの権限ステータス/承認が変更されたときに呼び出されます。

「 `status` 変数はユーザーの **新しい** 権限ステータスを [UNAuthorizationStatus](https://developer.apple.com/documentation/usernotifications/unauthorizationstatus) 列挙型を使用して表します。

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(didReceivePermissionStatusChange status: UNAuthorizationStatus, withSettings settings: UNNotificationSettings) {
    // ユーザーの通知権限が変更された後に実行するコードを追加
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (void)pushSDKDidReceivePermissionStatusChange:(UNAuthorizationStatus)status withSettings:(UNNotificationSettings *)settings {
    // ユーザーの通知権限が変更された後に実行するコードを追加
}

```

{% endtab %}
{% endtabs %}

## 通知ライフサイクル デリゲート

これらのデリゲートを実装すると、インプレッション、オープン、その他の通知とのインタラクションなどのイベントを監視できます。

このプロトコルを実装するクラスを SDK に通知する必要があります。これは、 `setNotificationLifecycleDelegate` メソッドを SDK で使用して行えます:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.setNotificationLifecycleDelegate(self)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDK setPermissionLifecycleDelegate:self];
```

{% endtab %}
{% endtabs %}

以下の通知ライフサイクル デリゲートが利用できます:

### 通知受信

このデリゲートは、ユーザーが通知を受信したときに呼び出されます

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(didReceiveNotification notification: PNNotification)
    // サブスクライバーのデバイスが通知を受信した後に実行するコードを追加
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (void)pushSDKDidReceiveNotification:(PNNotification *)notification {
    // サブスクライバーのデバイスが通知を受信した後に実行するコードを追加
}
```

{% endtab %}
{% endtabs %}

### URI/URL 宛先付きで通知が開かれた場合

このデリゲートは、ランディング URL が関連付けられた通知が開かれたときに呼び出されます。サブスクライバーは、その URL を表すビューへ移動する必要があります。

このメソッドは Boolean の応答を想定しています。応答が `true` の場合、この通知のオープンに対して SDK はナビゲーションを行いません。応答が `false` の場合、SDK は `open` メソッド内に追加します。

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(didReceiveNotificationDestination destination: String, withInteraction interaction: PNNotificationInteraction) -> Bool {
    // destination（ランディング URL）を使用して、アプリケーション内のビューへ移動
        
    // SDK に対して遷移しないよう通知するために true を返す
    return true
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (BOOL)pushSDKDidReceiveNotificationDestination:(NSString *)destination withInteraction:(PNNotificationInteraction *)interaction {
    // destination（ランディング URL）を使用して、アプリケーション内のビューへリダイレクト
    
    // SDK に対して、リダイレクトしないことを通知するには YES を返します
    return YES;
}
```

{% endtab %}
{% endtabs %}

次を参照してください。 [ディープリンク](https://documentation.pushly.com/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c/dpurinku) 完全な例についてはドキュメントを参照してください。

## アプリメッセージ ライフサイクル デリゲート

これらのデリゲートを実装すると、インプレッション、オープン、その他のアプリメッセージとのインタラクションなどのイベントを監視できます。

このプロトコルを実装するクラスを SDK に通知する必要があります。これは、 `setAppMessageLifecycleDelegate` メソッドを SDK で使用して行えます:

{% tabs %}
{% tab title="Swift" %}

```swift
PushSDK.setAppMessageLifecycleDelegate(self)
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
[PushSDK setAppMessageLifecycleDelegate:self];
```

{% endtab %}
{% endtabs %}

以下のアプリメッセージ ライフサイクル デリゲートが利用できます:

### アプリメッセージ表示時

このデリゲートは、アプリメッセージがユーザーに表示されたときに呼び出されます。

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(willPresentAppMessage appMessage: PNAppMessage) {
    // ユーザーのデバイスにアプリメッセージが表示されたときに実行するコードを追加
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (void)pushSDKWillPresentAppMessage:(PNAppMessage *)appMessage {
    // ユーザーのデバイスにアプリメッセージが表示されたときに実行するコードを追加
}
```

{% endtab %}
{% endtabs %}

### アプリメッセージでユーザーが操作したとき

このデリゲートは、ユーザーがアプリメッセージとやり取りしたときに呼び出されます。

このメソッドは Boolean の応答を想定しています。応答が `true` その場合、SDK はそのインタラクションを処理せず、Open URL アクションの場合もナビゲーションを試みません。応答が `false` の場合、SDK はそのインタラクションを処理し、インタラクションが Open URL アクションの場合は、 `open` メソッド内に追加します。

{% tabs %}
{% tab title="Swift" %}

```swift
func pushSDK(didReceiveAppMessageInteraction interaction: PNAppMessageInteraction, fromAppMessage appMessage: PNAppMessage) -> Bool {
    // ユーザーがアプリメッセージとやり取りしたときに実行するコードを追加
    
    // SDK がそのインタラクションを処理しないようにするには true を返します
    return true
}
```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec
- (BOOL)pushSDKDidReceiveAppMessageInteraction:(PNAppMessageInteraction *)interaction fromAppMessage:(PNAppMessage *)appMessage {
    // ユーザーがアプリメッセージとやり取りしたときに実行するコードを追加

    // SDK がそのインタラクションを処理しないようにするには YES を返します
    return YES;
}
```

{% endtab %}
{% endtabs %}
