1
1
import * as path from "path" ;
2
+ import { NativeTargetServiceBase } from "./ios-native-target-service-base" ;
2
3
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 ) ;
7
9
}
8
10
9
- public async addExtensionsFromPath ( { extensionsFolderPath , projectData, platformData, pbxProjPath} : IAddExtensionsFromPathOptions ) : Promise < boolean > {
11
+ public async addWatchAppFromPath ( { watchAppFolderPath , projectData, platformData, pbxProjPath} : IAddWatchAppFromPathOptions ) : Promise < boolean > {
10
12
const targetUuids : string [ ] = [ ] ;
11
13
let addedExtensions = false ;
12
- if ( ! this . $fs . exists ( extensionsFolderPath ) ) {
14
+ if ( ! this . $fs . exists ( watchAppFolderPath ) ) {
13
15
return false ;
14
16
}
15
17
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" ) ;
18
20
project . parseSync ( ) ;
19
21
const appFolder = this . $fs . readDirectory ( appPath )
20
22
. filter ( fileName => {
@@ -32,84 +34,42 @@ export class IOSWatchAppService implements IIOSExtensionsService {
32
34
return stats . isDirectory ( ) && ! fileName . startsWith ( "." ) ;
33
35
} ) [ 0 ] ;
34
36
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 ;
40
44
41
45
this . $fs . writeFile ( pbxProjPath , project . writeSync ( { omitEmptyValues : true } ) ) ;
42
- this . prepareExtensionSigning ( targetUuids , projectData , pbxProjPath ) ;
46
+ this . prepareSigning ( targetUuids , projectData , pbxProjPath ) ;
43
47
44
48
return addedExtensions ;
45
49
}
46
50
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 ) {
71
52
const identifierParts = identifier . split ( "." ) ;
72
53
identifierParts . pop ( ) ;
73
54
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 ) ;
107
66
}
108
67
109
- public removeExtensions ( { pbxProjPath} : IRemoveExtensionsOptions ) : void {
68
+ public removeWatchApp ( { pbxProjPath} : IRemoveWatchAppOptions ) : void {
110
69
const project = new this . $xcode . project ( pbxProjPath ) ;
111
70
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" ) ;
113
73
this . $fs . writeFile ( pbxProjPath , project . writeSync ( { omitEmptyValues : true } ) ) ;
114
74
}
115
75
}
0 commit comments