2012年12月28日金曜日

CSSMERR_TP_NOT_TRUSTEDエラー アプリ起動時のエラー対処法

今までmacbook airで開発をしていましたが、
容量が少なく、いろんなファイルを管理できなくなってmac miniを買いました。

2台のパソコンで今は開発を行っているのですが、
環境を整えるのに苦労をしたので、メモ。

いろいろ証明書を設定して、ビルドしてみたら、
下記のエラーが。

--------------------

CodeSign 
/Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Products/Debug-iphoneos/ZoomingPDFViewer.app
    cd 
/Users/○○/Desktop/ZoomingPDFViewer
    setenv CODESIGN_ALLOCATE /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
    setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /usr/bin/codesign --force --sign 6fca944bd049fc792f6469e792a45346d1031805 --resource-rules=
/Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Products/Debug-iphoneos/ZoomingPDFViewer.app
/ResourceRules.plist --entitlements 
/Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Intermediates/ZoomingPDFViewer.build/Debug-iphoneos/ZoomingPDFViewer.build/ZoomingPDFViewer.xcent /Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Products/Debug-iphoneos/ZoomingPDFViewer.app

/Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Products/Debug-iphoneos/ZoomingPDFViewer.app: replacing existing signature/Users/○○/Library/Developer/Xcode/DerivedData/ZoomingPDFViewer-gkmanalzplbfaxdamefzfpbcbavt/Build/Products/Debug-iphoneos/ZoomingPDFViewer.app: CSSMERR_TP_NOT_TRUSTEDCommand /usr/bin/codesign failed with exit code 1

----------


いろいろググった結果、
キーチェーンアクセスに登録した証明書に問題があることがわかりました。


キーチェーンアクセスの鍵のカテゴリで、
証明書をチェックした際に、
緑のマークと一緒に「この証明書は有効です」となっていないと
上記のエラーが出てしまうことがわかりました。

証明書を右クリックして、「情報をみる」から、
「信頼」を確認してみると、
「この証明書を使用するとき」というのが選択できます。

ここを常に信頼を選択してしまっていたのがいけませんでした。
「システムデフォルトを使用」を選択することで、
エラーにならずにビルドをすることができました!


下記ブログ参考にさせていただきました。
ありがとうございます!
http://akisute.com/2010/12/cssmerrtpnottrusted.html






2012年10月12日金曜日

初心者からでもアプリが作れる!iphoneアプリの 習得にオススメの 本5冊

2012年の1月から独学でiphoneアプリの勉強をしてきました。
まだまだひよっこですが、
本当の未経験から、アプリが作れる様になるまでに、
私が参考にした本をぜひご紹介したいと思います。

【1】カワサキタカシさんのiphoneアプリ開発塾


サルできブログでも有名なカワサキさんの本。
初心者でも分かりやすく説明がされていてオススメです。

本だけでなく、ブログも面白いので、
ぜひチェックしてみて下さい。


【2】iphone UIKIT

 

iphone開発に重要なUIKITを分かりやすく丁寧に説明してくれています。
ある程度UIKITの事を学んだらぜひ読んでほしい一冊です。

今でもUIKITの確認をするときなど、
辞書がわりとして読み直したりしています。

長く使える本になりそうです。

【3】iphone SDK



定番のオライリー!
オライリーだけあって、初心者にはとっつきづらいテキストが
ずらりと並んだ本になりますが、
iphoneアプリの知識を深めるにはとってもいい本です!

たくさんの情報がまとめられていて、
知っている知識をより深められることが出来ます。

【4】iphoneアプリ開発


初心者にはちょっと難しめに書いてありますが、
カメラアプリやクイズアプリなど、作ってみたくなるアプリの解説が
たくさん載っています。

私もこの本でいろんなアプリを見よう見まねで作りながら、
アプリの勉強をしてきたので、
かなり思い出になった一冊です。


【5】iphoneアプリ開発


10日間で覚えるシリーズです。
毎日コツコツと読み進めていけるので、
短期間にiphoneアプリの開発について勉強したいという方にオススメ!

ソースもきちんと書いてくれているので、
とても分かりやすく、読みやすいです。

以上がオススメの5冊です。
他にもいろいろな本を読んできましたが、
他のオススメ本もまた機会があるときにご紹介したいと思います!




the value for the ingo .plist key CFBundleLocaliztion is not of the required type of that key see the information property ist key reference 1091 エラー

