フレームワークとの統合

watchOS アプリの作成





訳注:以下、必要な場所においては Mac と iPhone 両方のセクションを提供しています。
Mac → セクション 5、iPhone → セクション 105 とします。







    NotificationView.swift


  1. import SwiftUI
  2. struct NotificationView: View {
  3. var title: String?
  4. var message: String?
  5. var landmark: Landmark?
  6. var body: some View {
  7. VStack {
  8. if landmark != nil {
  9. CircleImage(image: landmark!.image.resizable())
  10. .scaledToFit()
  11. }
  12. Text(title ?? "Unknown Landmark")
  13. .font(.headline)
  14. Divider()
  15. Text(message ?? "You are within 5 miles of one of your favorite landmarks.")
  16. .font(.caption)
  17. }
  18. .lineLimit(0)
  19. }
  20. }
  21. struct NotificationView_Previews: PreviewProvider {
  22. static var previews: some View {
  23. Group {
  24. NotificationView()
  25. NotificationView(title: "Turtle Rock",
  26. message: "You are within 5 miles of Turtle Rock.",
  27. landmark: ModelData().landmarks[0])
  28. }
  29. }
  30. }


プレビューその 1



    NotificationController.swift


  1. import WatchKit
  2. import SwiftUI
  3. import UserNotifications
  4. class NotificationController: WKUserNotificationHostingController<NotificationView> {
  5. var landmark: Landmark?
  6. var title: String?
  7. var message: String?
  8. override var body: NotificationView {
  9. NotificationView()
  10. }
  11. override func willActivate() {
  12. // This method is called when watch view controller is about to be visible to user
  13. super.willActivate()
  14. }
  15. override func didDeactivate() {
  16. // This method is called when watch view controller is no longer visible
  17. super.didDeactivate()
  18. }
  19. override func didReceive(_ notification: UNNotification) {
  20. // This method is called when a notification needs to be presented.
  21. // Implement it if you use a dynamic notification interface.
  22. // Populate your dynamic notification interface as quickly as possible.
  23. }
  24. }


    NotificationController.swift


  1. override var body: NotificationView {
  2. NotificationView(
  3. title: title,
  4. message: message,
  5. landmark: landmark
  6. )
  7. }


    NotificationController.swift


  1. var title: String?
  2. var message: String?
  3. let landmarkIndexKey = "landmarkIndex"
  4. override var body: NotificationView {
  5. NotificationView(


プログラム全体 その 1



    NotificationController.swift


  1. override func didReceive(_ notification: UNNotification) {
  2. let modelData = ModelData()
  3. let notificationData =
  4. notification.request.content.userInfo as? [String: Any]
  5. let aps = notificationData?["aps"] as? [String: Any]
  6. let alert = aps?["alert"] as? [String: Any]
  7. title = alert?["title"] as? String
  8. message = alert?["body"] as? String
  9. if let index = notificationData?[landmarkIndexKey] as? Int {
  10. landmark = modelData.landmarks[index]
  11. }
  12. }
  13. }


プログラム全体 その 2



    LandmarksApp.swift


  1. import SwiftUI
  2. @main
  3. struct LandmarksApp: App {
  4. @StateObject private var modelData = ModelData()
  5. var body: some Scene {
  6. WindowGroup {
  7. ContentView()
  8. .environmentObject(modelData)
  9. }
  10. #if os(watchOS)
  11. WKNotificationScene(controller: NotificationController.self, category: "LandmarkNear")
  12. #endif
  13. }
  14. }


    PushNotificationPayload.apns


  1. {
  2. "aps": {
  3. "alert": {
  4. "title": "Silver Salmon Creek",
  5. "body": "You are within 5 miles of Silver Salmon Creek."
  6. },
  7. "category": "LandmarkNear",
  8. "thread-id": "5280"
  9. },
  10. "landmarkIndex": 1,
  11. "WatchKit Simulator Actions": [
  12. {
  13. "title": "First Button",
  14. "identifier": "firstButtonAction"
  15. }
  16. ],
  17. "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App."
  18. }












セクション 1セクション 2セクション 3
セクション 4セクション 5
セクション 101セクション 102セクション 103
セクション 104セクション 105






目次
Xcode の新機能

フレームワーク

  • SwiftUI

  • ビューの作成と結合

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    ビルドリストとナビゲーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7

    セクション 8


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107

    セクション 108

    ユーザー入力の処理

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    パスとシェイプの描画

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    ビューと移行のアニメーション

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    複雑なインターフェースの構成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    UI コントロールを扱う

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    UIKit とのインターフェース

    セクション 1

    セクション 2

    セクション 3

    セクション 4


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    watchOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    macOS アプリの作成

    セクション 1

    セクション 2

    セクション 3

    セクション 4

    セクション 5

    セクション 6

    セクション 7


    セクション 101

    セクション 102

    セクション 103

    セクション 104

    セクション 105

    セクション 106

    セクション 107