4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

「App Extensions」(iOSアプリケーションの拡張)で「Core Data」を使用する

Last updated at Posted at 2020-05-17

「App Extension」とは?

App extensions は、主要iOSアプリケーションの拡張機能です。例えば、「iMessage Extension」、「Today Extension」、「Siri Extension」などがあります。

Screen Shot 2020-05-12 at 3.38.39 PM.png

##「Core Data」とは?
Core Data はAppleのフレームワークであり、ユーザー情報をローカルストレージに格納するのに便利です。また、CloudKitのサポートも組み込まれており、ユーザーたちのすべてのデバイスで変更内容を同期できます。

本日のトピック?

Core Data には、次のコードを使用することで、主要iOSアプリで簡単にアクセスできます:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

ただし、App Extensionからもアクセスできるようにするには、いくつかの追加の手順を行う必要があります。

:bangbang: 警告:この変更は、既存のアプリを更新する時にではなく、未公開のアプリを最初に開発する段階で行ってください。

複数のApp ExtensionにわたるCore data

1. App Group を有効にする

最初に「Signing & Capabilities」タブに進み、「+」アイコンを選択します。

Screen Shot 2020-05-12 at 3.53.18 PM.png

主要iOSアプリとその他のすべてのターゲット向けに「App Group」を追加します。

すべてのターゲットに同じ「App Group」を割り当てます。

Screen Shot 2020-05-12 at 3.55.43 PM.png

2. ヘルパーを追加

まずファイル「*. xcdatamodel」を探します。ファイル名が「Sakura.xcdatamodel」の場合、データベース名が「Sakura」ということです。

import Foundation
import CoreData

class NSCustomPersistentContainer: NSPersistentCloudKitContainer {
    
    override open class func defaultDirectoryURL() -> URL {
        var storeURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.[App Group Name 名前]")
        storeURL = storeURL?.appendingPathComponent("Sakura.sqlite")
        return storeURL!
    }

}

3. データベースにアクセスする

これで次の方法でデータベースにアクセスできるようになりました:

lazy var persistentContainer: NSPersistentContainer = {
        let container = NSCustomPersistentContainer(name: "Sakura")
        
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                print(error.localizedDescription)
            }
        })
        return container
    }()

let context = persistentContainer.viewContext

この記事は、複数の拡張機能にわたるデータベースのサポートを新規アプリ向けに追加するためのものです。ユーザーストレージにデータがある場合、アプリのデータを常に復旧できるようにするために、重要な変更を行う前は必ず別途バックアップを取っておくようにしてください。


:relaxed: Twitter @MszPro

:sunny: 私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?