App Intentsの習得：WWDC 2024からの新機能 「※2024年6月に調査した内容です」

# iOS 18のApp Intentsでアプリ体験を向上させる

## 紹介

iOS 18のリリースに伴い、AppleはWWDC 2024でApp Intentsに大幅な改善を導入し、開発者がアプリケーションをiOSシステム機能とシームレスに統合できるようにしました。この記事では、主要なアップデートを探求し、WWDC24からリリースされた新しいデモアプリケーションに基づいた例を提供します。

<img width="1920" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812396/77143886-07c6-7378-33f2-f86c9b11ab10.png">

## iOSでのApp Intentsの理解
App Intentsとは何か？
App Intentsは、iOS開発者がアプリケーションの機能をiOSシステム内で直接公開できるようにするものです。このフレームワークは、アプリの機能をSiri、ショートカット、ウィジェットなどのシステム機能と統合し、ユーザーがアプリを開かずにアプリ固有のタスクを実行できるようにします。

### App Intentsの例
タスク管理アプリを考えてみましょう。ユーザーが新しいタスクを作成できるように、App Intentsを定義することができます。ユーザーが「牛乳を買うためのタスクを追加」と言うと、Intentsはこのコマンドを直接処理し、ユーザーがアプリを開かなくてもアプリを更新します。

### iOS 18の変更点とApp Intentsの新機能
iOS 18では、いくつかの重要な強化が加えられています：

- UnionValueパラメーター： この新機能により、パラメーターが複数のタイプを受け入れることができるようになり、ユーザーインタラクションの柔軟性が向上します。
- 自動パラメータータイトル： プロパティ名に基づいてパラメータータイトルを自動生成することで、Xcodeでの開発を簡素化し、コードを整理します。
- 強化されたフレームワークサポート： 開発者は今、フレームワーク内でアプリentitiesを定義することができ、コードの組織化を改善し、メンテナンスとスケーラビリティを容易にします。

これらの開発は、iOS 16で導入されて以来の重要な進化を示しており、柔軟性の向上、開発の複雑さの削減、アップルのエコシステム内でのアプリ機能の範囲の拡大に焦点を当てています。

## 主な特徴

### 1. [Enhanced Spotlight Integration](https://developer.apple.com/documentation/appintents)

iOS 18は、アプリがスポットライトと統合する機能を拡大します。新しいIndexedEntityプロトコルを使用して、開発者はアプリデータをより効果的にインデックス化できるようになり、ユーザーはスポットライトの検索結果から直接アプリコンテンツにアクセスできるようになります。

**Example Code:**
```swift
struct TrailEntity: IndexedEntity {
    var id: UUID
    var name: String
    var location: String
    
    var attributeSet: CSSearchableItemAttributeSet {
        let attributes = CSSearchableItemAttributeSet(contentType: .text)
        attributes.title = name
        attributes.contentDescription = "Discover trails at \(location)"
        attributes.keywords = ["hiking", "outdoors", location]
        return attributes
    }
}
```

### 2. [Transferable API](https://developer.apple.com/documentation/coretransferable/transferable?changes=_8)

Transferable APIは、アプリデータを標準化された形式に変換し、Siriやショートカットなどのさまざまなシステムコンポーネント間での共有を容易にする機能を提供します。この機能は、Appleエコシステム内でアプリの対話性とアクセシビリティを向上させたい開発者にとって特に有用です。

**Example Code:**
```swift
struct TrailEntity: Transferable {
    var id: UUID // トレイルの一意識別子
    var name: String // トレイルの名前
    var location: String // トレイルの場所

    static var transferRepresentation: some TransferRepresentation {
        DataRepresentation(exportedContentType: .plainText) { trail in
            return "\(trail.name) - \(trail.location)".data(using: .utf8)!
        }
        FileRepresentation(exportedContentType: .png) { trail in
            return try? Data(contentsOf: URL(string: "path/to/trailImage.png")!)
        }
    }
}
```

### 3. [FileEntity API](https://developer.apple.com/documentation/appintents/fileentity?changes=lat_1_5_8_6_8_3) 
アプリ内のファイルベースのデータを管理するために導入され、App Intentsを通じてファイルの直接操作を強化します。

**Example Code:**
```swift
struct PhotoEntity: FileEntity {
    var identifier: UUID // 写真の一意識別子
    var fileURL: URL // 写真ファイルのURL

    var supportedContentTypes: [UTType] {
        return [.image]
    }

    var fileEntityIdentifier: FileEntityIdentifier {
        return FileEntityIdentifier(url: fileURL)
    }
}
```

