Xcode 4.3インストール後、xcodebuildが動作しない場合の修復方法

コマンドラインでXcodeのプロジェクトをビルドするxcodebuildコマンドが動作しなくなってしまった。具体的には次のようなエラーが表示される。
xcodebuild: error: developer tools not installed;
download from http://developer.apple.com

原因はこれまで/DeveloperにインストールされていたXcodeがXcode 4.3より/Applicationsにインストールされるようになったため。
これまでの/Developerに相当するものは、/Applications/Xcode.appのパッケージに内包されるようになった。

xcode-selectコマンドを使用して、Xcodeのインストール先を指定することでxcodebuildコマンドの修復に成功した。

以下手順

  1. ターミナルを開く。
  2. 以下のコマンドを入力する。
  3. sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

  4. パスワード入力が求められるので、管理者のパスワードを入力する。

参考文献
xcode-select で Xcode の保存先を変更
http://d.hatena.ne.jp/watanata2000/20111028/1319808003

追記:「iOSの教科書」印刷製本プロジェクト開始!しました。ご支援ご協力よろしくお願い申し上げます。

広告

Xcode4でフレームワークの追加はどこへ行った?

ついにリリースされたXcode4でプロジェクトへのフレームワーク追加で大幅にはまったのでメモ。

Xcode3で既存のフレームワークを追加するにはこんな感じで

プロジェクト・ウィンドウのコンテキストメニューから追加していました。

が、Xcode4に移行してからこの項目が見あたらない。

いろいろ試したところ、Project Editorから追加したところうまくリンクが出来ました。
ただ、もっと簡単な方法はないものかと模索中です。
手順としては

  • Project Navigatorの最上部にあるプロジェクトファイルをクリックしてProject Editorを開く。
  • Targetsからフレームワークを追加するターゲットを選択する。
  • Build Pheseパネルを開く。
  • Link Binary With Librariesのディスクロージャトライアングル(三角ボタン)をクリックして展開する。
  • +ボタンをクリックしてフレームワークを追加する。

Xcode4で○○はどこへ行った?シリーズはもう少し続きます。

 

AVAudioPlayerでパン

iOS 4.0でAVAudioPlayerにpanのプロパティが追加された。
プロパティに値を設定するだけで、簡単にパンニングができる。
設定できる値は-1.0~1.0。
-1.0で左寄りに、0.0で中央に、1.0で右寄りになる。


//  AVPlayerViewController.m
//  AVPlayer
//
//  Created by nori on 10/12/01.
//  Copyright 2010 __MyCompanyName__. All rights reserved.
//

#import "AVPlayerViewController.h"
#import 
@implementation AVPlayerViewController

@synthesize avPlayer;





- (void)viewDidLoad {
    [super viewDidLoad];
	NSError *error = nil;
	NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"mp3"];
	NSURL *url = [NSURL fileURLWithPath:path];
	self.avPlayer = [[[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error] autorelease];

	UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
	slider.minimumValue = -1.0;
	slider.maximumValue = 1,0;
	slider.value = 0.0;
	slider.continuous = YES;
	[slider addTarget:self action:@selector(sliderDidChange:) forControlEvents:UIControlEventValueChanged];
	[self.view addSubview:slider];
	[slider release];
	
	[self.avPlayer play];
}

- (void)sliderDidChange:(UISlider *)slider{
	self.avPlayer.pan = slider.value;
}








- (void)didReceiveMemoryWarning {
	// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
	
	// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
	// Release any retained subviews of the main view.
	// e.g. self.myOutlet = nil;
}


- (void)dealloc {
	self.avPlayer = nil;
    [super dealloc];
}

@end

CoreMotionを使ってみる

スタンフォード大が公開しているCS 193P iPhone Application Development(http://www.stanford.edu/class/cs193p/cgi-bin/drupal/)の授業を参考にしながら、iOS4.0から追加されたCoreMotionFrameworkを実験中。

CMMotionManagerを使用すると、加速度(CMAccelerometerData)、ジャイロのデータ(CMGyroData)、デバイスの姿勢など(CMDeviceMotion)の情報を取得できる。

CMGyroData, CMDeviceMotionはiPhone4のみ取得可能。(iPod touch 4Gは未確認)

取得方法は2種類

CMMotionManagerが新しいサンプルを取得する度に、あらかじめ指定したBlockを実行する。(PUSH)
CMMotionManagerの値をNSTimerなどを使って、任意のタイミングで取得する。(PULL)

今回はPUSHの方法で、加速度のデータを取得してみた。

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>
@interface MotionSampleViewController : UIViewController {

	CMMotionManager *motionManager;

}

- (IBAction)startUpdate:(id)sender;
- (IBAction)stopUpdate:(id)sender;
@property (nonatomic, retain) CMMotionManager *motionManager;

@end
#import "MotionSampleViewController.h"

@implementation MotionSampleViewController

@synthesize motionManager;


- (void)setupMotionManager{
	CMMotionManager *manager = [[[CMMotionManager alloc] init] autorelease]; //CMMotionManagerの生成
	self.motionManager = manager;
	manager.accelerometerUpdateInterval = 10.0 / 60.0; //CMMotionManagerが1秒に何回データを取得するか指定する
}


	

- (IBAction)startUpdate:(id)sender{
	
	if (!self.motionManager) {
		[self setupMotionManager]; //CMMotionManagerの生成
	}
	if (! motionManager.accelerometerAvailable) {
		return; //motionManagerがaccelerometerを利用できないときはreturn
	}
	
	if ( ![self.motionManager isAccelerometerActive]) {
		
		//motionManagerがaccelerometerを使用中かチェック
		
		NSOperationQueue *opQueue = [[[NSOperationQueue alloc] init] autorelease];
		[self.motionManager startAccelerometerUpdatesToQueue:opQueue 
												 withHandler:^(CMAccelerometerData *data, NSError *error) {
													 
													 //新しい加速度のデータを取得する度にこのブロックを実行する
													 
													 dispatch_async(dispatch_get_main_queue(), ^{
														 
														 NSLog(@"加速度のデータ:%@",data);
														 
													 });
												 }];
		
	}
	
}

- (IBAction)stopUpdate:(id)sender{
	[self.motionManager stopAccelerometerUpdates];
}






- (void)dealloc {
	[self.motionManager stopAccelerometerUpdates];
	self.motionManager = nil;
    [super dealloc];
}

@end

Block,GrandCentralDispatch周りをまだ完全に理解できていない(^_^;)