the value for the ingo .plist key CFBundleLocaliztion is not of the required type of that key see the information property ist key reference 1091というエラーが出て、
アップロードが出来ずに悩んでました。

いろいろ調べた結果、
info.plistに入っているLocalizationの部分を削除したら大丈夫でした!

みなさんも一度ハマったらinfo.plistをご確認ください。

2012年10月2日火曜日

Command /usr/bin/codesign failed with exit code 1エラー(証明書やキーチェーンが原因でないときの対処法)

Command /usr/bin/codesign failed with exit code 1っていうエラーが出て、
ハマりました。。

このキーワードで検索すると、
キーチェーンにムダな証明書があるからそれをキレイにすると
治るよって言う情報がたくさんでてくるんだけど、
私のは、他のプロジェクトだとうまくビルドできてるから、
証明書が原因じゃないはず…と思っていろいろ調べていました。

結局は、しっかりエラーを読んでみると、

object file format invalid or unsuitable

って出ていました。

よく調べてみたら、
info.plistの変えちゃいけない情報を変えていました!!

Executable fileは書き換えちゃいけません。
Bundle identifierやBundle nameの方を修正しましょう。





2012年10月1日月曜日

iphoneとandroid で表示を統一する方法


iphoneの横幅は320px
アンドロイドは機種によっても様々。

そんなスマートフォンのサイトを制作するときに、
どんな機種でもきちんと表示されるように、
「viewport」っていうのを設定します。

<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport'>

このように設定すると、
アンドロイドでもiphoneでも横幅にあわせて表示をしてくれ、
ユーザーが拡大したり縮小したりすることを防げます。

一緒に

<meta content='telephone=no' name='format-detection'>

こちらも書くと、
日付のところや電話番号のところが勝手に電話のリンクにならなくて
便利。

ぜひお試しください。



2012年8月20日月曜日

View-based Applicationが見つからない 新しいX-code

いつもView based applicationを選択してアプリを作成していたのに、
新しくX-codeをダウンロードしてアプリを作ろうとしたら、
View based applicationが見つからない。。

どうやら、新しいものは、「Single View Application」を選択し、「Next」ボタンを押し、「Use storyboard」のチェックを外し「Next」ボタンを押し保存するれば同じ構成になっているようです。

いろいろ新しく変わっているんですね。

2012年7月13日金曜日

NSBundleを使ったファイルパスの指定方法と、URLからデータを取得する方法

Xcodeで何かしら画像やファイルデータを呼びたいときに、
ファイルパスを指定してデータを呼び出すのですが、
そのデータを呼び出す際の方法を今日はご紹介したいと思います。


まず最初は、NSBundleを利用してファイルパスを書く方法。

------


NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"gif"];
NSData *data = [NSData dataWithContentsOfFile: filePath];

-------


これで、dataの中には、test.gif画像が保存されます。
「pathForResource」は、ファイルの名前で、
ofType」の方は、ファイルの拡張子を指定します。

gif以外にも、jpegや音楽ファイル、plist(プロパティリスト)など、
いろんなファイルを呼び出す事が出来ます。
次は、URLを指定して、ファイルを呼び出す方法です。

こんな感じで、 initWithStringの所に呼び出したいファイルのURLを指定しましょう。

---------

NSURL* url = [[NSURL alloc] initWithString:@"http://~~~~~.html"];
    NSURLRequest* req = [NSURLRequest requestWithURL:url];
    NSURLResponse* res;
    NSError* a_error;
    NSData* data = [NSURLConnection 
  sendSynchronousRequest:req
  returningResponse:&res
  error:&a_error];

--------


2012年7月12日木曜日

_Prefix.pchファイルとは objective-cの勉強

xcodeで何かプロジェクトを作成すると、
Other Sourceの中に入っている_Prefix.pchファイル。

このファイルに、いろいろ指定していると、
わざわざヘッダーファイルで呼び出さなくても
使えるので便利です。

例えば、
#define Image @"image"
#define serchpath @"http://www〜"

みたいによく使う名前やURLを登録しておくと便利!
ぜひ使ってみて下さい。


2012年7月10日火曜日

今表示しているViewを消す時(objective-c、cocoa)


これもいつも忘れるのでメモ。

[self dismissModalViewControllerAnimated:YES];


ただ、子供や孫のビューを消すのは
いつも面倒なんですよね。。


UITableViewの戻るボタンを設置する方法








テーブルビューの左上に出てくる戻るボタンの
表示方法です。

いつも忘れてしまうのでメモ。

-----

