Skip to content

Commit 5467857

Browse files
author
Alon Haiut
authored
Merge pull request #80 from LeoNatan/master
Add setLocation support
2 parents 71c105c + 2836ba7 commit 5467857

File tree

4 files changed

+94
-5
lines changed

4 files changed

+94
-5
lines changed

applesimutils/applesimutils.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
395046D51EA725FF00557294 /* SetLocationPermission.m in Sources */ = {isa = PBXBuildFile; fileRef = 395046D41EA725FF00557294 /* SetLocationPermission.m */; };
2424
395046D81EA72F1000557294 /* SimUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 395046D71EA72F1000557294 /* SimUtils.m */; };
2525
39676AD61F94BE4100018548 /* ClearKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 39676AD51F94BE4100018548 /* ClearKeychain.m */; };
26+
3976EA0225F8EEE800E4BD78 /* SetSimulatorLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3976E9FA25F8EEE800E4BD78 /* SetSimulatorLocation.m */; };
2627
39A57000258F3FF90067D86B /* DTXLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 39A56FFF258F3FF90067D86B /* DTXLogging.m */; };
2728
39EAF80624E2F008003F86C3 /* NSTask+InputOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 39EAF80524E2F008003F86C3 /* NSTask+InputOutput.m */; };
2829
/* End PBXBuildFile section */
@@ -132,6 +133,8 @@
132133
395046D71EA72F1000557294 /* SimUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimUtils.m; sourceTree = "<group>"; };
133134
39676AD41F94BE4100018548 /* ClearKeychain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClearKeychain.h; sourceTree = "<group>"; };
134135
39676AD51F94BE4100018548 /* ClearKeychain.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ClearKeychain.m; sourceTree = "<group>"; };
136+
3976E9FA25F8EEE800E4BD78 /* SetSimulatorLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SetSimulatorLocation.m; sourceTree = "<group>"; };
137+
3976EA0125F8EEE800E4BD78 /* SetSimulatorLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SetSimulatorLocation.h; sourceTree = "<group>"; };
135138
39A56FF8258F3FF90067D86B /* DTXLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DTXLogging.h; path = ../../ObjCCLIInfra/DTXLoggingInfra/DTXLogging.h; sourceTree = "<group>"; };
136139
39A56FFF258F3FF90067D86B /* DTXLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DTXLogging.m; path = ../../ObjCCLIInfra/DTXLoggingInfra/DTXLogging.m; sourceTree = "<group>"; };
137140
39A57002258F416F0067D86B /* DTXLoggingSubsystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DTXLoggingSubsystem.h; sourceTree = "<group>"; };
@@ -210,6 +213,8 @@
210213
391EBF301E911CAA0009AACD /* SetServicePermission.m */,
211214
395046D61EA72F1000557294 /* SimUtils.h */,
212215
395046D71EA72F1000557294 /* SimUtils.m */,
216+
3976EA0125F8EEE800E4BD78 /* SetSimulatorLocation.h */,
217+
3976E9FA25F8EEE800E4BD78 /* SetSimulatorLocation.m */,
213218
);
214219
name = Handlers;
215220
sourceTree = "<group>";
@@ -388,6 +393,7 @@
388393
39EAF80624E2F008003F86C3 /* NSTask+InputOutput.m in Sources */,
389394
393510481FCB9A1E001FB466 /* GBPrint.m in Sources */,
390395
39676AD61F94BE4100018548 /* ClearKeychain.m in Sources */,
396+
3976EA0225F8EEE800E4BD78 /* SetSimulatorLocation.m in Sources */,
391397
391596E01E8CBAA900FDD6F5 /* main.m in Sources */,
392398
395046D81EA72F1000557294 /* SimUtils.m in Sources */,
393399
391597021E8CDD1D00FDD6F5 /* SetNotificationsPermission.m in Sources */,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// SetSimulatorLocation.h
3+
// applesimutils
4+
//
5+
// Created by Leo Natan on 3/10/21.
6+
// Copyright © 2017-2021 Leo Natan. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
NS_ASSUME_NONNULL_BEGIN
12+
13+
@interface SetSimulatorLocation : NSObject
14+
15+
+ (void)setLatitude:(double)latitude longitude:(double)longitude forSimulatorUDIDs:(NSArray<NSString*>*)udids;
16+
+ (void)clearLocationForSimulatorUDIDs:(NSArray<NSString*>*)udids;
17+
18+
@end
19+
20+
NS_ASSUME_NONNULL_END
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//
2+
// SetSimulatorLocation.m
3+
// applesimutils
4+
//
5+
// Created by Leo Natan on 3/10/21.
6+
// Copyright © 2017-2021 Leo Natan. All rights reserved.
7+
//
8+
9+
#import "SetSimulatorLocation.h"
10+
11+
@implementation SetSimulatorLocation
12+
13+
+ (void)setLatitude:(double)latitude longitude:(double)longitude forSimulatorUDIDs:(NSArray<NSString*>*)udids
14+
{
15+
[NSDistributedNotificationCenter.defaultCenter postNotificationName:@"com.apple.iphonesimulator.simulateLocation" object:nil userInfo:@{
16+
@"simulateLocationLatitude": @(latitude),
17+
@"simulateLocationLongitude": @(longitude),
18+
@"simulateLocationDevices": udids,
19+
}];
20+
}
21+
22+
+ (void)clearLocationForSimulatorUDIDs:(NSArray<NSString *> *)udids
23+
{
24+
[NSDistributedNotificationCenter.defaultCenter postNotificationName:@"com.apple.iphonesimulator.simulateLocation" object:nil userInfo:@{
25+
@"simulateLocationDevices": udids,
26+
}];
27+
}
28+
29+
@end

