Skip to content

Commit d6d17c4

Browse files
FatmeFatme
authored andcommitted
Merge pull request #1396 from NativeScript/fatme/ios-fix-crashing-app
Fix crash when launching applications on iOS device in debug mode
2 parents 98a96fb + d7ec0dc commit d6d17c4

File tree

7 files changed

+92
-6
lines changed

7 files changed

+92
-6
lines changed

lib/definitions/project.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ interface IPlatformProjectServiceBase {
4949
interface IBuildConfig {
5050
runSbGenerator?: boolean;
5151
buildForDevice?: boolean;
52+
architectures?: string[];
5253
}
5354

5455
interface IPlatformProjectService {
@@ -59,6 +60,7 @@ interface IPlatformProjectService {
5960
interpolateConfigurationFile(configurationFilePath?: string): IFuture<void>;
6061
afterCreateProject(projectRoot: string): IFuture<void>;
6162
buildProject(projectRoot: string, buildConfig?: IBuildConfig): IFuture<void>;
63+
buildForDeploy(projectRoot: string, buildConfig?: IBuildConfig): IFuture<void>;
6264
prepareProject(): IFuture<void>;
6365
prepareAppResources(appResourcesDirectoryPath: string): IFuture<void>;
6466
isPlatformPrepared(projectRoot: string): IFuture<boolean>;

lib/services/android-project-service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ export class AndroidProjectService extends projectServiceBaseLib.PlatformProject
238238
}).future<void>()();
239239
}
240240

241+
public buildForDeploy(projectRoot: string, buildConfig?: IBuildConfig): IFuture<void> {
242+
return this.buildProject(projectRoot, buildConfig);
243+
}
244+
241245
public isPlatformPrepared(projectRoot: string): IFuture<boolean> {
242246
return this.$fs.exists(path.join(this.platformData.appDestinationDirectoryPath, constants.APP_FOLDER_NAME));
243247
}

lib/services/ios-project-service.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
3535
$projectDataService: IProjectDataService,
3636
private $prompter: IPrompter,
3737
private $config: IConfiguration,
38-
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants) {
38+
private $devicePlatformsConstants: Mobile.IDevicePlatformsConstants,
39+
private $devicesService: Mobile.IDevicesService,
40+
private $mobileHelper: Mobile.IMobileHelper) {
3941
super($fs, $projectData, $projectDataService);
4042
}
4143

@@ -177,12 +179,17 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
177179
let args: string[] = [];
178180
let buildForDevice = this.$options.forDevice || (buildConfig && buildConfig.buildForDevice);
179181
if (buildForDevice) {
182+
let defaultArchitectures = [
183+
'ARCHS=armv7 arm64',
184+
'VALID_ARCHS=armv7 arm64'
185+
];
186+
180187
args = basicArgs.concat([
181188
"-sdk", "iphoneos",
182-
'ARCHS=armv7 arm64',
183-
'VALID_ARCHS=armv7 arm64',
184189
"CONFIGURATION_BUILD_DIR=" + path.join(projectRoot, "build", "device")
185190
]);
191+
192+
args = args.concat((buildConfig && buildConfig.architectures) || defaultArchitectures);
186193
} else {
187194
args = basicArgs.concat([
188195
"-sdk", "iphonesimulator",
@@ -210,6 +217,29 @@ export class IOSProjectService extends projectServiceBaseLib.PlatformProjectServ
210217
}).future<void>()();
211218
}
212219

220+
public buildForDeploy(platform: string): IFuture<void> {
221+
if (this.$options.release) {
222+
return this.buildProject(this.platformData.projectRoot);
223+
}
224+
225+
let devicesArchitectures = _(this.$devicesService.getDeviceInstances())
226+
.filter(d => this.$mobileHelper.isiOSPlatform(d.deviceInfo.platform))
227+
.map(d => d.deviceInfo.activeArchitecture)
228+
.uniq()
229+
.value();
230+
231+
let architectures = [
232+
`ARCHS=${devicesArchitectures.join(" ")}`,
233+
`VALID_ARCHS=${devicesArchitectures.join(" ")}`
234+
];
235+
236+
if (devicesArchitectures.length > 1) {
237+
architectures.push('ONLY_ACTIVE_ARCH=NO');
238+
}
239+
240+
return this.buildProject(this.platformData.projectRoot, { architectures: architectures });
241+
}
242+
213243
public isPlatformPrepared(projectRoot: string): IFuture<boolean> {
214244
return this.$fs.exists(path.join(projectRoot, this.$projectData.projectName, constants.APP_FOLDER_NAME));
215245
}

lib/services/platform-service.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,19 @@ export class PlatformService implements IPlatformService {
306306
}).future<void>()();
307307
}
308308