UIButton *backButton = [UIButton buttonWithType:101];
backButton.showsTouchWhenHighlighted = NO;
[backButton addTarget:self action:@selector(backtop:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"戻る" forState:UIControlStateNormal];
UIBarButtonItem *back = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = back;
[backButton release];
[back release];


-----

ボタンを押したときのアクションは、
こんな感じで出来ます。

------
-(void)backtop:(id)sender {
//ここに処理を明記
}

------


2012年7月5日木曜日

NSDataやNSArrayなどの変換方法(objective-c)cocoa


// NSDataオブジェクトへ変換(エンコード)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:obj];
 
// 変換前のオブジェクトに復元(デコード)
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];


こんな感じでNSData、NSArray両方の変換が出来ます。
分からなくてエラーがいっぱい出て大変でした。。。



viewを呼び出す時のアニメーションを設定する方法(modalview)iphoneアプリの作り方


アニメーションの種類を指定して
新しいviewを呼び出す時の方法です。

これは、-(IBAction)toptopage:(id)senderという
メソッドをUIButtonに設定して、
view1を呼び出しているところです。

-(IBAction)toptopage:(id)sender {

//最初の画面の名前を指定
view1 *controller = [[view1 alloc]initWithNibName:@"view1" bundle:nil];

// アニメーションの種類を設定(ここでは画面が前後にくるっとまわるやつ)
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release]; 

}


アニメーションの種類はこんなにたくさんあります。

UIModalTransitionStyleCoverVertical
画面の下から上にビューがにょきっと出てくるタイプです。
閉じる時はビューが下にスライドして戻ります。
これはデフォルトのトランジションスタイルです。

UIModalTransitionStyleFlipHorizontal
今回のサンプルで使用したスタイルです。
3Dみたいに、画面がくるっとまわるタイプで、背面だったところが、
正面になるような動きをします。

UIModalTransitionStyleCrossDissolve
現在のビューがだんだん薄くなって、もともとあったビューが
だんだん見えてくるタイプです。
フェードイン&フェードアウトでビューを表示/非表示することが出来ます。

UIModalTransitionStylePartialCurl
ページがくるっと上にめくれるタイプのスタイルです。
ただ、いろいろと例外があるので、使い方には注意が必要です。



2012年7月4日水曜日

Xcodeのシミュレーターでiphoneのキャプチャ画像をとる方法!(apple connectでアプリをリリース時用に便利!)

いつも、アプリをリリースする時は、
実機に作成したアプリをインストールして、
iphoneの実機でキャプチャをとっていたのですが、

iphoneのバージョンをアップさせたら、
私が使っているXcodeでは対応していなくて、
iphoneの方にアプリをインストールすることが出来ませんでした。。

なので、どうやってキャプチャ画像をとろうかなと悩んでいたところ、
いいソフトに出会えたのでご紹介します。


iOS-Simulator Cropper
http://www.curioustimes.de/iphonesimulatorcropper/


これは、Xcodeのシミュレーターで表示している画像を
キャプチャ画像として指定したフォルダに保存してくれる
ソフトです。

iphoneのアプリをitunes connectからアップロードする際、
640×960の指定されたサイズでないと、
アップロードすることが出来ないので、
command + shift + 4
ではなかなか指定したサイズでキャプチャが取れないため、
今回のソフトが大活躍!!!!






最初のプルダウンのところで、
どんなキャプチャ画像をとりたいかを指定して、
ディレクトリーのところに、画像を保存したいフォルダのパスを指定。

その下のファイルネイムのところで、
キャプチャをとった際の画像保存名を指定します。


それで右下のスクリーンショットボタンを押すと、
Xcodeのシミュレーターで表示している画像を自動的にキャプチャしてくれます。

ただ、私が使用した時は、
キャプチャのサイズが320× 480だったので、
そのあとサイズを変更してアップロードできるサイズにリサイズしたのですが、、


もしよかったら使ってみて下さいー!



2012年7月3日火曜日

for文で一気にオブジェクトを作成する cocoa、iphoneアプリの作りかた

何かオブジェクトを作成するとき、


self.view1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
self.view1.backgroundColor = [UIColor clearColor];

self.view2 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
self.view2.backgroundColor = [UIColor clearColor];

self.view3 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
self.view3.backgroundColor = [UIColor clearColor];


こんな風におんなじようなコードをいくつも作成しなきゃいけない時があると思います。
ちょっとだけ表示させる位置が違うのに、
なんでおんなじようなものをいくつも書かなきゃいけないんだー!!
ってなりますよね。。

