数値と文字列の変換

文字列を数値に、もしくはその逆で、数値を文字列にする方法のまとめ。

『文字列から数値に変換』

NSString *str = @"1.23456789";
int x = [str intValue];
float y = [str floatValue];
double z = [str doubleValue];

 
『数値から文字列に変換』
『整数』

int i = 100;
NSString *str = [NSString stringWithFormat:@"%d", i];

『小数』

double d = 1.2345;
NSString *str = [NSString stringWithFormat:@"%f", d];

アプリの更新

一度App Storeに申請・登録されたアプリに更新を掛ける方法のまとめ。

1.info.plistの『Bundle version』を今より大きい数字にする
2.AppleサイトのMemberCenterからiTunesConnect>Manage Your Applicationsに入り、該当のアプリを選択して、1で決めたバージョン番号と同じ番号で『Add Version』プロファイルを作成する
3.ビルド先を『iOS Device』にしてProduct>Archiveを実行
4.Organizerを開いて、Archivesで今作成したArchiveを選択し、Validateを実行
5.Validateが通ったら、Submit

この工程のどこでもエラーになってなければ、New Versionのアプリが『Waiting For Review』になるはず。
 
 
2012/04/25 追記
・3のArchiveの時点で『Code sign error:Provisioning profile 〜 can’t be found』というエラーが出る場合
 
実機テストやら何やらでProvisioning profile周りをいじった際に、陥りそうなエラー。
エラーの内容としては単純で、プロジェクトの『TARGETS』>『Build Settings』>『Code Signing』で、指定されたProvisioning profileが間違っているためにエラーになっている。
ここを、Member Center上で作成した正しいProvisioning profileに変えてやれば、エラーは出なくなる。

アイコンサイズとアイコンのグラデーション加工をオフにする方法

タイトルの通り、アイコンに関するまとめ。

『アイコンサイズ』
デフォルト:Icon.png (57 x 57)
Retina用:Icon@2x.png (114 x114)
App Store用:XXX.png (512 x 512)
起動画面用:Default.png (320 x 480)
起動画面Retina用:Default@2x.png (640 x 960)

起動時に表示される画像に関しては、Default.pngの名前でResourceとかのフォルダに入れておけば、勝手に認識してくれる様子。
アイコンファイルは、info.plistの『Icon file』もしくは『Icon files』で指定する。
 
 
『グラデーション加工OFF』
Info.plistで適当なKeyの+を押して、『Icon already includes gloss and bevel effects』を追加してチェックを入れる。

オフにしたいのにチェックを付けるっていうのが、ちょっと納得行かないところ。
まあ、設定の英文からして、Apple的にはアイコンにグラデーションがかかってて当たり前、みたいな考えなんだろうけど。(『Icon already includes gloss and bevel effects』=『このアイコンにはもうグラデーション加工を施してあります』)

Mapkitのいろいろ

ネットからいろいろ拾い読みして試していたら記事としてまとめる気力を使い果たしたので、ログとして記事作成。
後日気力が回復したら、しっかりまとめようと思います。

『Mapkitにアイコン画像でピン立て』
 http://blog.syuhari.jp/archives/2040

『ピンが落ちてくるアニメーション』
 http://blog.syuhari.jp/archives/2049

『MKPinAnnotationView』
 http://iphone-tora.sakura.ne.jp/mkpinannotationview.html

『ジオコーディングとJSON』
 http://kinsentansa.blogspot.com/2010/05/iphonejsonjson-framework-by-stig.html

『ピンの座標(起点)変更』
 http://blog.fenrir-inc.com/jp/2011/06/mapkit-pin.html

MapKit – 地図の表示と現在位置の取得と現在位置にピン立て

MKMapViewをIBでViewに追加とか、初歩的な部分は割愛。

前提作業
・アプリに『MapKit.framework』と『CoreLocation.framework』を追加して、import

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/Mapkit.h>
#import <CoreLocation/CoreLocation.h>

//MapViewのインスタンス作ったりとか
@interface ViewController : UIViewController <CLLocationManagerDelegate>{
    CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;    
@property (strong, nonatomic) IBOutlet MKMapView *mapView;

ViewController.m

- (void)viewDidLoad
{
    locationManager = [[CLLocationManager alloc] init];
    
    // 位置情報サービスが利用できるかどうかをチェック
    if ([CLLocationManager locationServicesEnabled]) {
        locationManager.delegate = self;
        // 測位開始
        [locationManager startUpdatingLocation];
    } else {
        NSLog(@"Location services not available.");
    }

    [super viewDidLoad];
}

// 位置情報更新時
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
	CLLocationCoordinate2D coordinate = newLocation.coordinate;
    
	[mapView setCenterCoordinate:coordinate animated:NO];
    
	// 縮尺を設定
	MKCoordinateRegion zoom = mapView.region;
	zoom.span.latitudeDelta = 0.005;
	zoom.span.longitudeDelta = 0.005;
	[mapView setRegion:zoom animated:YES];
    mapView.showsUserLocation=TRUE;

    //測位停止
    [locationManager stopUpdatingLocation];
}

// 測位失敗時や、位置情報の利用をユーザーが許可しなかった場合などに呼ばれる
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"位置情報利用不可" message:@"位置情報の取得に失敗しました。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
    
    [alert show];
}

Mapアプリはいろいろ便利なのができそうで、わくわくします。
 
 
2012/8/1追記:
GPSの取得の後に何か処理をする場合、一旦処理を止めてあげないと、GPSの取得に処理の実行速度が勝っちゃって(?)、GPSの取得が中途半端になる模様。

解決策としては、『stopUpdatingLocation』は別メソッドに隔離して、遅延実行してやると良いみたいだ。

        // 測位開始
        [locationManager startUpdatingLocation];
        // 『追加』一秒後に測位停止
        [self performSelector:@selector(stopUpdatingLocation:)
                   withObject:nil
                   afterDelay:1.0];

- (void)stopUpdatingLocation:(NSObject *)args{
    [locationManager stopUpdatingLocation]; //測位停止
}