アプリ間でのデータ共有を実装する方法を紹介します!
本ページでは、App Groups を利用します。
動作環境
対象 | バージョン |
---|---|
iOS | 13.3 |
macOS | Catalina 10.15.2 |
Xcode | 11.3.1 |
Swift | 5.1.3 |
データ共有機能(App Groups)の実装
アプリ間でデータを共有するため、アプリは2つ作成します。
- データを表示・変更するアプリ
- データを表示のみするアプリ
1, 2 で同じデータを表示します。
アプリの設定(2つのアプリ共通)
2つのアプリで設定してください。
- 「Signing & Capabilities」から「App Groups」を追加する
- グループ名を追加する
ファイル作成(2つのアプリ共通)
- Storyboard
- ここでは、"AppGroups.storyboard" とします
- ViewController.swift
- ここでは、"AppGroupsViewController.swift" とします
画面を作成(データを表示・変更するアプリ)
Storyboard に、以下を載っけます。
- 共有データを表示するラベル
- 共有データを変更するテキストフィールド
- 共有データを変更するボタン
画面とソースの紐付け(データを表示・変更するアプリ)
ソースコード上に紐付けします。
/// 共有データを表示するラベル
@IBOutlet weak var valueLabel: UILabel!
/// 共有データを変更するテキストフィールド
@IBOutlet weak var updateValueTextField: UITextField!
/// 変更ボタンを押下した際の処理
/// - Parameter sender: 変更ボタン
@IBAction func updateValueButton(_ sender: Any) {
valueLabel.text = updateValueTextField.text
let userDefaults = UserDefaults(suiteName: groupID)
userDefaults?.set(valueLabel.text, forKey: "DataStore")
}
ソースコード(データを表示・変更するアプリ)
import UIKit
class AppGroupsViewController: UIViewController {
let groupID = "(グループ名を記入してください)"
/// 共有データを表示するラベル
@IBOutlet weak var valueLabel: UILabel!
/// 共有データを変更するテキストフィールド
@IBOutlet weak var updateValueTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let userDefaults = UserDefaults(suiteName: groupID)
userDefaults?.register(defaults: ["DataStore": "default"])
valueLabel.text = userDefaults?.object(forKey: "DataStore") as? String
}
/// 変更ボタンを押下した際の処理
/// - Parameter sender: 変更ボタン
@IBAction func updateValueButton(_ sender: Any) {
valueLabel.text = updateValueTextField.text
let userDefaults = UserDefaults(suiteName: groupID)
userDefaults?.set(valueLabel.text, forKey: "DataStore")
}
}
画面を作成(データを表示のみするアプリ)
Storyboard に、以下を載っけます。
- 共有データを表示するラベル
画面とソースの紐付け(データを表示のみするアプリ)
ソースコード上に紐付けします。
ソースコード(データを表示のみアプリ)
import UIKit
class AppGroupsViewController: UIViewController {
let userDefaults = UserDefaults.standard
let groupId = "(グループ名を記入してください)"
/// 共有データを表示するラベル
@IBOutlet weak var valueLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let userDefaults = UserDefaults(suiteName: groupId)
userDefaults?.register(defaults: ["DataStore": "default"])
valueLabel.text = userDefaults?.object(forKey: "DataStore") as? String
}
}