そこで、今回はfor文を使って、
簡単にオブジェクトを一気に作成する方法をご紹介します。

まずは気になるコードから。

------
//======テキスト部分(タイトル)の設定======
NSURL *url = [NSURL URLWithString:@"http:/had1.txt"];
NSStringEncoding usedEncoding;
NSError *error;
NSString *result = [NSString stringWithContentsOfURL:url usedEncoding:&usedEncoding error:&error];
if (result == nil) {
} else {
//一行づつ読み込んで処理する
NSArray *array = [result componentsSeparatedByString:@"\n"];

//表示位置を指定するための数値を用意
int boxdata = 60;

//ここから繰り返し処理
for (int i = 0; i < [array count]; i++) {

UITextView* labelname[i];
labelname[i] = [[UITextView alloc] initWithFrame:CGRectMake(90, boxdata, 220.0, 25.0)];
labelname[i].font = [UIFont fontWithName:@"HiraKakuProN-W6" size:14];
labelname[i].textAlignment = UITextAlignmentLeft;
labelname[i].editable = NO;
labelname[i].scrollEnabled = NO;
labelname[i].userInteractionEnabled = NO;
labelname[i].textColor = [UIColor colorWithRed:72/256.0 green:88/256.0 blue:89/256.0 alpha:1.0f];
labelname[i].backgroundColor =[UIColor whiteColor];
labelname[i].autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight;
labelname[i].text = [array objectAtIndex:i];
[self.wv insertSubview:labelname[i] atIndex:1];

//表示位置をちょっとづつ変えていく
boxdata = boxdata + 61;
}
}

------


コードをみてもらえれば、
やっている事がすぐに分かると思うのですが、
一つ前のブログでご紹介した様に、
外部にアップしているテキストデータを読み込み、
改行ごとに、一列づつテキストデータを保存。

保存したテキストデータを、
配列を利用して、for文で順番にセットしています。

今回つまずいたのは、
オブジェクトの名前も配列のように
UITextView* labelname[i];で用意してあげること。

これで少しはコードを書く行数が節約できました!


外部のサーバーにアップされている情報をURLを指定して読み込む方法 iphoneアプリの作りかた


アプリの中に、オブジェクトとして保存してしまうと、
リリースしたあとに気軽に中の情報を書き換える事が出来ません。

なので、今後変更される予定があるものや、
今後更新される可能性があるものは、
外部に情報を保持し、そこの情報をアプリが読み込むという方法を
行なう事で、アプリ内の情報を気軽に更新することが出来ます。

今回は、サーバーにアップされているテキストデータを読み込んで、
アプリ内に表示する方法をご紹介します。


--------------
//URLや読み込む際の文字コードを指定してファイルを読み込みます。

NSURL *url = [NSURL URLWithString:@"http://~~URL~~~.txt"];
NSStringEncoding usedEncoding;
NSError *error;
NSString *result = [NSString stringWithContentsOfURL:url usedEncoding:&usedEncoding error:&error];

//もし読み込んだ結果が何もなかった場合の処理
if (result == nil) {
} else {

//情報が読み込まれた時の処理
//改行ごとに、配列にテキストデータを保存します。
NSArray *array = [result componentsSeparatedByString:@"\n"];
//デバッガに読み込まれた情報をかき出します。
NSLog(@"array = %@" ,array);
}

------------------


こんな感じで外部のテキストデータを読み込むことが出来ました。

Xcodeで苦労して作ったファイルを空のファイルでa上書きしてしまった、、

以前して、何日間かかかけて苦労して作ったファイルを
空のファイルで上書き保存してしまいました。。

いろいろ調べても、
デバックしたファイルから復元は出来ないし、
途方に暮れていたら、なんとゴミ箱に復元したかった
ヘッダファイルとメソッドファイルが捨てられてありました!!!

xibの方で、再度アクションなどを繋げ直し、
何度か試行錯誤したらきちんとファイルが元通りになりました。

昔のファイルはきちんと保管しておかなきゃいけないですね。。
ファイルを作り直していて、
いろいろ忘れていた事を思い出したのでメモ。

以前こちらの記事で紹介してもらった、
NSUserdefaultの使い方。
http://luminosite-jwell.blogspot.jp/2012/06/nsuserdefaultsiphone.html


■UIViewにUITableViewを自分で追加した時は、
きちんとUITableViewDataSource, UITableViewDelegateを追加しないといけない。


