App Name : ZYX
Apple ID : 505193110
Bundle Identifier : org.JODI.zyx
Localizations : ( "en" )
Prerendered Icon Flag : true
Original Zip File Name : ZYX.ipa
Bundle Short Version String : 1.2
Bundle Version : 1.2
Minimum OS Requirements : 5.0
Build SDK : 9B176
Build Platform : 9B176
Required Capabilities : armv7
Supported Architectures : armv7
Device Family : iPhone / iPod Touch
Newsstand App : false
Entitlements : ZYX.app/ZYX
get-task-allow: false
keychain-access-groups: ( FQK7H3AF9T.org.JODI.zyx )
application-identifier: FQK7H3AF9T.org.JODI.zyx
#pragma mark - Gyroscope
-(void)updateMotion;{
oldHeading = 0;
offsetG = 0;
newCompassTarget = 0;
if (!locationManager) locationManager=[[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate=self;
[locationManager startUpdatingHeading];
if (!motionManager) motionManager = [[CMMotionManager alloc] init];
if (!currentQueue) currentQueue = [[NSOperationQueue alloc] init];
motionManager.deviceMotionUpdateInterval = 0.1;
if(motionManager.isDeviceMotionAvailable) {
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error)
{
if(i > 6){
currentRotation = newRotation;
i=0;
}
CMAttitude *currentAttitude = motion.attitude;
float yawValue = currentAttitude.yaw;
float yawDegrees = CC_RADIANS_TO_DEGREES(yawValue);
currentYaw = yawDegrees;
if([CLLocationManager headingAvailable] == YES){
yawDegrees = newCompassTarget + (yawDegrees - offsetG);
// NSLog(@"Heading is available");
} else {
// NSLog(@"Heading isn't available");
}
if(yawDegrees < 0) {
yawDegrees = yawDegrees + 360;
}
newRotation = yawDegrees;
i++;
float gyroDegrees = (yawDegrees*radianConst);
if(updateCompass) {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[rotateImg setTransform:CGAffineTransformMakeRotation(-gyroDegrees)];
[UIView commitAnimations];
updateCompass = 0;
} else {
rotateImg.transform = CGAffineTransformMakeRotation(-gyroDegrees);
}
if(newRotation >350){
currentRotation=newRotation;
if (!updateTooLong) updateTooLong =
[NSTimer scheduledTimerWithTimeInterval:10 target:self
selector:@selector(tooLong:) userInfo:nil repeats:NO];
}
else if(newRotation <10){
currentRotation=newRotation;
if (!updateTooLong) updateTooLong =
[NSTimer scheduledTimerWithTimeInterval:10 target:self
selector:@selector(tooLong:) userInfo:nil repeats:NO];
}
else if(newRotation <30){
[self playSound];
}
else if(newRotation>120 ){
if (newRotation<240) {
[self halfWay];
}
}
}];
} else {
}
}
#pragma mark - Accelerometer
CGRect parentBounds = self.view.bounds;
const int tileW = parentBounds.size.width;
const int tileH = parentBounds.size.height;
if (!motionManager) motionManager = [[CMMotionManager alloc] init];
if (!currentQueue) currentQueue = [[NSOperationQueue alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0/8.0;
if(motionManager.isDeviceMotionAvailable) {
[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error)
{
if(i > 6){
if(j > 0){
[self playSound];
countdownTimer = [NSTimer scheduledTimerWithTimeInterval: 0 target: self
selector: @selector(handleTimerTick) userInfo: nil repeats: NO];
}
currentJump = newJump;
j=0;
i=0;
}
CMAcceleration userAcceleration = motion.userAcceleration;
CMAcceleration gravity = motion.gravity;
float zValue = userAcceleration.y+gravity.y;
newJump= zValue;
i++;
self.horImg.center = CGPointMake(0+ (tileW/2), -zValue*100+ (tileH/2));
if(newJump>0.5){
j++;
}
else {
}
}];
} else {
}
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[self doCountdown];
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
[recorder prepareToRecord];
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.02 target: self
selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
}
}
- (void)levelTimerCallback:(NSTimer *)timer {
if(i > 10){
if(j > 0){
countdownTimer = [NSTimer scheduledTimerWithTimeInterval: 0 target: self
selector: @selector(handleTimerTick) userInfo: nil repeats: NO];
}
j=0;
i=0;
}
CGRect parentBounds = self.view.bounds;
const int tileW = parentBounds.size.width;
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
self.horImg.center = CGPointMake(0+ (tileW/2), -lowPassResults*400+ (440));
i++;
if (lowPassResults > 0.95){
j++;
}
}
#pragma mark - LocationManager
-(void)updateMotion;{
if (!locationManager) locationManager=[[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.delegate=self;
[locationManager startUpdatingHeading];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
{
updatedHeading = newHeading.magneticHeading;
if(updatedHeading >350){
[self doCountdown];
[self toggleFlashlight];
[updateTooLong invalidate];
updateTooLong = nil;
}
else if(updatedHeading <10){
[self doCountdown];
[self toggleFlashlight];
[updateTooLong invalidate];
updateTooLong = nil;
}
else{
countLabel3.text = @"60 seconds";
[countdownTimer invalidate];
countdownTimer = nil;
if (!updateTooLong) updateTooLong = [NSTimer scheduledTimerWithTimeInterval:10 target:self
selector:@selector(tooLong:) userInfo:nil repeats:NO];
}
float headingFloat = 0 - newHeading.magneticHeading;
trueNorth.transform = CGAffineTransformMakeRotation(headingFloat*radianConst);
}
#pragma mark - Torch
-(void)handleTimerTick;
{
[self toggleFlashlight];
countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self
selector:@selector(handleTimerTick) userInfo:nil repeats:NO];
}
- (void)toggleFlashlight;
{
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if([device hasTorch] == NO)
{
// NSLog(@"Error: This device doesnt have a torch");
}
if([device isTorchModeSupported:AVCaptureTorchModeOn] == NO)
{
// NSLog(@"Error: This device doesnt support AVCaptureTorchModeOn");
}
else{
[device lockForConfiguration:nil];
[device setTorchMode:AVCaptureTorchModeOn];
[device setTorchMode:AVCaptureTorchModeOff];
[device setTorchMode:AVCaptureTorchModeOn];
[device setTorchMode:AVCaptureTorchModeOff];
[device setTorchMode:AVCaptureTorchModeOn];
[device setTorchMode:AVCaptureTorchModeOff];
}
}
<Scheme
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EBEBA7071494B17F001F76C3"
BuildableName = "ZYX.app"
BlueprintName = "ZYX"
ReferencedContainer = "container:ZYX.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EBEBA7071494B17F001F76C3"
BuildableName = "ZYX.app"
BlueprintName = "ZYX"
ReferencedContainer = "container:ZYX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "EBEBA7071494B17F001F76C3"
BuildableName = "ZYX.app"
BlueprintName = "ZYX"
ReferencedContainer = "container:ZYX.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
customArchiveName = "JODI"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
Use the Resolution Center to correspond with App Review until all issues with your app version have been resolved. Binary Rejected Mar 1, 2012 03:11 PM Reasons for Rejection: • 10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good it may be rejected Mar 1, 2012 03:11 PM. From Apple. 10.6 We found the user interface of your app is not of sufficient quality to be appropriate for the App Store. Apps that provide a poor user experience are not in compliance with the App Store Review Guidelines. Specifically, we noticed the user interface of your app is not intuitive and could not be navigated. For example, it asks the user to turn right ten times. Simply turning the phone to the right did not increase the count. After moving the phone in several directions it began counting, but repeating the same task would only allow the count to go up to 4, at which point it looped back to provide the same command to 'turn right ten times'. Please evaluate whether you can make the necessary revisions to improve the user experience of your app.
"ZYX uses the iPhone or iPod Touch's built-in motion-tracking capabilities to guide users through a series of gestures, from turning in a circle to raising one's arm up and down. Each time a gesture is performed correctly, the phone clicks; when
all gestures have been completed, the device sounds an alarm in celebration. This app situates the user in a realm that is both virtual and physical. Bystanders see the user as performing a strange dance; in contrast, the iPhone observes and rewards the user's adherence to a prescribed set of movements. This dissonance between the virtual space inhabited by the iPhone user and the physical space occupied by the observer has become an everyday phenomenon, exemplified by the experience of passing someone on the street who appears to be delivering a nonsensical monologue while speaking into the microphone of a wireless mobile device."