នៅខែមិថុនា ឆ្នាំ 2023 នៅពេលដែល Apple បានប្រកាស Vision Pro ខ្ញុំមានគំនិតមួយ ដែលអាចដំណើរការបានល្អនៅលើកាស - បណ្តុំនៃវីដេអូរង្វិលជុំដែលលេងជាមួយការប្រើប្រាស់ប្រចាំថ្ងៃរបស់អ្នក។ ខ្ញុំមានកម្មវិធីមួយដែលអាចធ្វើវាបានហើយដែលហៅថា Christmas Chill ជាអ្វីដែល ខ្ញុំបានបង្កើតឡើង នៅពេលដែល Apple TV ទី 1 ដែលគាំទ្រ App Store ត្រូវបានធ្វើឱ្យមាន។ វាមានលក្ខណៈពិសេសនៃបណ្តុំនៃវីដេអូរង្វិលជុំដែលអ្នកអាចប្រើជាផ្ទាំងខាងក្រោយនៃពិធីបុណ្យ។
ជារៀងរាល់ឆ្នាំក្នុងរដូវរងា ខ្ញុំចំណាយពេលពីរបីថ្ងៃដើម្បីកែលម្អវា បន្ថែមខ្លឹមសារថ្មី និងកែលម្អមូលដ្ឋានកូដ។ ការផ្លាស់ប្តូរដ៏ធំមួយដែលបានធ្វើឡើងចំពោះគម្រោងនេះបានកើតឡើងនៅក្នុងខែធ្នូ ឆ្នាំ 2023 នៅពេលដែល UI ត្រូវបានផ្លាស់ប្តូរពី UIKit និង Storyboards ទៅ SwiftUI ។
ជាការប្រសើរណាស់, ភាគច្រើនបានធ្វើចំណាកស្រុក។ ខ្ញុំត្រូវការទិដ្ឋភាពដែលគាំទ្រដោយ AVPlayer រុំក្នុង UIViewRepresentable ។ API ដ៏អស្ចារ្យដែលផ្តល់នូវអន្តរប្រតិបត្តិការរវាង UIKit និង SwiftUI ប្រសិនបើអ្នកត្រូវការ។
ខ្ញុំមានការស្ទាក់ស្ទើរក្នុងការធ្វើចំណាកស្រុកឱ្យបានឆាប់ ដោយសារខ្ញុំមានការយល់ដឹងល្អអំពី Declarative UI និងគោលគំនិតរបស់វាពីការងារផ្សេងទៀតជាមួយ React និង Jetpack Compose ។ វាបានផ្លាស់ប្តូរសម្រាប់ខ្ញុំជាមួយនឹងការណែនាំរបស់ Apple អំពី Apple Vision Pro និងការគាំទ្ររបស់វាសម្រាប់ SwiftUI ។ Christmas Chill គឺជាគម្រោងដ៏ល្អមួយក្នុងការរក្សាចំណេះដឹង Apple Dev របស់ខ្ញុំឱ្យទាន់សម័យ ហើយខ្ញុំពិតជាចង់ទទួលបានបទពិសោធន៍ក្នុងការពង្រីកកម្មវិធីទៅកាន់ឧបករណ៍ផ្សេងៗ។
នៅពេលដែលការធ្វើចំណាកស្រុកឆ្នាំ 2023 ទៅ SwiftUI សម្រាប់ Christmas Chill ត្រូវបានបញ្ចប់ ខ្ញុំបានកំណត់នៅឆ្នាំ 2024 ដើម្បីបន្ថែមការគាំទ្រសម្រាប់ Vision Pro ។ ខាងក្រោមនេះជារបៀបដែលខ្ញុំបាននិយាយអំពីវា និងអ្វីដែលខ្ញុំណែនាំ ប្រសិនបើអ្នកកំពុងព្យាយាមធ្វើដូចគ្នាសម្រាប់កម្មវិធីផ្ទាល់ខ្លួនរបស់អ្នក។
ដើម្បីចាប់ផ្តើម គម្រោងត្រូវតែអាចសាងសង់សម្រាប់ Vision Pro ជាគោលដៅ។ ការធ្វើបែបនេះគឺងាយស្រួលគួរឱ្យភ្ញាក់ផ្អើល! នៅខាងក្នុង Xcode ជ្រើសរើសឯកសារ .xcodeproj
ហើយនៅក្រោមបញ្ជីទម្លាក់ចុះ នៃទិសដៅដែលបានគាំទ្រ ចុចប៊ូតុងបូក។
ការទម្លាក់ចុះនៃវេទិកា Apple ដែលមានទាំងអស់លេចឡើង។ ដាក់លើវេទិកាដែលចង់បានដើម្បីបន្ថែមជាទិសដៅ ក្នុងករណីនេះ Apple Vision ហើយបន្ទាប់មកចុច Apple Vision នៅក្នុងផ្នែកដែលទើបនឹងបង្ហាញ។
ការលេចឡើងតូចមួយនឹងលេចឡើងដើម្បីជូនដំណឹងអ្នកអំពីការផ្លាស់ប្តូរ Xcode ត្រូវធ្វើដល់គោលដៅ។ ចុច បើក ។
បន្ទាប់មក បង្កើតកម្មវិធីដោយប្រើ visionOS Simulator។ ប្រសិនបើអ្នកមាន Vision Pro ដល់ដៃ អ្នកអាចស្វែងរកការណែនាំអំពីរបៀបដំឡើងវានៅលើឧបករណ៍របស់អ្នក នៅទីនេះ ។
ក្នុងអំឡុងពេលចងក្រង វាទំនងជា Xcode នឹងរកឃើញកំហុសក្នុងការចងក្រង ហើយ/ឬកម្មវិធីនឹងគាំង។ នេះត្រូវបានរំពឹងទុក និងជាការអនុវត្តក្នុងការអត់ធ្មត់។ ចាប់ពីចំណុចនេះ អ្នកត្រូវជួសជុលកំហុសក្នុងគម្រោងរបស់អ្នក រហូតដល់កម្មវិធីចងក្រង ហើយលែងគាំង។
ក្នុងករណីរបស់ខ្ញុំ វាចំណាយពេលប្រហែល 30 នាទី ដោយសារផ្នែកខ្លះនៃការខិតខំប្រឹងប្រែងក្នុងការផ្ទេរកម្មវិធីពី UIKit ទៅ SwiftUI ពីមុន!
SwiftUI ជាស្នូលរបស់វា គឺជាក្របខ័ណ្ឌពហុវេទិកា ដែលមានន័យថាគ្រាន់តែចងក្រងកូដ SwiftUI សម្រាប់វេទិកាផ្សេងគ្នា វានឹងផ្លាស់ប្តូររូបរាងរបស់វា។ ដោយគិតពីរចនាប័ទ្មវេទិកា និងវិធីសាស្រ្តផ្សេងៗនៃអន្តរកម្ម។
ខណៈពេលដែលវាជួយធ្វើឱ្យមានភាពជឿនលឿនក្នុងអំឡុងការអភិវឌ្ឍន៍ អ្នកប្រហែលជាចង់បានការគ្រប់គ្រងបន្ថែមទៀតលើរបៀបដែលកម្មវិធីលេចឡើង និងទាញយកអត្ថប្រយោជន៍ពីភាពខ្លាំងរបស់វេទិកានីមួយៗ។ ឧទាហរណ៍ដ៏ល្អមួយគឺសមត្ថភាព Vision Pro's Immersion; SwiftUI ផ្តល់ API សម្រាប់ការនេះតាមរយៈ ImmersiveSpace ដែលជា API មានសម្រាប់តែ visionOS ប៉ុណ្ណោះ។
ប្រសិនបើអ្នកព្យាយាមប្រើ API នេះ ខណៈពេលដែលកំពុងចងក្រងគម្រោងសម្រាប់ Apple TV នោះ Xcode នឹងបោះកំហុសដែលជូនដំណឹងថា API នេះមិនមានទេ។
ដូច្នេះ តើមានដំណោះស្រាយអ្វីដើម្បីបញ្ចៀសស្ថានភាពនេះ? ចម្លើយបានមកពីការប្រើប្រាស់ Conditional Compilation Blocks ។ ប្លុកចងក្រងគឺជាផ្នែកនៃកូដដែលផ្តល់ការណែនាំសម្រាប់ពេលដែលអ្នកចងក្រងគួរចងក្រងកូដនៅក្នុងប្លុក។
ខណៈពេលដែលពួកគេគាំទ្រលក្ខខណ្ឌផ្សេងៗ អត្ថប្រយោជន៍បំផុតសម្រាប់តម្រូវការរបស់យើងគឺការរកឃើញថាវេទិកាណាមួយដែលកូដកំពុងត្រូវបានចងក្រងសម្រាប់។ អ្នកអាចធ្វើវាបានដោយគ្រាន់តែបន្ទាត់កូដមួយចំនួនប៉ុណ្ណោះ៖
var body: some Scene { #if os(tvOS) WindowGroup { HStack { Text("I am running on tvOS!") } } #elseif os(visionOS) ImmersiveSpace(id: "MyImmersiveSpace") { } #endif }
មុខងារដ៏ល្អដែល Xcode ធ្វើដើម្បីគាំទ្រដល់ប្លុកចងក្រងតាមលក្ខខណ្ឌគឺត្រូវបញ្ជាក់ឱ្យច្បាស់ថាតើកូដណាមួយនឹងចងក្រងអាស្រ័យលើវេទិកាដែលបានជ្រើសរើសសម្រាប់ការចងក្រង។ វាក៏នឹងបន្ថយកូដបន្តិច ដែលនឹងមិនត្រូវបានគេចងក្រង។
ល្បិចដ៏មានប្រយោជន៍មួយបន្ថែមទៀតដែលខ្ញុំបានរកឃើញគឺការប្រើ ប្រភពចងក្រង និង ចម្លងធនធានបណ្តុំ បង្កើតដំណាក់កាលជាទម្រង់នៃការចាក់បញ្ចូលភាពអាស្រ័យ។ ដំណើរការទាំងនេះដំណើរការនៅពេលដែលកម្មវិធីត្រូវបានបង្កើត ហើយអាចរកបាននៅក្រោមផ្ទាំង Build Phases ក្នុងគម្រោង Xcode។
Compile Sources ធ្វើអោយការចងក្រងកូដប្រភពរបស់អ្នកទៅជាកូដម៉ាស៊ីន។ មិនថាវាជា Swift, Objective-C ឬសូម្បីតែ C/C++ ។
ចម្លងធនធានកញ្ចប់ ចម្លងធនធានដែលពាក់ព័ន្ធទាំងអស់សម្រាប់គោលដៅកម្មវិធីទៅក្នុង កញ្ចប់កម្មវិធី ។ ធុងនៃប្រភេទ សម្រាប់កូដ និងធនធានរបស់កម្មវិធីទាំងអស់ រួមទាំងរូបភាព វីដេអូ ខ្សែអក្សរដែលអាចបំប្លែងបាន និងច្រើនទៀត។
ដំណាក់កាលបង្កើតទាំងពីរនេះផ្តល់នូវភាពបត់បែនច្រើនដល់កម្មវិធី ដោយសារគោលដៅថ្មីនីមួយៗផ្តល់នូវដំណាក់កាលបង្កើតផ្ទាល់ខ្លួន រួមទាំងជំហានទាំងពីរខាងលើ។ កម្មវិធី Whitelabel ដែលផ្តល់មធ្យោបាយសម្រាប់អាជីវកម្មក្នុងការកំណត់មាតិការបស់ពួកគេតាមបំណងប្រើប្រាស់បច្ចេកទេសនេះ ក្នុងចំណោមកម្មវិធីផ្សេងទៀត។
អ្នកអាចរកឃើញថាអ្នកចង់ផ្តល់មាតិកាខុសៗគ្នាសម្រាប់កម្មវិធីផ្ទាល់ខ្លួនរបស់អ្នក អាស្រ័យលើវេទិកាដែលពួកគេដំណើរការ។ ចូរប្រើដំណាក់កាលបង្កើតទាំងនេះ ដើម្បីផលប្រយោជន៍របស់យើង ហើយផ្តល់ប្រភពខ្លឹមសារពីរផ្សេងគ្នាដើម្បីធ្វើវា។
ជាដំបូង សូមប្រើពិធីការ Swift ដើម្បីផ្តល់កិច្ចសន្យាដែលរំពឹងថានឹងបំពេញដោយរចនាសម្ព័ន្ធ ឬថ្នាក់។
protocol ContentManager { var content: [Content] { get } }
បន្ទាប់មក សូមក្រឡេកមើលអ្នកអនុវត្តពីរនៃពិធីការ។ នេះគឺជាទីមួយ៖
class TargetAppAContentManager : ContentManager { var content: [Content] { return [ Content(name: TargetAppAContentIdentifier.videoOneName.rawValue, image: TargetAppAImagePreviewIdentifier.videoOnePreview.rawValue, video: TargetAppAImageVideoIdentifier.videoOneVideo.rawValue), Content(name: TargetAppAContentIdentifier.videoTwoName.rawValue, image: TargetAppAImagePreviewIdentifier.videoTwoPreview.rawValue, video: TargetAppAImageVideoIdentifier.videoTwoVideo.rawValue), Content(name: TargetAppAContentIdentifier.videoThreeName.rawValue, image: TargetAppAImagePreviewIdentifier.videoThreePreview.rawValue, video: TargetAppAImageVideoIdentifier.videoThreeVideo.rawValue), ] return contentToShow } }
TargetAppAContentManager
គឺជាការអនុវត្តជាក់ស្តែងដែលប្រើសម្រាប់គោលដៅកម្មវិធីដំបូង។ វាផ្តល់នូវអារេនៃ Content
ដែលសំដៅលើឈ្មោះធនធានដែលរកឃើញនៅក្នុងកញ្ចប់កម្មវិធីសម្រាប់គោលដៅ។
class TargetAppBContentManager : ContentManager { var content: [Content] { return [ Content(name: TargetAppBContentIdentifier.videoOneName.rawValue, image: TargetAppBImagePreviewIdentifier.videoOnePreview.rawValue, video: TargetAppBImageVideoIdentifier.videoOneVideo.rawValue), Content(name: TargetAppBContentIdentifier.videoTwoName.rawValue, image: TargetAppBImagePreviewIdentifier.videoTwoPreview.rawValue, video: TargetAppBImageVideoIdentifier.videoTwoVideo.rawValue), Content(name: TargetAppBContentIdentifier.videoThreeName.rawValue, image: TargetAppBImagePreviewIdentifier.videoThreePreview.rawValue, video: TargetAppBImageVideoIdentifier.videoThreeVideo.rawValue), ] } }
បន្ទាប់គឺ TargetAppBContentManager
ដែលជាការអនុវត្តជាក់ស្តែងដែលប្រើសម្រាប់គោលដៅកម្មវិធីទីពីរ។ វាមើលទៅស្រដៀងនឹងការអនុវត្តដំបូង លើកលែងតែកម្មវិធី B ការកំណត់អត្តសញ្ញាណគឺខុសគ្នា។
ជាមួយនឹងការអនុវត្តទាំងពីរដែលបានបង្កើតឡើង ឥឡូវនេះអ្នកអាចយោងទៅពួកវាដោយប្រយោលនៅក្នុងកូដរបស់អ្នកដោយកំណត់ប្រភេទនៃវត្ថុទៅជា ContentManager
។ សូមពិនិត្យមើលឧទាហរណ៍ ViewModel ខាងក្រោម៖
@Observable class VideoListViewModel { var contentManager: ContentManager init(contentManager: ContentManager) { self.contentManager = contentManager } }
ViewModel រំពឹងថាប្រភេទ ContentManager
នឹងឆ្លងកាត់តាមរយៈកម្មវិធីចាប់ផ្តើមរបស់វា។ ViewModel អាចត្រូវបានឆ្លងកាត់ដោយប្រភេទនៃ ContentManager
និងបន្តដំណើរការដូចការរំពឹងទុក។ នេះក៏មានន័យថា ViewModel អាចត្រូវបានប្រើឡើងវិញនៅទូទាំងគោលដៅកម្មវិធីទាំងពីរ។
រឿងចុងក្រោយដែលត្រូវធ្វើគឺត្រូវធានាថា ContentManager ត្រឹមត្រូវត្រូវបានបន្ថែមទៅដំណាក់កាល Compile Sources។ ក្នុងករណីនេះ App A ត្រូវបានឆ្លងកាត់ TargetAppAContentMananger
ជាផ្នែកនៃប្រភពរបស់វា ហើយ App B ត្រូវបានឆ្លងកាត់ TargetAppBContentManager
។
កិច្ចការចុងក្រោយដែលត្រូវធ្វើគឺត្រូវធានាថា Bundle កម្មវិធីនីមួយៗមានធនធានដែលមានឈ្មោះដែលត្រូវគ្នានឹងគ្រឿងសម្គាល់ដែលប្រើដោយកម្មវិធី។ មធ្យោបាយងាយស្រួលគឺពិនិត្យមើលដំណាក់កាលបង្កើត Copy Bundle Resources
នៃគោលដៅកម្មវិធីនីមួយៗ និងធានាថាធនធានត្រូវបានបញ្ជូនទៅដោយអ្នកគ្រប់គ្រងមាតិកា។ បើមិនដូច្នោះទេអូសពួកវាពីគម្រោង Xcode របស់អ្នកទៅក្នុងដំណាក់កាលធនធានចម្លង។
វាត្រូវការពេលវេលា និងយកចិត្តទុកដាក់បន្តិចដើម្បីសាកល្បង ព្រោះថាអ្នកមិនទទួលបានកំហុសពេលចងក្រង ប្រសិនបើធនធានដែលសំដៅទៅមិនមាននៅក្នុងកញ្ចប់នោះ។ កំឡុងពេលដំណើរការ អ្នកនឹងជួបគ្រោះថ្នាក់!
មធ្យោបាយដ៏ល្អក្នុងការធ្វើការត្រួតពិនិត្យដោយស្វ័យប្រវត្តិគឺត្រូវសរសេរការធ្វើតេស្តឯកតាដើម្បីបញ្ជាក់ធនធានទាំងអស់ដែលត្រូវបានបញ្ជូនទៅដោយ ContentManager
ត្រូវបានរក្សាទុកក្នុងកញ្ចប់។ ប្រសិនបើការធ្វើតេស្តបរាជ័យនៅពេលដំណើរការ នោះអ្នកដឹងថាមានធនធានដែលបាត់នៅក្នុងកញ្ចប់។
ប្រសិនបើអ្នកបានមកដល់ពេលនេះ អ្នកគួរតែមានគំនិតល្អអំពីរបៀបនាំយកកម្មវិធីរបស់អ្នកទៅកាន់ Apple Platforms ផ្សេងទៀត។
ដើម្បីបញ្ចប់ការបង្ហោះនេះ ខ្ញុំនឹងទុកឱ្យអ្នកនូវគន្លឹះ និងធនធានមួយចំនួនដែលខ្ញុំណែនាំ៖
ប្រសិនបើបន្ថែមជំនួយ Apple Vision ទៅកម្មវិធីដែលមានស្រាប់ ជាដំបូង ផ្ទេរកូដរបស់អ្នកឱ្យបានច្រើនពី UIKit ទៅ SwiftUI តាមដែលអាចធ្វើបាន។ ដោយបានឃើញល្បឿននៃកម្មវិធីដែលមានស្រាប់ដែលកំពុងដំណើរការនៅលើ Vision Pro នៅពេលប្តូរទៅ SwiftUI វាមានប្រយោជន៍ក្នុងការពឹងផ្អែក។
សូមអានការណែនាំរបស់ Apple ក្នុង ការនាំយកកម្មវិធីដែលមានស្រាប់ទៅកាន់ visionOS ។ វាផ្តល់នូវការណែនាំ និងការណែនាំដ៏មានប្រយោជន៍អំពីរបៀបធ្វើវា និងរបៀបទាញយកអត្ថប្រយោជន៍ពីមុខងារ visionOS។
ប្រសិនបើអ្នកកំពុងគិតចង់ចាប់ផ្តើមកម្មវិធីពហុវេទិកាថ្មីដោយខ្លួនឯង មានផ្ទាំងពហុវេទិកាដែលមាននៅក្នុង Xcode ដែលផ្តល់នូវគំរូកម្មវិធីមួយចំនួនដែលត្រូវប្រើ។ វាក៏មាន វីដេអូពី WWDC 2022 ស្តីពីប្រធានបទផងដែរ។
ប្រសិនបើអ្នកចង់ឃើញឧទាហរណ៍នៃកម្មវិធីដែលដំណើរការលើវេទិកាជាច្រើន ខ្ញុំសូមណែនាំឱ្យពិនិត្យមើលកម្មវិធីផ្ទាល់ខ្លួនរបស់ខ្ញុំ Christmas Chill និង Ocean Chill ។ ទាំងនេះគឺជាកម្មវិធីពីរដែលដំណើរការលើ tvOS និង Vision Pro ដែលបង្កើតឡើងពីមូលដ្ឋានកូដតែមួយ។ (ការគាំទ្រ tvOS សម្រាប់ Ocean Chill នឹងមកដល់ឆាប់ៗនេះ!)