11import * as path from "path" ;
2+ import { NativeTargetServiceBase } from "./ios-native-target-service-base" ;
23
3- export class IOSWatchAppService implements IIOSExtensionsService {
4- constructor ( private $fs : IFileSystem ,
5- private $pbxprojDomXcode : IPbxprojDomXcode ,
6- private $xcode : IXcode ) {
4+ export class IOSWatchAppService extends NativeTargetServiceBase implements IIOSWatchAppService {
5+ constructor ( protected $fs : IFileSystem ,
6+ protected $pbxprojDomXcode : IPbxprojDomXcode ,
7+ protected $xcode : IXcode ) {
8+ super ( $fs , $pbxprojDomXcode , $xcode ) ;
79 }
810
9- public async addExtensionsFromPath ( { extensionsFolderPath , projectData, platformData, pbxProjPath} : IAddExtensionsFromPathOptions ) : Promise < boolean > {
11+ public async addWatchAppFromPath ( { watchAppFolderPath , projectData, platformData, pbxProjPath} : IAddWatchAppFromPathOptions ) : Promise < boolean > {
1012 const targetUuids : string [ ] = [ ] ;
1113 let addedExtensions = false ;
12- if ( ! this . $fs . exists ( extensionsFolderPath ) ) {
14+ if ( ! this . $fs . exists ( watchAppFolderPath ) ) {
1315 return false ;
1416 }
1517 const project = new this . $xcode . project ( pbxProjPath ) ;
16- const appPath = path . join ( extensionsFolderPath , "watchapp" ) ;
17- const extensionPath = path . join ( extensionsFolderPath , "watchextension" ) ;
18+ const appPath = path . join ( watchAppFolderPath , "watchapp" ) ;
19+ const extensionPath = path . join ( watchAppFolderPath , "watchextension" ) ;
1820 project . parseSync ( ) ;
1921 const appFolder = this . $fs . readDirectory ( appPath )
2022 . filter ( fileName => {
@@ -32,84 +34,42 @@ export class IOSWatchAppService implements IIOSExtensionsService {
3234 return stats . isDirectory ( ) && ! fileName . startsWith ( "." ) ;
3335 } ) [ 0 ] ;
3436
35- let targetUuid = this . addExtensionToProject ( appPath , appFolder , project , projectData , platformData , "watch_app" , `${ projectData . projectIdentifiers . ios } .watchkitapp` , project . getFirstTarget ( ) . uuid ) ;
36- targetUuids . push ( targetUuid ) ;
37- targetUuid = this . addExtensionToProject ( extensionPath , extensionFolder , project , projectData , platformData , "watch_extension" , `${ projectData . projectIdentifiers . ios } .watchkitapp.watchkitextension` , targetUuid ) ;
38- targetUuids . push ( targetUuid ) ;
39- addedExtensions = true ;
37+ const watchApptarget = this . addTargetToProject ( appPath , appFolder , "watch_app" , project , platformData , project . getFirstTarget ( ) . uuid ) ;
38+ this . configureTarget ( appFolder , path . join ( appPath , appFolder ) , `${ projectData . projectIdentifiers . ios } .watchkitapp` , watchApptarget , project ) ;
39+ targetUuids . push ( watchApptarget . uuid ) ;
40+ const watchExtensionTarget = this . addTargetToProject ( extensionPath , extensionFolder , "watch_extension" , project , platformData , watchApptarget . uuid ) ;
41+ this . configureTarget ( extensionFolder , path . join ( extensionPath , extensionFolder ) , `${ projectData . projectIdentifiers . ios } .watchkitapp.watchkitextension` , watchExtensionTarget , project ) ;
42+ targetUuids . push ( watchExtensionTarget . uuid ) ;
43+ addedExtensions = true ;
4044
4145 this . $fs . writeFile ( pbxProjPath , project . writeSync ( { omitEmptyValues : true } ) ) ;
42- this . prepareExtensionSigning ( targetUuids , projectData , pbxProjPath ) ;
46+ this . prepareSigning ( targetUuids , projectData , pbxProjPath ) ;
4347
4448 return addedExtensions ;
4549 }
4650
47- private addExtensionToProject ( extensionsFolderPath : string , extensionFolder : string , project : IXcode . project , projectData : IProjectData , platformData : IPlatformData , targetType : string , identifier : string , parentTarget : string ) : string {
48- const extensionPath = path . join ( extensionsFolderPath , extensionFolder ) ;
49- const extensionRelativePath = path . relative ( platformData . projectRoot , extensionPath ) ;
50- const files = this . $fs . readDirectory ( extensionPath )
51- . filter ( filePath => ! filePath . startsWith ( "." ) )
52- . map ( filePath => path . join ( extensionPath , filePath ) ) ;
53- const target = project . addTarget ( extensionFolder , targetType , extensionRelativePath , parentTarget ) ;
54- project . addBuildPhase ( [ ] , 'PBXSourcesBuildPhase' , 'Sources' , target . uuid ) ;
55- project . addBuildPhase ( [ ] , 'PBXResourcesBuildPhase' , 'Resources' , target . uuid ) ;
56- project . addBuildPhase ( [ ] , 'PBXFrameworksBuildPhase' , 'Frameworks' , target . uuid ) ;
57-
58- const extJsonPath = path . join ( extensionsFolderPath , extensionFolder , "extension.json" ) ;
59- if ( this . $fs . exists ( extJsonPath ) ) {
60- const extensionJson = this . $fs . readJson ( extJsonPath ) ;
61- _ . forEach ( extensionJson . frameworks , framework => {
62- project . addFramework (
63- framework ,
64- { target : target . uuid }
65- ) ;
66- } ) ;
67- if ( extensionJson . assetcatalogCompilerAppiconName ) {
68- project . addToBuildSettings ( "ASSETCATALOG_COMPILER_APPICON_NAME" , extensionJson . assetcatalogCompilerAppiconName , target . uuid ) ;
69- }
70- }
51+ private configureTarget ( targetName : string , targetPath : string , identifier : string , target : IXcode . target , project : IXcode . project ) {
7152 const identifierParts = identifier . split ( "." ) ;
7253 identifierParts . pop ( ) ;
7354 const wkAppBundleIdentifier = identifierParts . join ( "." ) ;
74- project . addPbxGroup ( files , extensionFolder , extensionPath , null , { isMain : true , target : target . uuid , filesRelativeToProject : true } ) ;
75- project . addBuildProperty ( "PRODUCT_BUNDLE_IDENTIFIER" , identifier , "Debug" , extensionFolder ) ;
76- project . addBuildProperty ( "PRODUCT_BUNDLE_IDENTIFIER" , identifier , "Release" , extensionFolder ) ;
77- project . addBuildProperty ( "SDKROOT" , "watchos" , "Debug" , extensionFolder ) ;
78- project . addBuildProperty ( "SDKROOT" , "watchos" , "Release" , extensionFolder ) ;
79- project . addBuildProperty ( "TARGETED_DEVICE_FAMILY" , 4 , "Debug" , extensionFolder ) ;
80- project . addBuildProperty ( "TARGETED_DEVICE_FAMILY" , 4 , "Release" , extensionFolder ) ;
81- project . addBuildProperty ( "WATCHOS_DEPLOYMENT_TARGET" , 4.1 , "Debug" , extensionFolder ) ;
82- project . addBuildProperty ( "WATCHOS_DEPLOYMENT_TARGET" , 4.1 , "Release" , extensionFolder ) ;
83- project . addBuildProperty ( "WK_APP_BUNDLE_IDENTIFIER" , wkAppBundleIdentifier , "Debug" , extensionFolder ) ;
84- project . addBuildProperty ( "WK_APP_BUNDLE_IDENTIFIER" , wkAppBundleIdentifier , "Release" , extensionFolder ) ;
85- project . addToHeaderSearchPaths ( extensionPath , target . pbxNativeTarget . productName ) ;
86-
87- return target . uuid ;
88- }
89-
90- private prepareExtensionSigning ( targetUuids : string [ ] , projectData :IProjectData , projectPath : string ) {
91- const xcode = this . $pbxprojDomXcode . Xcode . open ( projectPath ) ;
92- const signing = xcode . getSigning ( projectData . projectName ) ;
93- if ( signing !== undefined ) {
94- _ . forEach ( targetUuids , targetUuid => {
95- if ( signing . style === "Automatic" ) {
96- xcode . setAutomaticSigningStyleByTargetKey ( targetUuid , signing . team ) ;
97- } else {
98- for ( const config in signing . configurations ) {
99- const signingConfiguration = signing . configurations [ config ] ;
100- xcode . setManualSigningStyleByTargetKey ( targetUuid , signingConfiguration ) ;
101- break ;
102- }
103- }
104- } ) ;
105- }
106- xcode . save ( ) ;
55+ project . addBuildProperty ( "PRODUCT_BUNDLE_IDENTIFIER" , identifier , "Debug" , targetName ) ;
56+ project . addBuildProperty ( "PRODUCT_BUNDLE_IDENTIFIER" , identifier , "Release" , targetName ) ;
57+ project . addBuildProperty ( "SDKROOT" , "watchos" , "Debug" , targetName ) ;
58+ project . addBuildProperty ( "SDKROOT" , "watchos" , "Release" , targetName ) ;
59+ project . addBuildProperty ( "TARGETED_DEVICE_FAMILY" , 4 , "Debug" , targetName ) ;
60+ project . addBuildProperty ( "TARGETED_DEVICE_FAMILY" , 4 , "Release" , targetName ) ;
61+ project . addBuildProperty ( "WATCHOS_DEPLOYMENT_TARGET" , 4.1 , "Debug" , targetName ) ;
62+ project . addBuildProperty ( "WATCHOS_DEPLOYMENT_TARGET" , 4.1 , "Release" , targetName ) ;
63+ project . addBuildProperty ( "WK_APP_BUNDLE_IDENTIFIER" , wkAppBundleIdentifier , "Debug" , targetName ) ;
64+ project . addBuildProperty ( "WK_APP_BUNDLE_IDENTIFIER" , wkAppBundleIdentifier , "Release" , targetName ) ;
65+ project . addToHeaderSearchPaths ( targetPath , target . pbxNativeTarget . productName ) ;
10766 }
10867
109- public removeExtensions ( { pbxProjPath} : IRemoveExtensionsOptions ) : void {
68+ public removeWatchApp ( { pbxProjPath} : IRemoveWatchAppOptions ) : void {
11069 const project = new this . $xcode . project ( pbxProjPath ) ;
11170 project . parseSync ( ) ;
112- project . removeTargetsByProductType ( "com.apple.product-type.app-extension" ) ;
71+ project . removeTargetsByProductType ( "com.apple.product-type.application.watchapp2" ) ;
72+ project . removeTargetsByProductType ( "com.apple.product-type.watchkit2-extension" ) ;
11373 this . $fs . writeFile ( pbxProjPath , project . writeSync ( { omitEmptyValues : true } ) ) ;
11474 }
11575}
0 commit comments