309+
public buildForDeploy(platform: string, buildConfig?: IBuildConfig): IFuture<string> {
310+
return (() => {
311+
platform = platform.toLowerCase();
312+
if (!this.preparePlatform(platform).wait()) {
313+
this.$errors.failWithoutHelp("Verify that listed files are well-formed and try again the operation.");
314+
}
315+
316+
let platformData = this.$platformsData.getPlatformData(platform);
317+
platformData.platformProjectService.buildForDeploy(platformData.projectRoot, buildConfig).wait();
318+
this.$logger.out("Project successfully built");
319+
}).future<string>()();
320+
}
321+
309322
public copyLastOutput(platform: string, targetPath: string, settings: {isForDevice: boolean}): IFuture<void> {
310323
return (() => {
311324
let packageFile: string;
@@ -387,12 +400,12 @@ export class PlatformService implements IPlatformService {
387400
return (() => {
388401
if (!packageFile) {
389402
if (this.$devicesService.isiOSSimulator(device)) {
390-
this.buildPlatform(platform, buildConfig).wait();
403+
this.buildForDeploy(platform, buildConfig).wait();
391404
packageFile = this.getLatestApplicationPackageForEmulator(platformData).wait().packageName;
392405
} else {
393406
buildConfig = buildConfig || {};
394407
buildConfig.buildForDevice = true;
395-
this.buildPlatform(platform, buildConfig).wait();
408+
this.buildForDeploy(platform, buildConfig).wait();
396409
packageFile = this.getLatestApplicationPackageForDevice(platformData).wait().packageName;
397410
}
398411
}

test/ios-project-service.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,31 @@ import * as iOSProjectServiceLib from "../lib/services/ios-project-service";
1212
import * as LoggerLib from "../lib/common/logger";
1313
import * as OptionsLib from "../lib/options";
1414
import * as yok from "../lib/common/yok";
15+
import {DevicesService} from "../lib/common/mobile/mobile-core/devices-service";
16+
import {MobileHelper} from "../lib/common/mobile/mobile-helper";
17+
import {Messages} from "../lib/common/messages/messages";
18+
import {MobilePlatformsCapabilities} from "../lib/mobile-platforms-capabilities";
19+
import {DeviceLogProvider} from "../lib/common/mobile/device-log-provider";
20+
import {LogFilter} from "../lib/common/mobile/log-filter";
21+
import {LoggingLevels} from "../lib/common/mobile/logging-levels";
22+
import {DeviceDiscovery} from "../lib/common/mobile/mobile-core/device-discovery";
23+
import {IOSDeviceDiscovery} from "../lib/common/mobile/mobile-core/ios-device-discovery";
24+
import {AndroidDeviceDiscovery} from "../lib/common/mobile/mobile-core/android-device-discovery";
25+
import {Utils} from "../lib/common/utils";
1526
import { assert } from "chai";
1627
import temp = require("temp");
1728
temp.track();
1829

30+
class IOSSimulatorDiscoveryMock extends DeviceDiscovery {
31+
public startLookingForDevices(): IFuture<void> {
32+
return Future.fromResult();
33+
}
34+
35+
public checkForDevices(): IFuture<void> {
36+
return Future.fromResult();
37+
}
38+
}
39+
1940
function createTestInjector(projectPath: string, projectName: string): IInjector {
2041
let testInjector = new yok.Yok();
2142
testInjector.register("childProcess", ChildProcessLib.ChildProcess);
@@ -39,6 +60,19 @@ function createTestInjector(projectPath: string, projectName: string): IInjector
3960
testInjector.register("projectDataService", {});
4061
testInjector.register("prompter", {});
4162
testInjector.register("devicePlatformsConstants", { iOS: "iOS" });
63+
testInjector.register("devicesService", DevicesService);
64+
testInjector.register("iOSDeviceDiscovery", IOSDeviceDiscovery);
65+
testInjector.register("iOSSimulatorDiscovery", IOSSimulatorDiscoveryMock);
66+
testInjector.register("iOSSimResolver", {});
67+
testInjector.register("androidDeviceDiscovery", AndroidDeviceDiscovery);
68+
testInjector.register("messages", Messages);
69+
testInjector.register("mobileHelper", MobileHelper);
70+
testInjector.register("mobilePlatformsCapabilities", MobilePlatformsCapabilities);
71+
testInjector.register("deviceLogProvider", DeviceLogProvider);
72+
testInjector.register("logFilter", LogFilter);
73+
testInjector.register("loggingLevels", LoggingLevels);
74+
testInjector.register("utils", Utils);
75+
testInjector.register("iTunesValidator", {});
4276
return testInjector;
4377
}
4478

test/stubs.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,9 @@ export class PlatformProjectServiceStub implements IPlatformProjectService {
318318
buildProject(projectRoot: string): IFuture<void> {
319319
return Future.fromResult();
320320
}
321+
buildForDeploy(projectRoot: string): IFuture<void> {
322+
return Future.fromResult();
323+
}
321324
isPlatformPrepared(projectRoot: string): IFuture<boolean> {
322325
return Future.fromResult(false);
323326
}

0 commit comments

Comments
 (0)