{"id":1064,"date":"2023-08-25T08:53:59","date_gmt":"2023-08-24T23:53:59","guid":{"rendered":"https:\/\/avancesys.co.jp\/laboratory\/?post_type=article&#038;p=1064"},"modified":"2023-08-25T08:53:59","modified_gmt":"2023-08-24T23:53:59","slug":"iphone%e3%81%a8apple-watch%e3%81%a7%e5%8f%8c%e6%96%b9%e5%90%91%e9%80%9a%e4%bf%a1%ef%bc%88watch-connectivity%ef%bc%89","status":"publish","type":"article","link":"https:\/\/www.avancesys.co.jp\/laboratory\/article\/iphone%e3%81%a8apple-watch%e3%81%a7%e5%8f%8c%e6%96%b9%e5%90%91%e9%80%9a%e4%bf%a1%ef%bc%88watch-connectivity%ef%bc%89\/","title":{"rendered":"iPhone\u3068Apple Watch\u3067\u53cc\u65b9\u5411\u901a\u4fe1\uff08Watch Connectivity\uff09"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-1024x683.png\" alt=\"\" class=\"wp-image-1074\" width=\"768\" height=\"512\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-1024x683.png 1024w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-300x200.png 300w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-768x512.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-1536x1025.png 1536w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-2048x1366.png 2048w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_6-660x440.png 660w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure><\/div>\n\n\n<p>\u3053\u3093\u306b\u3061\u306f\u3001n\/a\u3067\u3059\u3002<\/p>\n\n\n\n<p>iPhone \u3068 Apple Watch \u306e\u53cc\u65b9\u5411\u901a\u4fe1\u306f\u3001<strong>Watch Connectivity<\/strong> \u3092\u4f7f\u3046\u3068\u5c11\u306a\u3044\u30b3\u30fc\u30c9\u3067\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4eca\u56de\u306f\u3001\u7c21\u5358\u306a\u30ab\u30a6\u30f3\u30bf\u30fc\u30a2\u30d7\u30ea\u306e\u4f5c\u6210\u3092\u901a\u3057\u3066 Watch Connectivity \u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u3054\u7d39\u4ecb\u3057\u307e\u3059\u3002<br>iPhone \u3068 Apple Watch \u3067\u30ab\u30a6\u30f3\u30bf\u30fc\u306e\u5024\u3092\u5171\u6709\u3057\u3001\u53cc\u65b9\u304b\u3089\u5024\u3092\u5909\u66f4\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-pullquote has-border-color has-vivid-cyan-blue-border-color\"><blockquote><p>\u958b\u767a\u74b0\u5883<\/p><\/blockquote><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Xcode 14<\/li>\n\n\n\n<li>SwiftUI<\/li>\n\n\n\n<li>iPhone 11 Pro (iOS 16.3.1)<\/li>\n\n\n\n<li>Apple Watch Series 7 (watchOS 9.3.1)<\/li>\n<\/ul>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-pullquote has-border-color has-vivid-cyan-blue-border-color\"><blockquote><p>\u5b9f\u88c5<\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">0. \u4e8b\u524d\u6e96\u5099<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>iPhone \u306e Bluetooth \u3068 Wi-Fi \u3092 ON \u306b\u3059\u308b\u3002<\/li>\n\n\n\n<li>iPhone \u3068 Apple Watch \u3092\u30da\u30a2\u30ea\u30f3\u30b0\u3059\u308b\u3002<\/li>\n<\/ul>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h2>\n\n\n\n<p>\u4eca\u56de\u306f iPhone \u30a2\u30d7\u30ea\u3068 Apple Watch \u30a2\u30d7\u30ea\u3092\u30bb\u30c3\u30c8\u3067\u65b0\u898f\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Xcode \u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u65b0\u898f\u4f5c\u6210\u30a6\u30a3\u30b6\u30fc\u30c9\u3067\u4ee5\u4e0b\u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Platform: watchOS<\/li>\n\n\n\n<li>Application: App<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_1-1024x728.png\" alt=\"\" class=\"wp-image-1065\" width=\"496\" height=\"352\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_1-1024x728.png 1024w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_1-300x213.png 300w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_1-768x546.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_1.png 1444w\" sizes=\"auto, (max-width: 496px) 100vw, 496px\" \/><\/figure>\n\n\n\n<p>Product Name\u3001Organization Identifer \u3092\u5165\u529b\u3057\u3001 Watch App with New Companion iOS App \u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_2-1024x725.png\" alt=\"\" class=\"wp-image-1066\" width=\"497\" height=\"351\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_2-1024x725.png 1024w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_2-300x212.png 300w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_2-768x544.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_2.png 1444w\" sizes=\"auto, (max-width: 497px) 100vw, 497px\" \/><\/figure>\n\n\n\n<p>iPhone \u30a2\u30d7\u30ea\u3068 Apple Watch \u30a2\u30d7\u30ea\u304c\u30da\u30a2\u306b\u306a\u3063\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-1024x679.png\" alt=\"\" class=\"wp-image-1067\" width=\"716\" height=\"474\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-1024x679.png 1024w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-300x199.png 300w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-768x509.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-1536x1019.png 1536w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_3-2048x1358.png 2048w\" sizes=\"auto, (max-width: 716px) 100vw, 716px\" \/><\/figure>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">2. Watch Connectivity\u306e\u521d\u671f\u5316<\/h2>\n\n\n\n<p>\u307e\u305a\u306f Watch Connectivity \u3067\u306e\u901a\u4fe1\u304c\u53ef\u80fd\u306a\u72b6\u614b\u306b\u3057\u3066\u3044\u304d\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WCSession \u3092\u4f5c\u6210\u3059\u308b<\/li>\n\n\n\n<li>WCSessionDelegate \u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>WCSession.activate() \u3092\u547c\u3076<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>WCSessionDelegate \u306e\u5b9f\u88c5\u3082\u542b\u3081\u3066 iPhone \u5074\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<br>\uff08\u3053\u3053\u3067\u306f ViewModel \u306b\u5b9f\u88c5\u3057\u307e\u3057\u305f\u3002\uff09<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>import WatchConnectivity\n\nfinal class PhoneContentViewModel: NSObject, ObservableObject {\n\n    private let session: WCSession\n\n    init(session: WCSession = .default) {\n        self.session = session\n        super.init()\n        self.session.delegate = self\n        self.session.activate()\n    }\n}\n\nextension PhoneContentViewModel: WCSessionDelegate {\n    \n    func sessionDidBecomeInactive(_ session: WCSession) {\n        \n    }\n    \n    func sessionDidDeactivate(_ session: WCSession) {\n        \n    }\n    \n    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {\n        \n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p>Apple Watch\u5074\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3067\u3059\u3002\u307b\u3068\u3093\u3069\u540c\u3058\u3067\u3059\u304c\u3001<code>sessionDidBecomeInactive(_ session: WCSession)<\/code> , <code>sessionDidDeactivate(_ session: WCSession)<\/code> \u306f iPhone \u5c02\u7528\u30e1\u30bd\u30c3\u30c9\u306a\u306e\u3067\u5b9f\u88c5\u4e0d\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>import WatchConnectivity\n\nfinal class WatchContentViewModel: NSObject, ObservableObject {\n\n    private let session: WCSession\n\n    init(session: WCSession = .default) {\n        self.session = session\n        super.init()\n        self.session.delegate = self\n        self.session.activate()\n    }\n}\n\nextension WatchContentViewModel: WCSessionDelegate {\n    \n    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {\n        \n    }\n}<\/code><\/pre><\/div>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u30ab\u30a6\u30f3\u30bf\u30fc\u753b\u9762\u4f5c\u6210<\/h2>\n\n\n\n<p>\u4eca\u56de\u306f iPhone \u30fb Apple Watch \u5171\u306b\u3001\u30ab\u30a6\u30f3\u30c8\u5897\u6e1b\u30dc\u30bf\u30f3\u3068\u5024\u8868\u793a\u306e\u307f\u306e\u30b7\u30f3\u30d7\u30eb\u306a\u753b\u9762\u3068\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u306f iPhone \u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3067\u3059\u3002Apple Watch \u306f PhoneContentViewModel \u3092 WatchContentViewModel \u306b\u7f6e\u304d\u63db\u3048\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>import SwiftUI\n\nstruct ContentView: View {\n    \n    @ObservedObject private var viewModel =  PhoneContentViewModel()\n    \n    var body: some View {\n        VStack {\n            Button(action: {\n                viewModel.countup()\n            }) {\n                Image(systemName: &quot;arrowtriangle.up.circle.fill&quot;)\n                    .resizable()\n                    .scaledToFit()\n                    .frame(width: 80.0, height: 80.0)\n                    .foregroundColor(.pink)\n            }\n            .buttonStyle(.plain)\n            Text(String(Int(viewModel.counter)))\n                .font(.system(size: 64.0))\n                .bold()\n            Button(action: {\n                viewModel.countdown()\n            }) {\n                Image(systemName: &quot;arrowtriangle.down.circle.fill&quot;)\n                    .resizable()\n                    .scaledToFit()\n                    .frame(width: 80.0, height: 80.0)\n                    .foregroundColor(.blue)\n            }\n            .buttonStyle(.plain)\n        }\n        .padding()\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_4-834x1024.png\" alt=\"\" class=\"wp-image-1068\" width=\"417\" height=\"512\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_4-834x1024.png 834w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_4-244x300.png 244w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_4-768x943.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_4.png 1218w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5-833x1024.png\" alt=\"\" class=\"wp-image-1069\" width=\"417\" height=\"512\" srcset=\"https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5-833x1024.png 833w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5-244x300.png 244w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5-768x944.png 768w, https:\/\/www.avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5.png 1216w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<p>\u30ab\u30a6\u30f3\u30c8\u30c7\u30fc\u30bf\u3068\u5897\u6e1b\u51e6\u7406\u306fViewModel\u306b\u5b9f\u88c5\u3057\u307e\u3059\u3002\u3053\u308c\u3082 iPhone \u30fb Apple Watch \u5171\u901a\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>final class PhoneContentViewModel: NSObject, ObservableObject {\n\n    ...\n\n    @Published var counter = 0\n    \n    func countup() {\n        counter += 1\n    }\n    \n    func countdown() {\n        counter -= 1\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u3053\u308c\u3067 iPhone \u30fb Apple Watch \u305d\u308c\u305e\u308c\u306e\u30ab\u30a6\u30f3\u30bf\u30fc\u306e\u5024\u3092\u5909\u66f4\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u7d9a\u3044\u3066\u30ab\u30a6\u30f3\u30bf\u30fc\u5024\u3092\u76f8\u624b\u306b\u9001\u4fe1\u3059\u308b\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">4. \u30c7\u30fc\u30bf\u9001\u4fe1<\/h2>\n\n\n\n<p>Watch Connectivity \u306e\u9001\u4fe1\u30e1\u30bd\u30c3\u30c9\u306f\u3044\u304f\u3064\u304b\u3042\u308a\u307e\u3059\u304c\u3001\u4eca\u56de\u306f <code>sendMessage(_:replyHandler:errorHandler:)<\/code> \u3068 <code>transferUserInfo(_:)<\/code> \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>2\u3064\u306e\u30e1\u30bd\u30c3\u30c9\u306e\u4e3b\u306a\u9055\u3044\u306f\u3001 <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sendMessage \u306f\u5373\u6642\u9001\u4fe1\u3055\u308c\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u5fdc\u7b54\u3084\u30a8\u30e9\u30fc\u3092\u53d7\u3051\u53d6\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u304c\u3001\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u9001\u4fe1\u306f\u975e\u5bfe\u5fdc\u3067\u3059\u3002<\/li>\n\n\n\n<li>transferUserInfo \u306f\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u9001\u4fe1\u5bfe\u5fdc\u3067\u3001\u9001\u4fe1\u30c7\u30fc\u30bf\u306f\u30ad\u30e5\u30fc\u306b\u5165\u308c\u3089\u308c\u3001\u9001\u4fe1\u53ef\u80fd\u306b\u306a\u3063\u305f\u6642\u70b9\u3067\u9001\u4ed8\u3055\u308c\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Apple Watch \u306f\u3057\u3070\u3089\u304f\u64cd\u4f5c\u3057\u3066\u3044\u306a\u3044\u3068\u4e00\u6642\u7684\u306b\u901a\u4fe1\u4e0d\u80fd\u306a\u72b6\u614b\u306b\u306a\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u306e\u3067\u3001\u4eca\u56de\u306f iPhone \u304b\u3089 Apple Watch \u3078\u306e\u9001\u4fe1\u306f transferUserInfo \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>Apple Watch \u304b\u3089 iPhone \u3078\u306e\u9001\u4fe1\u306f\u3001 \u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\u306b\u3088\u308b\u3068 Apple Watch \u304b\u3089\u306e sendMessage \u3067 iPhone \u30a2\u30d7\u30ea\u304c\u901a\u4fe1\u53ef\u80fd\u306a\u72b6\u614b\u306b\u306a\u308b\u3068\u306e\u3053\u3068\u306a\u306e\u3067\u3001  sendMessage \u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u3067\u306f\u3001\u30a2\u30d7\u30ea\u306e\u4ed5\u69d8\u306b\u3088\u3063\u3066\u9069\u5207\u306a\u9001\u4fe1\u30e1\u30bd\u30c3\u30c9\u306f\u5909\u308f\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>iPhone\u306e\u9001\u53d7\u4fe1\u51e6\u7406\u3067\u3059\u3002 \u9001\u4fe1\u30c7\u30fc\u30bf\u578b\u306f <code>[String : Any]<\/code> \u578b\u306eDictionary\u306b\u306a\u308a\u307e\u3059\u3002<br>\uff08transferUserInfo \u306f\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u306f\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u306e\u3067\u3054\u6ce8\u610f\u304f\u3060\u3055\u3044\u3002\uff09<\/p>\n\n\n\n<p>\u307e\u305f\u3001  WCSessionDelegate \u306e sendMessage \u53d7\u4fe1\u7528\u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u88c5\u3057\u3001\u53d7\u3051\u53d6\u3063\u305f\u5024\u3067\u30ab\u30a6\u30f3\u30bf\u30fc\u5024\u3092\u66f4\u65b0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>final class PhoneContentViewModel: NSObject, ObservableObject {\n\n    ...\n    \n    func countup() {\n        counter += 1\n        send(count: counter)\n    }\n    \n    func countdown() {\n        counter -= 1\n        send(count: counter)\n    }\n    \n    \/\/\/\n    \/\/\/ \u30ab\u30a6\u30f3\u30c8\u3092\u9001\u4fe1\n    \/\/\/ - Parameter count: \u30ab\u30a6\u30f3\u30bf\u306e\u5024\n    \/\/\/ - Warning: \u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u306e\u5b9f\u884c\u306f\u4e0d\u53ef\n    \/\/\/\n    func send(count: Int) {\n        guard session.activationState == .activated else {\n            print(&quot;Sending method can only be called while the session is active.&quot;)\n            return\n        }\n\n        Task.detached(priority: .medium) { [self] in\n            let userInfo = [\n                &quot;count&quot; : count\n            ] as [String : Any]\n            \n            session.transferUserInfo(userInfo)\n        }\n    }\n}\n\nextension PhoneContentViewModel: WCSessionDelegate {\n    \n    ...\n    \n    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {\n        Task { @MainActor in\n            if let value = message[&quot;count&quot;] as? Int {\n                counter = value\n            }\n        }\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<p>\u7d9a\u3044\u3066Apple Watch\u306e\u9001\u4fe1\u51e6\u7406\u3067\u3059\u3002\u4f3c\u3066\u3044\u307e\u3059\u306d\u3002<br>WCSessionDelegate \u306e\u53d7\u4fe1\u30e1\u30bd\u30c3\u30c9\u306f transferUserInfo \u7528\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>final class WatchContentViewModel: NSObject, ObservableObject {\n\n    ...\n    \n    func countup() {\n        counter += 1\n        sendImmediately(count: counter)\n    }\n    \n    func countdown() {\n        counter -= 1\n        sendImmediately(count: counter)\n    }\n    \n    \n    \/\/\/\n    \/\/\/ \u76f4\u3061\u306b\u30ab\u30a6\u30f3\u30c8\u3092\u9001\u4fe1\n    \/\/\/ - Parameter count: \u30ab\u30a6\u30f3\u30bf\u306e\u5024\n    \/\/\/\n    func sendImmediately(count: Int) {\n        guard session.activationState == .activated else {\n            print(&quot;Sending method can only be called while the session is active.&quot;)\n            return\n        }\n        \n        Task.detached(priority: .medium) { [self] in\n            let message = [\n                &quot;count&quot; : count\n            ] as [String : Any]\n            \n            self.session.sendMessage(message, replyHandler: nil) { error in\n                print(error)\n            }\n        }\n    }\n}\n\nextension WatchContentViewModel: WCSessionDelegate {\n    \n    ...\n    \n    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {\n        Task { @MainActor in\n            if let value = userInfo[&quot;count&quot;] as? Int {\n                counter = value\n            }\n        }\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">5. \u52d5\u4f5c\u78ba\u8a8d<\/h2>\n\n\n\n<p>\u4ee5\u4e0a\u3067\u5b9f\u88c5\u306f\u5b8c\u4e86\u3067\u3059\u3002<br>\u5b9f\u969b\u306b\u52d5\u304b\u3059\u3068\u3001\u4ee5\u4e0b\u306e\u52d5\u753b\u306e\u3088\u3046\u306b iPhone \u3068 Apple Watch \u3067\u30ab\u30a6\u30f3\u30bf\u30fc\u306e\u5024\u3092\u9023\u52d5\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\uff08Apple Watch\u5074\u306e\u5024\u304c\u5909\u308f\u3089\u306a\u3044\u5834\u5408\u3001\u4e00\u6642\u7684\u306b\u901a\u4fe1\u4e0d\u80fd\u306b\u306a\u3063\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002Apple Watch \u306e\u753b\u9762\u3092\u30bf\u30c3\u30d7\u3057\u3066\u518d\u5ea6\u8a66\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\uff09<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:60%\">\n<figure class=\"wp-block-video\"><video controls muted src=\"https:\/\/avancesys.co.jp\/laboratory\/wp-content\/uploads\/2023\/08\/AW_5_540p.mp4\" playsinline><\/video><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:40%\"><\/div>\n<\/div>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-pullquote has-border-color has-vivid-cyan-blue-border-color\"><blockquote><p>\u307e\u3068\u3081<\/p><\/blockquote><\/figure>\n\n\n\n<p>Watch Connectivity \u3092\u4f7f\u3063\u3066 iPhone \u3068 Apple Watch \u306e\u53cc\u65b9\u5411\u901a\u4fe1\u3092\u5b9f\u88c5\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u8aac\u660e\u306e\u9014\u4e2d\u3067\u300cApple Watch \u304c\u4e00\u6642\u7684\u306b\u901a\u4fe1\u4e0d\u80fd\u306b\u306a\u308b\u300d\u3068\u3044\u3046\u8a71\u304c\u3042\u3063\u305f\u3088\u3046\u306b\u3001\u5b9f\u969b\u306b Apple Watch \u30a2\u30d7\u30ea\u3092\u958b\u767a\u3059\u308b\u3068\u5c11\u3057\u52d5\u4f5c\u306b\u30af\u30bb\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u4eca\u56de\u306e\u5185\u5bb9\u3092\u5fdc\u7528\u3059\u308c\u3070 Apple Watch \u306e\u30bb\u30f3\u30b5\u30fc\u3092\u4f7f\u3063\u305f\u52d5\u4f5c\u8a08\u6e2c\u3084\u3001U1\u30c1\u30c3\u30d7\u3092\u4f7f\u3063\u305f\u4f4d\u7f6e\u6e2c\u5b9a\u306a\u3069\u3082\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"author":27,"featured_media":1074,"template":"","lc":[12],"lt":[16,15],"class_list":["post-1064","article","type-article","status-publish","has-post-thumbnail","hentry","lc-introduction","lt-iot","lt-smartdevice"],"_links":{"self":[{"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/article\/1064","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/users\/27"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/media\/1074"}],"wp:attachment":[{"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/media?parent=1064"}],"wp:term":[{"taxonomy":"lc","embeddable":true,"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/lc?post=1064"},{"taxonomy":"lt","embeddable":true,"href":"https:\/\/www.avancesys.co.jp\/laboratory\/wp-json\/wp\/v2\/lt?post=1064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}