applesimutils/applesimutils/main.m

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#import "SetServicePermission.h"
1212
#import "SetLocationPermission.h"
1313
#import "SetHealthKitPermission.h"
14+
#import "SetSimulatorLocation.h"
1415
#import "ClearMedia.h"
1516
#import "ClearKeychain.h"
1617
#import "LNOptionsParser.h"
@@ -448,7 +449,8 @@ int main(int argc, const char* argv[]) {
448449
@"%@ --byName <simulator name> --byOS <simulator OS> --bundle <bundle identifier> --setPermissions \"<permission1>, <permission2>, ...\"",
449450
@"%@ --list [--byName <simulator name>] [--byOS <simulator OS>] [--byType <simulator device type>] [--maxResults <int>]",
450451
@"%@ --booted --biometricEnrollment <YES/NO>",
451-
@"%@ --booted --biometricMatch"
452+
@"%@ --booted --biometricMatch",
453+
@"%@ --booted --setLocation \"[51.51915, -0.12907]\""
452454
]);
453455

454456
LNUsageSetOptions(@[
@@ -467,10 +469,12 @@ int main(int argc, const char* argv[]) {
467469
[LNUsageOption optionWithName:@"clearMedia" shortcut:@"cm" valueRequirement:LNUsageOptionRequirementNone description:@"Clears the simulator's media"],
468470
[LNUsageOption optionWithName:@"restartSB" shortcut:@"sb" valueRequirement:LNUsageOptionRequirementNone description:@"Restarts SpringBoard"],
469471
LNUsageOption.emptyOption,
470-
[LNUsageOption optionWithName:@"biometricEnrollment" shortcut:@"be" valueRequirement:LNUsageOptionRequirementRequired description:@"Enables or disables biometric (Face ID/Touch ID) enrollment."],
472+
[LNUsageOption optionWithName:@"biometricEnrollment" shortcut:@"be" valueRequirement:LNUsageOptionRequirementRequired description:@"Enables or disables biometric (Face ID/Touch ID) enrollment"],
471473
[LNUsageOption optionWithName:@"biometricMatch" shortcut:@"bm" valueRequirement:LNUsageOptionRequirementNone description:@"Approves a biometric authentication request with a matching biometric feature (e.g. face or finger)"],
472474
[LNUsageOption optionWithName:@"biometricNonmatch" shortcut:@"bnm" valueRequirement:LNUsageOptionRequirementNone description:@"Fails a biometric authentication request with a non-matching biometric feature (e.g. face or finger)"],
473475
LNUsageOption.emptyOption,
476+
[LNUsageOption optionWithName:@"setLocation" shortcut:@"sl" valueRequirement:LNUsageOptionRequirementRequired description:@"Sets the simulated location; the latitude and longitude should be provided as two numbers in JSON array, or \"none\" to clear the simulated location"],
477+
LNUsageOption.emptyOption,
474478
[LNUsageOption optionWithName:@"version" shortcut:@"v" valueRequirement:LNUsageOptionRequirementNone description:@"Prints version"],
475479
]);
476480

@@ -524,12 +528,13 @@ int main(int argc, const char* argv[]) {
524528
![settings objectForKey:@"list"] &&
525529
![settings objectForKey:@"paths"] &&
526530
![settings objectForKey:@"biometricEnrollment"] &&
527-
![settings objectForKey:@"biometricMatch"] &&
528-
![settings objectForKey:@"biometricNonmatch"] &&
531+
![settings boolForKey:@"biometricMatch"] &&
532+
![settings boolForKey:@"biometricNonmatch"] &&
529533
![settings boolForKey:@"matchFace"] &&
530534
![settings boolForKey:@"unmatchFace"] &&
531535
![settings boolForKey:@"matchFinger"] &&
532-
![settings boolForKey:@"unmatchFinger"]
536+
![settings boolForKey:@"unmatchFinger"] &&
537+
![settings objectForKey:@"setLocation"]
533538
)
534539
{
535540
LNUsagePrintMessage(nil, LNLogLevelStdOut);
@@ -703,6 +708,35 @@ int main(int argc, const char* argv[]) {
703708
exit(0);
704709
}
705710

711+
NSString* setLocationParam = [settings objectForKey:@"setLocation"];
712+
if(setLocationParam != nil && filteredSimulators.count > 0)
713+
{
714+
NSArray<NSString*>* simulatorUDIDs = [filteredSimulators valueForKey:@"udid"];
715+
716+
if([setLocationParam isKindOfClass:NSString.class] && [setLocationParam isEqualToString:@"none"])
717+
{
718+
[SetSimulatorLocation clearLocationForSimulatorUDIDs:simulatorUDIDs];
719+
}
720+
else
721+
{
722+
NSError* jsonError = nil;
723+
NSArray* locationArgs = [NSJSONSerialization JSONObjectWithData:[setLocationParam dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&jsonError];
724+
if(jsonError != nil)
725+
{
726+
LNUsagePrintMessage([NSString stringWithFormat:@"Error: Unable to parse location JSON: %@.", jsonError.localizedDescription], LNLogLevelError);
727+
728+
exit(-2);
729+
}
730+
if(locationArgs.count != 2)
731+
{
732+
LNUsagePrintMessage(@"Error: Invalid number of arguments in JSON.", LNLogLevelError);
733+
734+
exit(-2);
735+
}
736+
[SetSimulatorLocation setLatitude:[locationArgs.firstObject doubleValue] longitude:[locationArgs.lastObject doubleValue] forSimulatorUDIDs:simulatorUDIDs];
737+
}
738+
}
739+
706740
[filteredSimulators enumerateObjectsUsingBlock:^(NSDictionary* _Nonnull simulator, NSUInteger idx, BOOL * _Nonnull stop) {
707741
NSString* simulatorId = simulator[@"udid"];
708742

0 commit comments

Comments
 (0)