Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/bootstrap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ $injector.require("iOSExtensionsService", "./services/ios-extensions-service");
$injector.require("iOSProjectService", "./services/ios-project-service");
$injector.require("iOSProvisionService", "./services/ios-provision-service");
$injector.require("xcconfigService", "./services/xcconfig-service");
$injector.require("iOSSigningService", "./services/ios/ios-signing-service");
$injector.require("xcodebuildArgsService", "./services/ios/xcodebuild-args-service");
$injector.require("xcodebuildCommandService", "./services/ios/xcodebuild-command-service");
$injector.require("xcodebuildService", "./services/ios/xcodebuild-service");
$injector.require("exportOptionsPlistService", "./services/ios/export-options-plist-service");

$injector.require("cocoapodsService", "./services/cocoapods-service");
$injector.require("cocoaPodsPlatformManager", "./services/cocoapods-platform-manager");
Expand Down
39 changes: 17 additions & 22 deletions lib/commands/appstore-upload.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { StringCommandParameter } from "../common/command-params";
import * as path from "path";
import { IOSProjectService } from "../services/ios-project-service";
import { StringCommandParameter } from "../common/command-params";

export class PublishIOS implements ICommand {
public allowedParameters: ICommandParameter[] = [new StringCommandParameter(this.$injector), new StringCommandParameter(this.$injector),
Expand All @@ -13,7 +12,8 @@ export class PublishIOS implements ICommand {
private $projectData: IProjectData,
private $options: IOptions,
private $prompter: IPrompter,
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants) {
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
private $xcodebuildService: IXcodebuildService) {
this.$projectData.initializeProjectData();
}

Expand All @@ -32,7 +32,6 @@ export class PublishIOS implements ICommand {
let password = args[1];
const mobileProvisionIdentifier = args[2];
const codeSignIdentity = args[3];
const teamID = this.$options.teamId;
let ipaFilePath = this.$options.ipa ? path.resolve(this.$options.ipa) : null;

if (!username) {
Expand Down Expand Up @@ -68,35 +67,31 @@ export class PublishIOS implements ICommand {
config: this.$options,
env: this.$options.env
};
const buildConfig: IBuildConfig = {
projectDir: this.$options.path,
release: this.$options.release,
device: this.$options.device,
provision: this.$options.provision,
teamId: this.$options.teamId,
buildForDevice: true,
iCloudContainerEnvironment: this.$options.iCloudContainerEnvironment,
mobileProvisionIdentifier,
codeSignIdentity
};

if (mobileProvisionIdentifier || codeSignIdentity) {
const iOSBuildConfig: IBuildConfig = {
projectDir: this.$options.path,
release: this.$options.release,
device: this.$options.device,
provision: this.$options.provision,
teamId: this.$options.teamId,
buildForDevice: true,
iCloudContainerEnvironment: this.$options.iCloudContainerEnvironment,
mobileProvisionIdentifier,
codeSignIdentity
};
this.$logger.info("Building .ipa with the selected mobile provision and/or certificate.");
// This is not very correct as if we build multiple targets we will try to sign all of them using the signing identity here.
await this.$platformService.preparePlatform(platformInfo);
await this.$platformService.buildPlatform(platform, iOSBuildConfig, this.$projectData);
ipaFilePath = this.$platformService.lastOutputPath(platform, iOSBuildConfig, this.$projectData);
await this.$platformService.buildPlatform(platform, buildConfig, this.$projectData);
ipaFilePath = this.$platformService.lastOutputPath(platform, buildConfig, this.$projectData);
} else {
this.$logger.info("No .ipa, mobile provision or certificate set. Perfect! Now we'll build .xcarchive and let Xcode pick the distribution certificate and provisioning profile for you when exporting .ipa for AppStore submission.");
await this.$platformService.preparePlatform(platformInfo);

const platformData = this.$platformsData.getPlatformData(platform, this.$projectData);
const iOSProjectService = <IOSProjectService>platformData.platformProjectService;

const archivePath = await iOSProjectService.archive(this.$projectData);
this.$logger.info("Archive at: " + archivePath);

const exportPath = await iOSProjectService.exportArchive(this.$projectData, { archivePath, teamID, provision: mobileProvisionIdentifier || this.$options.provision });
const exportPath = await this.$xcodebuildService.buildForAppStore(platformData, this.$projectData, buildConfig);
this.$logger.info("Export at: " + exportPath);

ipaFilePath = exportPath;
Expand Down
3 changes: 3 additions & 0 deletions lib/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@ class ItunesConnectApplicationTypesClass implements IiTunesConnectApplicationTyp
public Mac = "Mac OS X App";
}

export const iOSAppResourcesFolderName = "iOS";
export const androidAppResourcesFolderName = "Android";

export const ItunesConnectApplicationTypes = new ItunesConnectApplicationTypesClass();
export const VUE_NAME = "vue";
export const ANGULAR_NAME = "angular";
Expand Down
4 changes: 2 additions & 2 deletions lib/declarations.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -841,10 +841,10 @@ interface IXcprojService {
/**
* Returns the path to the xcodeproj file
* @param projectData Information about the project.
* @param platformData Information about the platform.
* @param projectRoot The root folder of native project.
* @return {string} The full path to the xcodeproj
*/
getXcodeprojPath(projectData: IProjectData, platformData: IPlatformData): string;
getXcodeprojPath(projectData: IProjectData, projectRoot: string): string;
/**
* Checks whether the system needs xcproj to execute ios builds successfully.
* In case the system does need xcproj but does not have it, prints an error message.
Expand Down
6 changes: 3 additions & 3 deletions lib/definitions/project.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -446,15 +446,15 @@ interface IPlatformProjectService extends NodeJS.EventEmitter, IPlatformProjectS
* @param {IPlatformData} platformData The data for the specified platform.
* @returns {void}
*/
stopServices(platformData: IPlatformData): Promise<ISpawnResult>;
stopServices?(projectRoot: string): Promise<ISpawnResult>;

/**
* Removes build artifacts specific to the platform
* @param {string} projectRoot The root directory of the native project.
* @param {IProjectData} projectData DTO with information about the project.
* @returns {void}
*/
cleanProject(projectRoot: string, projectData: IProjectData): Promise<void>
cleanProject?(projectRoot: string, projectData: IProjectData): Promise<void>

/**
* Check the current state of the project, and validate against the options.
Expand All @@ -466,7 +466,7 @@ interface IPlatformProjectService extends NodeJS.EventEmitter, IPlatformProjectS
* Get the deployment target's version
* Currently implemented only for iOS -> returns the value of IPHONEOS_DEPLOYMENT_TARGET property from xcconfig file
*/
getDeploymentTarget(projectData: IProjectData): any;
getDeploymentTarget?(projectData: IProjectData): any;
}

interface IValidatePlatformOutput {
Expand Down
157 changes: 98 additions & 59 deletions lib/definitions/xcode.d.ts
Original file line number Diff line number Diff line change
@@ -1,61 +1,100 @@
declare module "nativescript-dev-xcode" {
interface Options {
[key: string]: any;

customFramework?: boolean;
embed?: boolean;
relativePath?: string;
}

class project {
constructor(filename: string);

parse(callback: () => void): void;
parseSync(): void;

writeSync(options: any): string;

addFramework(filepath: string, options?: Options): void;
removeFramework(filePath: string, options?: Options): void;

addPbxGroup(filePathsArray: any[], name: string, path: string, sourceTree: string): void;

removePbxGroup(groupName: string, path: string): void;

addToHeaderSearchPaths(options?: Options): void;
removeFromHeaderSearchPaths(options?: Options): void;
updateBuildProperty(key: string, value: any): void;

pbxXCBuildConfigurationSection(): any;

addTarget(targetName: string, targetType: string, targetPath?: string): target;
addBuildPhase(filePathsArray: string[],
buildPhaseType: string,
comment: string,
target?: string,
optionsOrFolderType?: Object|string,
subfolderPath?: string
): any;
addToBuildSettings(buildSetting: string, value: any, targetUuid?: string): void;
addPbxGroup(
filePathsArray: string[],
name: string,
path: string,
sourceTree: string,
opt: {filesRelativeToProject?: boolean, target?: string, uuid?: string, isMain?: boolean }
): group;
addBuildProperty(prop: string, value: any, build_name?: string, productName?: string): void;
addToHeaderSearchPaths(file: string|Object, productName?: string): void;
removeTargetsByProductType(targetType: string): void
}

class target {
uuid: string;
pbxNativeTarget: {productName: string}
}

class group {
uuid: string;
pbxGroup: Object;
}
interface Options {
[key: string]: any;

customFramework?: boolean;
embed?: boolean;
relativePath?: string;
}

class project {
constructor(filename: string);

parse(callback: () => void): void;
parseSync(): void;

writeSync(options: any): string;

addFramework(filepath: string, options?: Options): void;
removeFramework(filePath: string, options?: Options): void;

addPbxGroup(filePathsArray: any[], name: string, path: string, sourceTree: string): void;

removePbxGroup(groupName: string, path: string): void;

addToHeaderSearchPaths(options?: Options): void;
removeFromHeaderSearchPaths(options?: Options): void;
updateBuildProperty(key: string, value: any): void;

pbxXCBuildConfigurationSection(): any;

addTarget(targetName: string, targetType: string, targetPath?: string): target;
addBuildPhase(filePathsArray: string[],
buildPhaseType: string,
comment: string,
target?: string,
optionsOrFolderType?: Object|string,
subfolderPath?: string
): any;
addToBuildSettings(buildSetting: string, value: any, targetUuid?: string): void;
addPbxGroup(
filePathsArray: string[],
name: string,
path: string,
sourceTree: string,
opt: {filesRelativeToProject?: boolean, target?: string, uuid?: string, isMain?: boolean }
): group;
addBuildProperty(prop: string, value: any, build_name?: string, productName?: string): void;
addToHeaderSearchPaths(file: string|Object, productName?: string): void;
removeTargetsByProductType(targetType: string): void
}

class target {
uuid: string;
pbxNativeTarget: {productName: string}
}

class group {
uuid: string;
pbxGroup: Object;
}
}

interface IiOSSigningService {
setupSigningForDevice(projectRoot: string, projectData: IProjectData, buildConfig: IiOSBuildConfig): Promise<void>;
setupSigningFromTeam(projectRoot: string, projectData: IProjectData, teamId: string): Promise<void>;
setupSigningFromProvision(projectRoot: string, projectData: IProjectData, provision?: string, mobileProvisionData?: any): Promise<void>;
}

interface IXcodebuildService {
buildForSimulator(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<void>;
buildForDevice(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string>;
buildForAppStore(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string>;
}

interface IXcodebuildArgsService {
getBuildForSimulatorArgs(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string[]>;
getBuildForDeviceArgs(platformData: IPlatformData, projectData: IProjectData, buildConfig: IBuildConfig): Promise<string[]>;
}

interface IXcodebuildCommandService {
executeCommand(args: string[], options: IXcodebuildCommandOptions): Promise<ISpawnResult>;
}

interface IXcodebuildCommandOptions {
message?: string;
cwd: string;
stdio?: string;
spawnOptions?: any;
}

interface IExportOptionsPlistService {
createDevelopmentExportOptionsPlist(archivePath: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput;
createDistributionExportOptionsPlist(projectRoot: string, projectData: IProjectData, buildConfig: IBuildConfig): IExportOptionsPlistOutput;
Comment thread
Fatme marked this conversation as resolved.
}

interface IExportOptionsPlistOutput {
exportFileDir: string;
exportFilePath: string;
exportOptionsPlistFilePath: string;
}
4 changes: 2 additions & 2 deletions lib/services/android-project-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -348,9 +348,9 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
return nativescript && (nativescript.android || (nativescript.platforms && nativescript.platforms.android));
}

public async stopServices(platformData: IPlatformData): Promise<ISpawnResult> {
public async stopServices(projectRoot: string): Promise<ISpawnResult> {
const result = await this.$gradleCommandService.executeCommand(["--stop", "--quiet"], {
cwd: platformData.projectRoot,
cwd: projectRoot,
message: "Gradle stop services...",
stdio: "pipe"
});
Expand Down
Loading