# ディープリンク

PushSDK は、通知の開封を次の方法で処理します:

* デフォルトでは、SDK は自動的に新しい `ACTION_VIEW` インテントを、通知に添付されたランディング URL を使用して作成します。
* 次を実装する場合 `onPushSDKDidReceiveNotificationDestination` ライフサイクルコールバックを実装すると、通知が開かれたときに必要な任意のカスタムロジックを実行できます。

## URL 処理コールバックの実装

PushSDK は、購読者が通知を操作したときに呼び出されるコールバックを提供します。これらのコールバックは、通知を開いた後に購読者が適切なアクティビティへ自動的に遷移するよう実装する必要があります。

{% hint style="danger" %}
すべての SDK コールバックは、アプリケーションのメイン `onCreate` すべての通知イベントを適切に処理するための方法。
{% endhint %}

SDK が通知の開封イベントを受信すると、アプリ内の適切なアクティビティへ購読者を遷移させるために使用できるパラメータを伴って、以下のいずれかのコールバックを呼び出そうとします。&#x20;

これらのコールバックを実装するには、SDK の `registerNotificationLifecycleCallbacks` メソッドを使用し、その中でコールバックを実装できます。

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

```kotlin
PushSDK.registerNotificationLifecycleCallbacks(object : PNNotificationLifecycleCallbacks {
    // ここに関数のオーバーライドを追加
})
```

{% endtab %}

{% tab title="Java" %}

```java
PushSDK.registerNotificationLifecycleCallbacks(new PNNotificationLifecycleCallbacks() {
    // ここに関数のオーバーライドを追加
});
```

{% endtab %}
{% endtabs %}

たとえば、通知にランディングURLが付与されていて、あなたの `onCreate` メソッドでサブスクライバーのナビゲーションを処理するコールバックを実装した場合、コードは次のようになるかもしれません:

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

```kotlin
import com.pushly.android.PushSDK
import com.pushly.android.PushSDK.PNNotificationLifecycleCallbacks
import com.pushly.android.PushSDK.PNNotificationInteraction

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        PushSDK.logLevel = PNLogLevel.INFO
        PushSDK.setConfiguration(appKey = "YOUR_APP_KEY", context = this)

        PushSDK.PushNotifications.showPermissionPrompt(completion = { granted, response, error ->
            error?.let {
                println("権限リクエスト中にエラーが発生しました: $error")
                return@showNativeNotificationPermissionPrompt
            }

            println("権限が付与されました: $granted、応答: $response")
        })

        PushSDK.registerNotificationLifecycleCallbacks(object : PNNotificationLifecycleCallbacks {
            override fun onPushSDKDidReceiveNotificationDestination(
                destination: String,
                interaction: PNNotificationInteraction
            ): Boolean {
                // destination（ランディング URL）を使用して、アプリケーション内のアクティビティへ遷移する

                // SDK に対して遷移しないよう通知するために true を返す
                return true
            }
        })
    }

}
```

{% endtab %}

{% tab title="Java" %}

```java
import com.pushly.android.PushSDK;
import com.pushly.android.PushSDK.PNNotificationLifecycleCallbacks;
import com.pushly.android.PushSDK.PNNotificationInteraction;

class MainApplication extends Application {

    @Override()
    public void onCreate() {
        super.onCreate();

        PushSDK.setLogLevel(PNLogLevel.INFO);
        PushSDK.setConfiguration("YOUR_APP_KEY", this);

        PushSDK.PushNotifications.showPermissionPrompt((granted, response, error) -> {
            if (error != null) {
                System.out.printf("権限リクエストでエラーが発生しました: %s", error);
            } else {
                System.out.printf("許可が付与されました: %b, 応答: %s" ,granted, response);
            }
            
            return null;
        });

        PushSDK.registerNotificationLifecycleCallbacks(new PNNotificationLifecycleCallbacks() {
            @Override
            public boolean onPushSDKDidReceiveNotificationDestination(@NonNull String destination, @NonNull PNNotificationInteraction pnNotificationInteraction) {
                // destination（ランディング URL）を使用して、アプリケーション内のアクティビティへ遷移する

                // SDK に対して遷移しないよう通知するために true を返す
                return true;
            }
        });
    }

}
```

{% endtab %}
{% endtabs %}

## 通知インタラクションコールバック

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

{% hint style="info" %}
添付されたランディング URL に対して、URL を直接開く方法では適切に処理できないカスタム解析や変更が必要な場合に、このコールバックを使用します。
{% endhint %}

このコールバックは、宛先のランディング URL が添付された通知が開かれたときに呼び出されます。購読者は、指定されたランディング URL を表すビューへ遷移する必要があります。

このメソッドは Boolean の応答を想定しています。応答が `true` の場合、SDK はこの通知の開封に対して追加のアクションを実行しません。応答が `false` の場合、SDK は購読者を宛先 URL へ遷移させようとします。

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

```kotlin
override fun onPushSDKDidReceiveNotificationDestination(
    destination: String,
    interaction: PNNotificationInteraction
): Boolean {
    // destination（ランディング URL）を使用して、アプリケーション内のアクティビティへ遷移する

    // SDK に対して遷移しないよう通知するために true を返す
    return true
}
```

{% endtab %}

{% tab title="Java" %}

```java
@Override
public boolean onPushSDKDidReceiveNotificationDestination(@NonNull String destination, @NonNull PNNotificationInteraction pnNotificationInteraction) {
    // destination（ランディング URL）を使用して、アプリケーション内のアクティビティへ遷移する

    // SDK に対して遷移しないよう通知するために true を返す
    return true;
}
```

{% endtab %}
{% endtabs %}
