[SwiftUI] ShareLink の使い方(その1)

SwiftUI2021

     
⌛️ 3 min.
WWDC2022 で登場した ShareLink の使い方を説明します(全2回予定)

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Ventura 13.3 Beta3
  • Xcode 14.3 Beta2
  • iOS 16.0

ShareLink

ShareLink は、iOS16/macOS13 から使用できる View で 共有シートを表示するきっかけとすることができます。

Apple のドキュメントは、こちら

ShareLink でシェアするものは、以下の3つです。
・item
・subject (String)
・message (String)

共有 Item

item としては、さまざまな型を使用することができます。

ShareLink 向けには、item が String 型や URL 型である場合に向けた init も用意されています。

ShareLink の item として使うことができるようにするためには、Transferable に conform している必要があります。(次回以降で説明予定です)

この記事では、ShareLink の使い方を確認するために、item が String 型の時の使い方を見ていきます。

# String はすでに Transferable に conform しています。

Subject, Message

ShareLink では、共有オブジェクトと同時に、Subject と Message を指定することができます。

Subject

Subject については Apple のドキュメントでは、以下のように説明されています。
subject A title for the item to show when sharing to activities that support a subject field.

どのようなアプリが subject field に対応しているか気になりますが、記載はありません・・・・

メールアプリは対応しているようですが、それ以外は不明です。
例えば、Reminder は、受け取ってくれません。

Message

Message については、Apple のドキュメントでは、以下のように説明されています。
message A description of the item to show when sharing to activities that support a message field. Activities may support attributed text or HTML strings.

Message が Subject と異なる点は、message を指定した時に、共有シートにも表示される点です。
(別に preview が指定すると表示されなくなります。)

本記事では、シェア対象の item にフォーカスして説明しますので、subject, message はほとんど登場しません。

シンプルな使い方

シンプルに使ってみます。

ShareLink は、String と URL を特別扱いしていて、この2つの share であれば、非常に簡単にできるようになっています。

String をシェア

String “MyShareString” を share するためのコードは以下のようになります。

ShareLink(item: "MyShareString")

以下のような共有ボタンが表示され、押下すると 共有シートが表示されるようになります。

ALTTEXT
pureShareSheet

Transferable に conform しているString

上記のように、String をそのまま ShareLink に使えたのは、String がすでに Transferable に conform しているからです。

Transferable に準拠しているものは、ShareLink の item として渡すことができます。

Apple のドキュメントは、こちら

Playground でも以下のようにして、String に transferRepresentation が定義されていることを確認することができ、Transferable に conform していることが確認できます。

import Foundation
import SwiftUI

print(String.transferRepresentation)

// printout
DataRepresentation(contentType: _UTCoreType 0x7ff864a58c30> public.utf8-plain-text (not dynamic, declared), exporting: Optional((Function)), importing: Optional((Function)))

Label をカスタマイズ

ShareLink は特に指定しなければ、通常の共有ボタンで表示されます。

ShareButton

通常はこの共有ボタンで十分かもしれませんが、この共有ボタンをカスタマイズすることも可能です。
共有ボタンをカスタマイズするためには、label: で指定します。

ShareLink(item: "Hello", label: { Label(title: { Text("MyOwnShare") }, icon: { Image(systemName: "paperplane")}) })

以下のような共有ボタンになります。

MyOwnShare

label として Label を指定しているので、テキストだけでなく、アイコンも指定したものが使用されています。

共有シート上での表示カスタマイズ

共有シート上での表示についての設定もできるようになっています。

共有シートには 共有先のアプリ選択等もありますので、共有シート全体をカスタマイズできるわけではありません。

ShareSheet

上記は、String を共有対象としたときに表示される 共有シート です。String を共有しようとしているので、イメージ部分は テキストを表すイメージ、メッセージ部分は、共有オブジェクトそのものを表示しています。

このイメージ部分や、メッセージ部分をカスタマイズすることができます。

メッセージ部分をカスタマイズ

メッセージ部分の指定はさまざまな方法で可能です。

共有オブジェクトが String で、特にメッセージ部分を指定していない場合は、共有オブジェクト(String) がそのまま表示されます。
共有対象として、message も指定しているとその Text が表示されます。

ShareLink(item: "Hello", subject: Text("Subject"), message: Text("Message"))

以下のように、メッセージ部分に Message と表示されるようになります。

MessageForString

なお、message 引数の説明には、”A description of the item to show when sharing to activities that support a message field. Activities may support attributed text or HTML strings.” と書いてありますが、 Markdown を使った Text を渡すと、(少なくとも) 共有シートではメッセージは非表示になってしまいました。(共有先には渡されましたので、共有シートが AttributedString 的な要素の表示に非対応なのだと推測します @iOS16.3時点)

イメージ部分をカスタマイズ

イメージ部分、メッセージ部分をカスタマイズするためには、SharePreview を使うことが必要となります。

Apple のドキュメントは、こちら

この SharePreview では、イメージ部分とメッセージ部分の両方を指定します。

MEMO

message: 引数で指定する Text でもカスタマイズできていましたが、あくまで 共有する情報を使って、 Preview を作成していたと言う状態です。
SharePreview に渡される情報は Preview のためであり、共有先のアプリには渡されません。

以降のサンプルアプリには、”MyImage” と言う名称で、画像を登録してサンプルを動作させています。

ShareLink(item: "Hello", preview: SharePreview("MyText", image: Image("MyImage")))

共有シートは以下のようになります。

MyImageMyText

なお、SharePreview に イメージやメッセージを渡していますが、あくまでそれは Preview に使用されているだけです。共有先のアプリに渡されるのは、共有オブジェクトである “Hello” です。

すべてをカスタマイズした ShareLink

すべてを組み合わせて使用することもできます。
つまり、共有ボタンになるラベルも指定して、共有シートに表示される イメージとメッセージも指定しているケースです。

ShareLink(item: "Hello",
          preview: SharePreview("MyText", image: Image("MyImage")),
          label: { Text("MyShareLabel")})
FullCustom_Button
FullCusom_ShareSheet

なお、message と preview を同時に指定されることも 考えられますが、同時に指定された場合、共有シートには preview で指定した情報が表示されます。

次回

本記事では、String を共有対象として 共有ボタンや共有シートのカスタマイズを確認しました。

次の記事では、独自オブジェクトを 対象とする方法を確認する予定です。

まとめ

ShareLink の使い方

ShareLink の使い方
  • item: 引数が共有オブジェクト
  • subject, message で追加情報も共有できる(ただし、使用方法不明)
  • SharePreview を使用することで共有シート上での preview を指定できる

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です