■UIPickerを使って、データを扱う時は、こちらも同じ様に、
UIPickerViewDelegate,UIPickerViewDataSourceを追加しないといけない。



@interface okiniiri : UIViewController <UITableViewDataSource, UITableViewDelegate,UIPickerViewDelegate,UIPickerViewDataSource> {


UIButton *customButton1;
NSMutableArray *contents;
NSMutableArray *activities;
UIPickerView *picker;
UIButton *donebtn;
UIView *doneview;
IBOutlet UITableView *categoryTableView;
IBOutlet UIBarButtonItem *sakujyobtn; 
}

@property (nonatomic,retain)UITableView *categoryTableView;
@property (nonatomic,retain)UIButton *customButton1;
@property (nonatomic,retain)UIPickerView *picker;
@property (nonatomic,retain)UIButton *donebtn;
@property (nonatomic,retain)UIView *doneview;
@property (nonatomic,retain)UIBarButtonItem *sakujyobtn;
@property (nonatomic,retain)NSMutableArray *contents;

-(IBAction)setEditing:(BOOL)editing animated:(BOOL)animated;
-(IBAction)setEditingadd:(BOOL)editing animated:(BOOL)animated;

@end


2012年6月29日金曜日

UITableViewのtitleが表示されない!!(iphoneアプリの作り方 objective-c)

メインビューから、UITableviewを表示させようとした時、

self.titleを指定しているのに、タイトルが表示されなくて、
少し悩んでしまったので、ブログに書こうと思います。

実際には、タイトルが一瞬表示されるのですが、
どこかに消えてしまうんです。。











↑ここの「タイトル」の所です。

このテーブルビューを作成しているメソッドファイル(.m)には、

- (void)viewDidLoad の部分に、

----


self.title = @"タイトル";
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

----

と指定しているのに、
なぜかこの画面を呼び出すとタイトルのところが消えてしまいます。
[self.view insertSubview:self.navigationController.navigationBar atIndex:10];


とかやっても消えてしまうので、
本当にいろいろ悩んでどこに消えてしまったのか探しました。。

でも原因は、この画面を呼び出している呼び出し方に問題がありました。

この画面を呼び出す際に、UIButtonに以下のようなアクションを設定したのですが、

------

-(void)torainingpush:(id)sender {
/*テーブルビュー(category.xib)を表示させる*/
category *viewController = [[category alloc] initWithNibName:@"category" 
bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc
initWithRootViewController:viewController];
navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
[navigationController setNavigationBarHidden:YES animated:YES];
/*モーダルビューとして、次のビューを表示する*/
[self presentModalViewController:navigationController animated:YES];
}

--------

ここで、ナビゲーションバーの表示を非表示にしていました。。(><!)
[navigationController setNavigationBarHidden:YES animated:YES];

↑ここのとこです。

[navigationController setNavigationBarHidden:NO animated:YES];
本当はNOに指定しないと表示されないのに。。

NOで設定したら無事に表示される様になりました!
こんなに悩んだのに。。

まだまだ未熟ものですね、
頑張ります。。











2012年6月25日月曜日

IEでもCSSでグラデーションを実現する方法

IEでもCSSだけでグラデーションを実現する方法です。