### 4. [URLRepresentableEntity](https://developer.apple.com/documentation/AppIntents/URLRepresentableEntity) と [URLRepresentableIntent](https://developer.apple.com/documentation/appintents/urlrepresentableintent)
これらのAPIは、アプリ内でのディープリンキングを強力にサポートし、EntitiesとIntentsをURLを介して直接アクセスできるようにします。

**Example Code:**
```swift
struct TrailEntity: URLRepresentableEntity {
    var id: UUID // トレイルの一意識別子
    var name: String // トレイルの名前

    static var urlRepresentation: URLRepresentation {
        return URLRepresentation(template: "myapp://trail/\(id)")
    }
}

struct OpenTrailIntent: URLRepresentableIntent {
    static var title: String { "Open Trail" }
    var trail: TrailEntity // 開くトレイルentities

    func perform() -> some IntentResult {
        return OpenURLIntent(url: trail.urlRepresentation.url)
    }
}
```

### 5. [開発者体験の向上](https://developer.apple.com/documentation/updates/appintents)
iOS 18において、Appleは開発者体験を大幅に向上させ、特にApp Intentsの作成と管理を簡素化する新機能の導入により改善しました。

#### UnionValue パラメータ
新しいUnionValueマクロは、App Intentsでのパラメータ処理に多用途なアプローチを導入します。この機能は、単一のパラメータで複数のタイプを表すことができ、アプリ機能の柔軟性を高めます。

**Example Code:**
```swift
enum DayPassType: UnionValue {
    case singleTrail(TrailEntity) // 単一のトレイル用デイパス
    case entirePark(ParkEntity) // 公園全体用デイパス
}

struct BuyDayPassIntent: AppIntent {
    static var title: String { "Buy Day Pass" }
    var passType: DayPassType // デイパスタイプ

    func perform() -> some IntentResult {
        switch passType {
        case .singleTrail(let trail):
            // 単一トレイルパスの購入を処理
            // （ここにロジックを実装）
        case .entirePark(let park):
            // 公園全体のパスの購入を処理
            // （ここにロジックを実装）
        }
        return .result()
    }
}
```
# Xcode 16における自動パラメータタイトル

Xcode 16は、プロパティ名に基づいてアプリEntitiesのプロパティまたはIntentsパラメータのタイトルを自動生成することで、開発者のワークフローを強化します。開発者は必要に応じてこれらのタイトルを上書きすることができ、コードを簡素化し、冗長性を減らすことができます。

## フレームワークサポート

iOS 18はまた、フレームワーク統合の範囲を拡大します。アプリEntitiesはフレームワーク内で定義され、アプリや拡張機能で参照されるようになりました。この組織化はコードのモジュール性を向上させ、アプリケーションの異なる部分でのメンテナンスとスケーラビリティを簡素化します。

## 主な利点

- 手動設定が少なく、開発プロセスが合理化されます。
- UnionValueパラメータを使用することで、入力タイプの多様性が増します。
- フレームワークサポートの向上を通じてコードの組織性と再利用性が向上します。

これらの改善は、開発者がボイラープレートコードの管理よりも革新的な機能の作成に集中できるように、よりスムーズで効率的な開発体験を提供することを目指しています。


## 結論

iOS 18のApp Intentsの強化により、開発者は自分のアプリをiOSシステムとより深く統合する前例のない方法を提供されます。これらの機能はユーザーエンゲージメントを向上させるだけでなく、アプリ機能の新たな可能性を開きます。さらに探求するために、開発者はAppleが提供する詳細なドキュメントやWWDC24のリソースを深く調べることが奨励されます。

詳細なガイダンスについては、以下のWWDC 2024のセッションや参考記事をご覧ください。

- [WWDC 2024 セッション: What's New in App Intents](https://developer.apple.com/videos/play/wwdc2024/10134/)
- [WWDC 2024 セッション: Bring your app’s core features to users with App Intents](https://developer.apple.com/videos/play/wwdc2024/10210)
- [WWDC 2024 セッション: Design App Intents for system experiences](https://developer.apple.com/videos/play/wwdc2024/10176)
- [サンプルアプリのソースコード](https://developer.apple.com/documentation/AppIntents/AcceleratingAppInteractionsWithAppIntents)