> For the complete documentation index, see [llms.txt](https://documentation.pushly.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://documentation.pushly.com/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c.md).

# SDK: Swift / Obj-C

## 前提条件

SDKをアプリに統合する前に、次の要件を満たす必要があります。

* 開発およびテストに使用するiOS 11以降のデバイス（iPhone、iPad、またはiPod Touch）、または以下の要件を満たすシミュレータ [<mark style="color:青;">シミュレータでのテスト</mark>](#testing-on-a-simulator).
* XCode 14以降（Swiftを使用する場合はSwift 5.7）がインストールされたMac OSデバイス。
* iOS P12プッシュ証明書またはP8キー。まだお持ちでない場合は、以下に従ってください [<mark style="color:青;">ドキュメント</mark>](/pushly-ja/integration/implementation-steps/apple-ios/p8kmatahap12no.md) これらを生成してください。
* 次の機能が有効な、バンドルID用に登録されたApp ID `プッシュ通知` および `App Groups` 。詳細は以下を参照してください [<mark style="color:青;">App IDを登録する</mark>](/pushly-ja/integration/implementation-steps/apple-ios/p8kmatahap12no.md#register-your-app-id).
* SDKキー：Pushlyプラットフォームの以下から取得します `ドメイン設定` ページの `概要` > `詳細` > `ドメイン情報` セクション。

## ステップ1：PushSDKフレームワークをインポートする

{% tabs %}
{% tab title="Swift Package Manager" %}
PushSDKフレームワークはSwiftとObjective-Cの両方に対応しています。

* ルートプロジェクトを選択し、次にメインのアプリケーションターゲットを選択します > `一般`
* クリック `+` > `その他を追加` > `パッケージの依存関係を追加` 以下の `フレームワーク、ライブラリ、および埋め込みコンテンツ`
* 次のパッケージURLで検索します： [<mark style="color:青;">https://github.com/pushly/push-sdk-ios</mark>](https://github.com/pushly/push-sdk-ios)
* 依存関係ルールを次のように設定します： `バージョン範囲` および `1.0.0` < `2.0.0`
* クリック `パッケージを追加`

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2Fur8SV1YwZVDqBNRbLvYW%2FScreen%20Shot%202022-12-16%20at%2012.50.27%20PM.png?alt=media&#x26;token=11c0170c-4375-4ce7-9f72-0077fd73e82f" alt=""><figcaption></figcaption></figure>

* 以下を確認してください `Pushly` オプションがチェックされていることを確認し、クリックします `パッケージを追加`

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FEXYitjbWrTVuLTouDMPQ%2FScreen%20Shot%202022-12-16%20at%2012.50.52%20PM.png?alt=media&#x26;token=f8eb701a-3b7c-47bc-9229-1259f38dd2bf" alt=""><figcaption></figcaption></figure>

* 最後に、以下を追加します `Pushly` ライブラリをメインアプリケーションターゲットに追加します

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FsuHbbXOjXGKNlZobezvD%2FScreen%20Shot%202022-12-16%20at%2012.51.13%20PM.png?alt=media&#x26;token=c593ae8d-c92b-4dd7-9bc3-102bcd18fe10" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CocoaPods" %}
PushSDKフレームワークはSwiftとObjective-Cの両方に対応しています。

CocoaPodsリンク： <https://cocoapods.org/pods/Pushly>

Podfileに以下を追加します：

```
target 'MyApp' do
  pod 'Pushly', '~> 1.1'
end
```

次に、以下を実行します `pod install` ターミナル内、またはCocoaPods.appから実行します。
{% endtab %}
{% endtabs %}

## ステップ2：通知サービス拡張機能を追加する

画像やカスタムアクションをサポートするリッチ通知を有効にするには、通知サービス拡張機能が必要です。

アプリのXCodeプロジェクト内で以下を選択します `File > New > Target`。以下を選択します `Notification Service Extension` iOSテンプレートタブ内で選択し、クリックします `次へ`.

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FIKOtBgXyBx78VJBxuNs9%2Fimage.png?alt=media&#x26;token=b0055514-7e75-4ce8-a0b3-bbba8f2543c6" alt=""><figcaption></figcaption></figure>

以下に「NotificationServiceExtension」と入力します `製品名` およびアプリ拡張機能のその他の設定詳細を入力してから、クリックします `完了` ただし **アクティベートをクリックしないでください** 後続のダイアログで。

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2F96yVKAthjykdmnXGXlem%2Fimage.png?alt=media&#x26;token=b8ed3424-44e0-4259-b97b-bb1457411164" alt=""><figcaption></figcaption></figure>

クリック `キャンセル` サービス拡張機能をアクティベートするよう求めるダイアログでクリックし、モーダルを閉じた後でデプロイメントターゲットを設定できるようにします。

<img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FcGXECnSyGjGGEUBg5KDM%2Fimage.png?alt=media&#x26;token=bc91b955-baa5-490f-a32b-dd7367657f9f" alt="" data-size="original">

デプロイメントターゲットを以下に設定してください **メインアプリケーションターゲットと同じ**。特別な理由がない限り、以下を設定する必要があります `デプロイメントターゲット` をiOS 11にします。これはPushSDKフレームワークおよび最新のXCodeリリースでサポートされる最も古いiOSバージョンです。

次に、以下を追加します `Pushly` ライブラリを通知サービス拡張機能に追加します：

クリック `+` 以下の `フレームワークとライブラリ` を選択し、すでにインポート済みの以下を選択します `Pushly` ライブラリ。

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FK7zOKyVoMmLfbFB5SFif%2FScreen%20Shot%202022-12-16%20at%2012.51.32%20PM.png?alt=media&#x26;token=bf917f13-825a-4905-b13d-404d953a7c4a" alt=""><figcaption></figcaption></figure>

次に、新しく作成した通知サービス拡張機能を開き、コードを以下に置き換えます：

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

```swift
import Pushly

class NotificationService: PNNotificationServiceExtension {
}
```

{% endtab %}

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

```objectivec
// ヘッダーファイルのインポートを必ず保持してください
#import "NotificationService.h"

@import Pushly;

@interface NotificationService ()

@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;

@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    [PNNotificationServiceExtensionHandler didReceiveExtensionRequest:request content:self.bestAttemptContent withContentHandler:contentHandler];
}

- (void)serviceExtensionTimeWillExpire {
    // 拡張機能がシステムによって終了される直前に呼び出されます。
    // 変更したコンテンツの「最善の試み」を配信する機会として使用してください。そうしない場合、元のプッシュペイロードが使用されます。
    [PNNotificationServiceExtensionHandler didRecieveExtensionTimeWillExpire:self.bestAttemptContent withContentHandler:self.contentHandler];

    self.contentHandler(self.bestAttemptContent);
}

@end
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
次のような依存関係エラーは無視できます `Module Pushly not found`。これらは次回のビルド時に解決されます。
{% endhint %}

## ステップ3：メインアプリケーションターゲットに機能を追加する

{% hint style="warning" %}
プッシュ通知機能は以下にのみ追加してください **メインアプリケーションターゲット**.
{% endhint %}

ルートプロジェクトを選択し、次にメインのアプリケーションターゲットを選択します > `署名と機能`

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FPEKQiayxyjIphpjeqxB1%2Fimage.png?alt=media&#x26;token=84e69c08-d120-4a48-a193-a272b9e4f109" alt=""><figcaption></figcaption></figure>

以下をクリックします `+ 機能` を追加します `プッシュ通知`.

以下をクリックします `+ 機能` を追加します `バックグラウンドモード`.

以下を追加した後 `バックグラウンドモード` 機能を追加したら、以下を確認してください `リモート通知` が有効になっていることを確認してください。

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FMAfJ7lisFKGMxQvjpIaB%2Fimage.png?alt=media&#x26;token=7b5b4afb-0a24-4b0a-8ef6-594f763231ea" alt=""><figcaption></figcaption></figure>

追加する `プッシュ通知` により、以下が書き込まれます `aps-environment` エンタイトルメントがターゲットのエンタイトルメントファイルに書き込まれます — `開発` はデバッグビルド用、そして `本番` はリリース、TestFlight、App Storeビルド用です。Xcodeがこの値を管理するため、手動で設定しないでください。

{% hint style="warning" %}
エンタイトルメントがない場合、アプリはAPNsに登録できず、起動時に次のエラーで登録に失敗します：

```
アプリケーションに有効な「aps-environment」エンタイトルメント文字列が見つかりません
```

このエラーは、以下のいずれかを意味します `プッシュ通知` このターゲットに機能が存在しないか、プロビジョニングプロファイルがApp IDで機能を有効にする前のものです。機能がリストされていることを確認してから、Xcodeにプロファイルを再生成させてください。
{% endhint %}

## ステップ4：共有App Groupを設定する

アプリとその通知サービス拡張機能は、以下として実行されます **2つの別個のプロセス**。共有App Groupコンテナは両方がアクセスできる唯一のストレージであり、PushSDKは一方のプロセスで始まり他方で完了するすべての処理でこれに依存しています。

同じApp Groupを以下に宣言する必要があります **両方の** ターゲット。一方にしか設定されていない場合、各プロセスは暗黙的にそれぞれのプライベートストレージにフォールバックし、共有は行われません。障害発生時にエラーは表示されません。

### 命名

SDKは設定から読み取るのではなくアプリのバンドルIDから識別子を導出するため、2つのターゲットで使用するコンテナについて不一致が生じることはありません。正確に次の形式にする必要があります：

```
group.{app-bundle-id}.push
```

バンドルIDが以下のアプリの場合 `com.pushly.example`、App Groupは以下になります `group.com.pushly.example.push`。通知サービス拡張機能では以下を使用します **アプリの** バンドルIDであり、拡張機能自身のものではありません。

### メインアプリケーションターゲットに追加する

以下でメインアプリケーションターゲットを選択した状態で `署名と機能`、以下をクリックします `+ 機能` を追加します `App Groups`.

以下をクリックします `+` 内にあるシンボル `App Groups` セクションで新しい名前付きコンテナを追加し、上記の名前を付けます。

<figure><img src="https://810756845-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Lry9Z27iWOZyQEGAgY7%2Fuploads%2FOR42sYi1kH4o1227pQpY%2Fimage.png?alt=media&#x26;token=c504305e-c703-4e7e-afff-834d9de68aac" alt=""><figcaption></figcaption></figure>

メインアプリケーションターゲットで、新しく作成したApp Groupの横にあるチェックボックスをオンにします。

### 通知サービス拡張機能に追加する

ルートプロジェクトを選択し、次に以下を選択します `NotificationServiceExtension > Signing & Capabilities`

以下をクリックします `+ 機能` を追加します `App Groups`.

以下の横にあるチェックボックスをオンにします **同じ** 次のApp Groupを `NotificationServiceExtension`.

機能を追加すると、以下が書き込まれます `com.apple.security.application-groups` が各ターゲットのエンタイトルメントファイルにグループ識別子とともに書き込まれます。両方のファイルに記載されている必要があります。

{% hint style="info" %}
以下が `署名を自動的に管理` 有効な場合、XcodeはApp Group識別子を作成し、以下を有効化します `App Groups` App IDの機能を有効にし、両方のターゲットのプロビジョニングプロファイルを再生成します。Xcodeが新しいApp Groupについてエラーを表示する場合、通常はまだプロビジョニング中です。完了後にリストを更新してください。

署名を手動で管理する場合、識別子を作成するだけでは不十分です。以下を有効にしてください `App Groups` をApp IDでも有効にしてから、両方のプロファイルを再生成してダウンロードしてください。
{% endhint %}

### これがない場合に壊れるもの

SDK自体は動作し続けますが、プロセス間状態に依存する機能は動作しなくなります：

* **通知インプレッション** — 拡張機能によって記録され、アプリによって完了されるため、コンテナが切断されるとそのすべてが失われます。
* **バッジ数** — 共有カウントが両方のプロセスから見えなくなります。
* **サービス拡張機能のアトリビューション** — 拡張機能で処理された通知が正しく帰属されなくなります。

インストールごとのイベントシーケンスカウンターも、コンテナ内にあるプロセス間ロックによって保護されています。コンテナがない場合、SDKは最善の試みによるプロセス内インクリメントにフォールバックします。そのためイベントにはシーケンス値が引き続き含まれますが、2つのプロセス間で調整されなくなります。

### 設定の確認

SDKは起動ごとに1回、共有コンテナの状態を報告します。存在しない場合は、次のように表示されます：

```
[PNAppGroup] Shared App Group container is unavailable. Notification impressions, badge counts and service-extension attribution will not work. Add the App Group "group.com.pushly.example.push" to the entitlements of BOTH the app target and the Notification Service Extension target.
```

正しく設定されている場合、同じチェックにより解決された識別子がデバッグレベルで報告されます：

```
[PNAppGroup] Shared App Group container available: group.com.pushly.example.push
```

## ステップ5：SDKの初期化

まず以下をインポートします `Pushly` AppDelegate内のライブラリ

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

```swift
import Pushly
```

{% endtab %}

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

```objectivec
@import Pushly;
```

{% endtab %}
{% endtabs %}

以下のコードをAppDelegateの次の箇所に追加します `didFinishLaunchingWithOptions` アプリケーションのメソッド。

以下を置き換えます `REPLACE_WITH_SDK_KEY` 以下の `setConfiguration` メソッド内を、プラットフォーム設定ページのSDKキーに置き換えます。

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

```swift
PushSDK.logLevel = .info
PushSDK.setConfiguration(appKey: "REPLACE_WITH_SDK_KEY", withLaunchOptions: launchOptions)

PushSDK.PushNotifications.showPermissionPrompt() { granted, settings, error in
    // 任意のコールバック
    print("User accepted permissions: \(granted)")
}
```

{% endtab %}

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

```objectivec
PushSDK.logLevel = PNLogLevelInfo;
[PushSDK setConfigurationAppKey:@"REPLACE_WITH_SDK_KEY" withLaunchOptions:launchOptions];

[PushSDKPushNotifications showPermissionPrompt:^(BOOL granted, UNNotificationSettings * _Nonnull settings, NSError * _Nullable error) {
    NSLog(@"User accepted permissions: %@", granted ? @"YES" : @"NO")
}];
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
**SwiftUIアプリ。** アプリが以下を使用してデリゲートを提供する場合 `@UIApplicationDelegateAdaptor`、以下を配置します `setConfiguration` 呼び出しをそのデリゲートの `didFinishLaunchingWithOptions` 上記とまったく同じ場所に配置してください。統合は通常どおり機能します。

デバッグ時には、SwiftUIが独自の以下をインストールすることに注意してください `SwiftUI.AppDelegate` を以下としてインストールします `UIApplication.shared.delegate` として設定し、コールバックを適応されたクラスに転送します。以下を確認しても `UIApplication.shared.delegate` そのため独自のデリゲート型は表示されません。これは想定どおりであり、統合が壊れていることを示すものではありません。
{% endhint %}

## ステップ6：実装をテストする

物理iOSデバイス、または以下の要件を満たすシミュレータでアプリを実行します [<mark style="color:青;">シミュレータでのテスト</mark>](#testing-on-a-simulator)。正しくビルドされることを確認してください。

前のステップで追加したコードにより、アプリを開いた際にプッシュ許可ダイアログが表示されます。これは以下を使用してカスタマイズできます [<mark style="color:青;">SDKメソッド</mark>](/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c/sdkmesoddo.md#manually-triggering-the-permission-dialog) を使用して、ダイアログを表示するタイミングを制御します。

ダイアログを承認したら、プラットフォームにログインして以下に移動します `通知 > 通知を作成` 最初の通知を送信し、以下をターゲットにします **ネイティブ：iOS** チャネルで、デバイスに送信します。

### シミュレータでのテスト

シミュレータはAPNsに登録して実際のリモート通知を受信できるため、サブスクリプションとエンドツーエンドの配信をテストできます。これには以下の **すべて** が必要です：

* AppleシリコンまたはT2チップを搭載したMac
* macOS 13以降
* iOS 16以降のシミュレータ
* Xcode 14以降

これらの条件を満たす場合、アプリは通常どおり登録され、iOSは正規のデバイストークンを発行します。物理デバイスとは次の2点が異なります：

* **トークンはサンドボックス専用です。** 通知はAPNsサンドボックス環境経由で送信する必要があります。デバッグビルドには以下が含まれます `aps-environment: development`。これにより送信がサンドボックスにルーティングされるため、自動的に処理されます。
* **トークンはそのMac上のそのシミュレータに紐付けられます。** シミュレータと、それが実行されるMacハードウェアの組み合わせに固有のため、移植できません。また、シミュレータを消去すると新しいトークンが発行されます。

{% hint style="warning" %}
上記の要件のいずれかを満たさない場合（T2チップ非搭載のIntel Mac、macOS 12以前、またはiOS 16未満のシミュレータ）、登録はAPNsエラーで失敗します `3010` そしてSDKは以下をログに記録します：

```
iOS Simulator does not support push notifications
```

これらの環境では、トークン登録は物理デバイスでテストする必要があります。
{% endhint %}

### APNsを使用せずに通知を配信する

`xcrun simctl push` はAPNsの設定を一切行わずに、起動済みのシミュレータへ直接通知を配信します。上記の要件にかかわらず、どのシミュレータでも動作します。通知の次の項目を確認する最も簡単な方法です **表示とタップ処理**.

ペイロードを以下の名前で保存します `payload.apns`:

```json
{
  "aps": {
    "alert": {
      "title": "テスト通知",
      "body": "シミュレータにローカル配信されました。"
    },
    "sound": "default"
  },
  "piid": "00000000-0000-0000-0000-000000000000",
  "notification_id": 1,
  "landing_url": "https://example.com"
}
```

次に、バンドルIDを自身のものに置き換えて、起動済みのシミュレータに配信します：

```bash
xcrun simctl push booted com.pushly.example payload.apns
```

SDKがペイロードをPushly通知として認識して処理するには、ペイロードに以下すべてが含まれている必要があります：

* `aps.alert` 以下の形式の **辞書** — 単純な文字列のアラートは認識されません
* `piid` — 文字列
* `notification_id` — **整数**
* `landing_url` — 文字列

これらのいずれかが欠けているか型が正しくない場合でも、iOSは通知を表示しますが、SDKはそれを無視し、SDKコールバックやイベントは発生しません。

{% hint style="warning" %}
以下で配信された通知 `simctl push` はAPNsやPushlyを通過しないため、プラットフォームで配信、インプレッション、クリックのレポートは生成されません。表示とタップ処理の確認にのみ使用してください。
{% endhint %}

## 次のステップ

SDKが正常に動作していることを確認したら、次のような追加のオプション機能を追加できます：

* [<mark style="color:青;">通知の開封／アプリリンク／ディープリンクの処理</mark>](/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c/dpurinku.md)
* [<mark style="color:青;">購読者のプロファイルへの属性の追加</mark>](/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c/sdkmesoddo.md#adding-attributes-to-a-subscribers-profile)
* [<mark style="color:青;">購読者がどのコンテンツを操作したかに関する情報の送信</mark>](/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c/sdkmesoddo.md#activity-tracking-url-screen-visits)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://documentation.pushly.com/pushly-ja/integration/implementation-steps/apple-ios/sdk-swift-obj-c.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