.grade {


background-color:#ffffff;
/* For WebKit (Safari, Google Chrome etc) */
background: -webkit-gradient(linear, left top, left bottom, from(#f3efe2), to(#ffffff));
/* For Mozilla/Gecko (Firefox etc) */
background: -moz-linear-gradient(top, #f3efe2, #ffffff);
/* For Internet Explorer 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff);
/* For Internet Explorer 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#f3efe2, endColorstr=#ffffff)";

}

fromからtoまでの色を指定することで、
きれいなグラデーションにすることが出来ます。

クロムやfirefoxだと#fffで白を表現することができるのですが、
IEでは#fffffffとしっかり書かないと白にならずに、変なグラデーションになってしまいました。







2012年6月22日金曜日

UIMapViewで今いる場所を表示(addObserverで現在地を中心に表示させる)

















IBOutletでマップを追加したら、

デリゲートをselfで設定し、
addObserverを追加し、ロケーションを表示させるキーを設定します。

- (void)viewDidLoad {
    [super viewDidLoad];

self.mapView.delegate = self;
[self.mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
}

//現在地を表示させるボタンにアクションを設定
- (IBAction) showHere : (id)sender {
// show current location
mapView.userLocation.title = @"現在地";
mapView.showsUserLocation = YES;
mapView.centerCoordinate = mapView.userLocation.location.coordinate
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {  
    mapView.centerCoordinate = mapView.userLocation.location.coordinate;  
// 一度しか現在地に移動しないなら removeObserver する  

    [mapView.userLocation removeObserver:self forKeyPath:@"location"];  


これで現在地を何度でも表示させる事が出来ます。





2012年6月18日月曜日

applicarion loaderでアプリをアップロードする際のエラー

application loaderでアプリをアップしようとしたら、
以下のエラーが。

------


iPhone / iPod Touch : application executable contains unsupported architecture(s):i386
Application failed codesign verification. The signature was invalid, or it was not signed with an Apple submission certificate.
Unable to extract codesigning entitlements from your application. Please make sure FlowChartBuilder.app is a valid Mach executable that's properly codesigned.

------


Across the Star Cluster
iPhone App開発とかストーリーとかCGとか色々 普通に日記もあります。

http://ameblo.jp/nukuchi/archive1-201011.html


こちらのブログを参考にいろいろ試してみたのですが、
全然だめ、、

再度構成からdistributeを作り直し、
設定をしたらうまく出来たので、その手順を忘れない様にメモ。
















プロジェクト > プロジェクト"名前"の情報 > 構成

Debugを複製して、名前をDistributeに。
下のビルドが使用するコマンドラインもDistributeに。




同じ画面のビルドを選択肢、
コード署名IDを、Distribute用の署名に変更。

(多分ココがDevelopper用になっていたからうまく行かなかったのかも、、)






















ビルドする際に、ターゲットをDevice、アクティブな構成をDistributeを選択。
ビルドを行なう。


最後にDistribute-iphoneosフォルダに出来た
XXX.app.dSYMじゃない方のファイルを圧縮して、
application loaderでアップ。

これでエラーが消えてうまくアップすることができました!
あとはリジェクトされない様に審査を待つだけ!


UIWevViewのリンクをsafariで開く方法(target="_blank"で開かないリンクを開く!)

iphoneのUIWebViewで表示させているWEBページは、
WEB内でtarget="_blank"が設定されていても、
UIWebView内で表示されてしまいます。

UIWebView内でリンクをクリックした際に、
safariを立ち上げて別ページとしてページを開くには、


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

こちらを使います。
これは、UIWebViewでページを開く際に、
アプリ内で開くか、サファリを立ち上げて表示させるかを選択できます。

return NO;のとき⇒サファリを開く
return YES;のとき⇒アプリ内で開く

クリックしたかどうかの判断は以下の条件で分岐できます。

if(navigationType == UIWebViewNavigationTypeLinkClicked

ただ、以下のものではリンクをクリックしても
リンク先が表示されなくなってしまうので、


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
return NO;
} else {
return YES;
}
}






[[UIApplication sharedApplication] openURL: [request URL]];
を書いてクリックされたリンクを開く様にしましょう。

こんな感じです。

------

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if(navigationType == UIWebViewNavigationTypeLinkClicked) { 
[[UIApplication sharedApplication] openURL: [request URL]];
return NO;
} else {
return YES;
}
}

------


ぜひお試しください。




2012年6月13日水曜日

NSUserDefaultsを使って、簡単なデータを保存する!iphoneアプリの作りかた

iphoneアプリを作っていて、またハマってしまったのでメモ。
今日は、NSUserDefaultsを使って、簡単なデータを保存する方法です。



【やりたいことを画像で説明します!】
文章で説明するのはちょっと大変なので、
画像を貼ってご説明したいと思います。



←こういうテーブルビューがあって、
 データを追加したり、削除したりすることが出来ます。

←追加ボタンを押したところ。
 ピッカーで選択した情報が、
 テーブルビューに反映されます。

←削除ボタンを押したところ。
 削除ボタンが「完了」に変わって、
 情報の左側にマイナスマークが出ます。

←マイナスマークを選択すると、
 Deleteボタンが出てきて、
 Deleteボタンを押すと、情報が削除されます。












こんな感じでテーブル内の情報を編集し、
その情報を次にアプリを開いた時も保存しておけるように、
今回はNSUserDefaultsを使用しました!


【それでは早速中身の解説です!】


これが全部のソースですが、
ちょっと長いので、すこしづつ解説していきたいと思います。

-----

@implementation okiniiri
@synthesize customButton1;
@synthesize categoryTableView;
@synthesize picker;
@synthesize donebtn;
@synthesize doneview;
@synthesize sakujyobtn;
@synthesize contents;


- (void)viewDidLoad {
    [super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
//-- カスタムボタンの設定 その1 --//
self.customButton1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
self.customButton1.frame = CGRectMake(8.0, 5.0, 30.0, 30.0);
[self.customButton1 setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
[self.customButton1 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
[self.view insertSubview:self.customButton1 atIndex:2];

//arrayforkeyで保存されているファイルを呼び出す
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *array;
array = [_userDefaults arrayForKey:@"datacontent"];
if (array) {
//ファイルがあった場合は、contentsにかき出す
contents =  [array mutableCopy];
} else {
//ファイルがなかったら、arrayforkeyでファイルを作成、保存する
contents = [[NSMutableArray alloc] initWithObjects:@"aa",@"a", @"b", @"c", nil];
NSArray *array = contents;
[_userDefaults setObject:array forKey:@"datacontent"];
[_userDefaults synchronize];
}

 
activities = [[NSMutableArray alloc] initWithObjects:
@"11111",  
@"222222",  
@"33333"
@"4444",  
nil];
sakujyobtn.title = @"削除";
}

//テーブルのセルの行を決定
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [contents count];
}
//テーブルに表示する内容を決定する
- (UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath {

//同じ形式のセルを使うため、そのセルを再利用する
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"];
    if (cell == nil) {

//基本となるセルがまだ出来てなかったらセルを作成する
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
  reuseIdentifier:@"identifier"];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell autorelease];
    }
    
//indexpathに表示するテキストを決定する
    if (indexPath.row < [contents count]) {
        cell.textLabel.text = [contents objectAtIndex:indexPath.row];
    }
    return cell;
}

//セル選択時のアクションを設定
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// NSString* message = [contents objectAtIndex:indexPath.row];
NSString *message = [contents objectAtIndex:indexPath.row];
if (message == @"aaaaaa") {
NSURL *url = [NSURL URLWithString:@"https://www.facebook.com/sharer/sharer.php?u=http://douwashindan3310.appspot.com/kekka12.html"];
[[UIApplication sharedApplication] openURL:url];
} else {
NSURL *url = [NSURL URLWithString:@"http://www.atmarkit.co.jp/fcoding/articles/objc/05/objc05b.html"];
[[UIApplication sharedApplication] openURL:url];
}


}

//セルを本当に削除する
-(void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{
if (UITableViewCellEditingStyleDelete == editingStyle) {
//データソースからデータを削除
[contents removeObjectAtIndex:indexPath.row];
//テーブルから該当セルを削除
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
withRowAnimation:UITableViewRowAnimationFade];

//データを読み込んで削除=========================
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み
arr = contents;
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];
//データを読み込んで削除=========================

} else if (UITableViewCellEditingStyleInsert == editingStyle) {
//データソースに1件追加
[contents insertObject:@"new item" atIndex:(contents.count - 1)];
//テーブルにセルを追加
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
withRowAnimation:UITableViewRowAnimationTop];
}
}
-(IBAction)setEditing:(BOOL)editing animated:(BOOL)animated {

// 編集モードにする
if(self.categoryTableView.editing == NO) {
[self.categoryTableView setEditing:YES animated:YES];
sakujyobtn.title = @"完了";
} else if(self.categoryTableView.editing == YES)  {
[self.categoryTableView setEditing:NO animated:YES];
sakujyobtn.title = @"削除";
}
[super setEditing:editing animated:YES];
}

-(UITableViewCellEditingStyle)tableView:(UITableView*)tableView
  editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath
{
return UITableViewCellEditingStyleDelete;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
 }

- (void)viewDidUnload {
    [super viewDidUnload];
}

//-- アクションの設定 --------------------------------//
// 戻るボタンが押された時のアクションを設定します。
//-------------------------------------------------//
- (void)action:(id)sender
{
//表示していたビューを消す
[self dismissModalViewControllerAnimated:YES];
}

//-- アクションの設定 --------------------------------//
// 追加ボタンが押された時のアクションを設定します。
//-------------------------------------------------//
-(IBAction)setEditingadd:(BOOL)editing animated:(BOOL)animated {
picker = [[[UIPickerView alloc] initWithFrame:CGRectMake(0,265,320,200)] autorelease];
picker.delegate = self;
picker.dataSource = self;
[self.view addSubview:picker];
doneview = [[[UIView alloc]initWithFrame:CGRectMake(0,225,320,40)] autorelease];
doneview.backgroundColor = [UIColor blackColor];
doneview.alpha = 0.5;
[self.view addSubview:doneview];
donebtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
donebtn.frame = CGRectMake(230, 232, 80, 30);
[donebtn setTitle:@"完了" forState:UIControlStateNormal];
[donebtn addTarget:self
action:@selector(done:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:donebtn];
}


//列数の設定(設定する列の数をreturnで返す)
- (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}

//!!行も列も番号は0から始まるので注意
//列(componentの値で渡される)に対する、行数の設定(設定する行の数をreturnで返す)
- (NSInteger) pickerView: (UIPickerView*)pView
 numberOfRowsInComponent:(NSInteger) component {
  return [activities count];
}


//列(componentの値)、行(rowの値)に対する表示するものを設定
- (NSString*)pickerView: (UIPickerView*)pView
titleForRow:(NSInteger) row forComponent:(NSInteger)component {
return [activities objectAtIndex:row];
}
// 呼ばれるdoneメソッド
-(void)done:(UIButton*)button{
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:contents.count inSection:0];
/*NSInteger component = [picker selectedRowInComponent:0];
NSString* datatitle = [NSString stringWithFormat:@"%d",component];*/
//NSString *activity = [contents objectAtIndex: [picker selectedRowInComponent:0]];
NSString *activity = [activities objectAtIndex: [picker selectedRowInComponent:0]];
NSString *message = [[NSString alloc] initWithFormat: @"%@", activity];
[contents addObject:message];

//読み込んで追加=========================
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
NSMutableArray *mArr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み
mArr = [NSMutableArray arrayWithArray:arr];
[mArr addObject:message];
arr = mArr;
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];
//読み込んで追加=========================

//[contents addObject:datatitle];
[self.categoryTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
  withRowAnimation:UITableViewRowAnimationTop];
// ここに何かの処理を記述する
// (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます)
self.picker.hidden = YES;
self.donebtn.hidden = YES;
self.doneview.hidden = YES;
}

- (void)dealloc {
    [super dealloc];
[contents release];
}

@end
-------


ほんとに長いですね。
今回は、『NSUserDefaultsを使って、簡単なデータを保存する』がテーマなので、
ココをじっくり説明したいと思います。



1、まずはビューを開いたときに、以前登録してあるデータがあるか参照します。
- (void)viewDidLoadのところですね。
2、登録したデータがなかったら、データを用意して保存します。


//NSUserDefaultsを使うために初期設定をします。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
//arrayForKeyで指定したキーで以前のデータを呼び出します。
NSArray *array;
array = [_userDefaults arrayForKey:@"datacontent"];


if (array) {
//ファイルがあった場合は、呼び出したデータを
//テーブルに表示させるためのNSMutableArrayに読み込みます。
//NSMutableArrayにNSArrayの情報をいれるには、mutableCopyを使います。
contents =  [array mutableCopy];

else {

//ファイルがなかったら、arrayforkeyでファイルを作成、保存します。
//最初からテーブルに表示させるデータをcontentsに用意します。
contents = [[NSMutableArray allocinitWithObjects:@"aa",@"a"@"b"@"c"nil];

//contentsの中身を保存させるために、arrayに代入します。
//NSUserDefaultsは、NSMutableArrayのデータを保持することが出来ないので。。
NSArray *array = contents;

//どのキーで保存するかを指定します。
[_userDefaults setObject:array forKey:@"datacontent"];
//データを上書き保存します。
[_userDefaults synchronize];
}




3、追加した情報を同じキーで上書き保存します。
左下の追加ボタンで情報を追加した際にデータが上書きされる様に設定します。



//まずはデータを読み込みます。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
NSMutableArray *mArr;
arr = [_userDefaults arrayForKey:@"datacontent"]; 
mArr = [NSMutableArray arrayWithArray:arr];

//追加する情報をaddObjectで追加します。
[mArr addObject:message];
arr = mArr;

//同じキーを指定して上書き保存します。
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];


4、削除した情報を同じキーで上書き保存します。



//まずはデータを読み込みます。
NSUserDefaults *_userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arr;
arr = [_userDefaults arrayForKey:@"datacontent"]; //読み込み

//現在の情報を上書きするために配列に代入します。
arr = contents;

//キーを指定して上書き保存します。
[_userDefaults setObject:arr forKey:@"datacontent"];
[_userDefaults synchronize];


これで保存することが出来ました!
ぜひおためし下さい。