【macOS】公証つけて配布する方法 - 2024年版

調べながらやったが、


Product

  ↓

Archive

  ↓

Distrubute App

と進んでいくが、

「Developer ID」

の選択肢が表示されない。

 

🧑🏻‍💻 iOS から macOS に切り替える

ここですか。

Xcode 上部中央で切り替える。

これで、流れとしては、


Product

  ↓

Archive

  ↓

Distrubute App

または、Custom 経由で、


Product

  ↓

Archive

  ↓

Distrubute App

  ↓

Custom


というかんじで、

以前の「Developer ID」での処理は 「Direct Distribution」からいける。

選択肢のラベルが変わった感じか。

あとは Export すればいい。


👉 Notarizing macOS software before distribution | Apple Developer Documentation hatena-bookmark


【SwiftUI + SwiftData】MVVMパターンを考えたときに

SwiftUI ベースに MVVM のパターンを考えたとき。

Apple と Orange の子 View があるとして、こういう感じで認識していましたけども MVVM。

1つの View に対して、1つの ViewModel でライフサイクルは同期している。

その View の子の View に対しては親の ViewModel を渡したり、差し込んでいく。

著名な公開されているコードを見てると、こういう形が多いように見えるし、そのほうが書きやすいように思える。

世の中そんな流れですかね。

どうなんですかね。

ModelContext てそんな子に向けてのツールですよね。

どこかなんかいい参考記事ないですかね。

まあ、ざっくりの話なんですけども。


【SwiftUI + SwiftData】List のアイテムの Preview

List や LazyVStack などの、

一つの要素の View の #Preview を

簡単に表示するというだけの件。

よくある List 的な View。

その一つの Item の View。


struct ItemView: View {
  var item: Item

  var body: some View {
    HStack {
      Spacer()
      Text("\(item.i)")
      Spacer()
      Text("\(item.s)")
    }
    .font(.largeTitle)
    .monospaced()
    .background()
  }
}

この一つの View だけを #Preview で簡単に表示したい。

 

🤔 #Preview 用の View

Container のセットはより上位の View でセットするのが定石。

 

🤔 使い方

一つ入れ子でクロージャ。


#Preview {
  PreviewOneModelView { item in
    ItemView(item: item)
  }
  .modelContainer(for: Item.self, inMemory: false)
}

 

🤔 参考

Apple 公式サンプルより簡易化して抜粋しました。


public struct ModelPreview<Model: PersistentModel, Content: View>: View {
    var content: (Model) -> Content
    
    public init(@ViewBuilder content: @escaping (Model) -> Content) {
        self.content = content
    }
    
    public var body: some View {
        ZStack {
            PreviewContentView(content: content)
        }
        .backyardBirdsDataContainer(inMemory: true) // * inMemory
    }
    
    struct PreviewContentView: View {
        var content: (Model) -> Content
        
        @Query private var models: [Model]
        @State private var waitedToShowIssue = false
        
        var body: some View {
            if let model = models.first { // * first
                content(model)
            } else {
                ContentUnavailableView {  // * could not get first item
                    Label {
                        Text(verbatim: "Could not load model for previews")
                    } icon: {
                        Image(systemName: "xmark")
                    }
                }
                .opacity(waitedToShowIssue ? 1 : 0)
                .task {
                    Task {
                        try await Task.sleep(for: .seconds(1))
                        waitedToShowIssue = true
                    }
                }
            }
        }
    }
}

👉 sample-backyard-birds/BackyardBirdsData/General/ModelPreview.swift · apple/sample-backyard-birds hatena-bookmark