お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

webViewのキャッシュは強力らしい

iOSのwebViewのキャッシュが強力らしく、

開発中にwebのコンテンツをいくらデザイン変更しても

反映されない!というときに

このメソッドをひとつ仕込んであげると

キャッシュが消えるそうな。

 

読み込み開始前によばれるデリゲートメソッド内に書いたら

無事動きましたよんヽ(´ω)ノ

-(void)webViewDidStartLoad:(UIWebView *)webView{//データ読み込み開始

    //キャッシュデータクリア

    NSURLCache *cache = [NSURLCachesharedURLCache];

    [cache removeAllCachedResponses];

}

 

iOS5とiOS6の違い〜Twitter Accoutの挙動で注意すべき点!〜

iOS6になって新機能が追加されて、

設定画面からの制御事項みたいなものがより高度になっているようです。

かしこいのか不便なんだかってとこみたいです。

場合によっては実装を書き分けたほうがベター!

ということでご紹介。

 

TwitterFrameworkとAccountFrameworkを使ったアプリを

作ったので、参考になれば!

不確実&予測の情報多数なのであまり信用はしないでね←

あくまでも、参考になれば!(2回目)

 

Twitterまわりの実装コードについては

実装方法たくさん落ちてると思うので一旦はしょるとして、)

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

①アカウント許可認証

 -(void)twitterAuth

サンプルなどでは上記のような名前でよくあるメソッド。

「このアプリでTwitter利用許可していい?」というメソッドを実行すると、

iOS5:「利用を許可しますか?」というアラートが毎回出現\( ^ヮ゜)>

iOS6:シンプル&スマートに...毎回確認なんて行わないゼ?ヽ(´c_,`)ノ

どうやらiOS6では一回拒否を選択すると、

その後何回利用許可を求めるメソッドを実行したとしても

スルーされる?っぽい。

(多分もうハンドラの中すら通らないぽい)

 

※極端な【例】

画面1〜5まであって順番に遷移するとして、

毎画面のviewDidLoadでこのAuthをよぶとすると、

iOS5:画面1「いいすか?」-(拒否)→画面2「いいすか?」-(拒否) と毎回出現

iOS6:画面1「いいすか?」-(拒否)→画面2以降はスルー

 

ということですね。

つまりこのステータスを変えるには、

iOS6の場合、設定画面へいって対象アプリへのTwitter利用を

「オン」に変更してもらう必要があります。

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

②警告アラートの表示

そんなこんなで、

アカウントの利用許可を(しつこく)求めたいのであれば、

何かしらの判定を行って、

アカウント認証が拒否られた情報をもたせて、

NOだったらアラートを表示するとかしなきゃですね。

 

でもiOS5の人にとっては

別にAuth書いとくだけで毎回認証を行ってくれるので、

拒否ったうえに「設定画面いけよ!」とかいうアラートはうざいわけです。

しかもいかなくてもその認証アラートで許可しちゃえばよいわけで。

 

ということは、このアラートに書き分けが必要です。

私の場合判定を行ってアカウント利用が許可ではなかった場合、

以下のように書いてます。

(判別のところははしょっています)

※iOS5の人向けの // ->設定画面へいかす てのはアプリ内の画面のことです

 

-(void)showAuthDeniedAlert{

    if ([[[UIDevicecurrentDevice] systemVersion] floatValue] < 6.0f){

    //iOS6以下の場合アカウントが未設定かアクセス拒否

    UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"エラー"

                                                    message:@"Twitterアカウントが\n設定されていないか、\nアプリケーションへ\nTwitterの利用が\n許可されていません。"

                                                   delegate:self

                                          cancelButtonTitle:nil

                                          otherButtonTitles:@"OK", nil];

    alert.tag = TWITTER_AUTH_DENIED_ALERT;

    [alert show];

    [alert release];//設定画面へいかす ->

    

    } elseif ([[[UIDevicecurrentDevice] systemVersion] floatValue] >= 6.0f){

    //iOS6以上の場合端末の設定へいってください。

        UIAlertView *twAlert = [[UIAlertView alloc]initWithTitle:@"エラー"

                                                         message:@"iPhoneの設定画面から\nTwitterを設定してください。"

                                                        delegate:nil

                                               cancelButtonTitle:nil

                                               otherButtonTitles:@"OK",nil];

        [twAlert show];

        [twAlert release];

     }

}

 

ここで凡ミスったのは、OSの判定文。(笑)←

iOS5、iOS6と普段くちで言うせいで 頭の中では

>= 6.0f( iOS6以上の人)

>= 5.0f( iOS5以上の人)

とかいうアホな判定式をはじめ書いて、

毎回OS5の人向けのアラートしか出ない...!なんでだ!

ってはじめなったw今考えるとすごいアホw

 

あとは

>= 6.0f

=< 6.0f

てのもうまくいかんから気をつけてくださいw(←一回やった人)

 

そんな感じでうまく判定できれば

書き分けが思った挙動になりますよん。

説明がまぜまぜなので

このまま使うとへんなことにもなると思いますが

参考になれば!

UIAlertViewのワンポイント

アラートを出したいときに、

OKボタンとcancelボタンを設置したいだとか、

OKボタンだけだけどその後に何かアクションをさせたい

というとき以外(つまりただ警告だして閉じたいだけ)のときは、

delegate:nil

というふうにnilを指定してあげたほうが良い◎

 

特にこいつに指示がないのに、

delegate:self とかって指定してると、

そのあとに何かあるんじゃないかってwktkして健気に見に行って、

「アクションないよう!」

て落ちてた?みたいな現象が起こったのでメモ。

メーラー エンコード 文字化け

Webviewからmailto:っていうスキームをひろって

メーラーを起動して本文を入れておきたい!

というときに、

日本語の場合は必ずencodeをかけないといけなくて、

たとえば

 

<case 1>

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

●宛先:xxx@mail.com

●題名:おはよう

●本文:[NSString stringWithFormat:@"朝ですね。%@", _msg];

( _msg = @"あいらぶゆー!" ; )

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

この場合、以下のようにします。

 

    NSString* title = @"おはよう";

    NSString* body = [NSString stringWithFormat:@"朝ですね。%@",_msg];

    NSString* mailtoURL = [NSStringstringWithFormat:@"xxx@mail.com?subject=%@&body=%@",

                           [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

                           [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:mailtoURL]];

 

stirngByAddingPercent...メソッドでUTF8にエンコードかけているので

これでスンとメーラーが立ち上がってくれるはず!

 

ではでは、

<case 2>

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

●宛先:xxx@mail.com

●題名:おはよう

●本文:[NSString stringWithFormat:@"朝ですね。%@", _msg];

( _msg = @" &あいらぶゆー!" ; )

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

私の場合ここで詰まった!

同じように書いたはずなのに、途中で本文が切れている!

な ぜ 。 

 

問題はこの変数_msgに入れる文字でした。

(普通に打てばこの不思議現象は起こらないのかもしれないのですが、)

html内から拾った場合、「&」という文字以下が拾えなくなってしまいます。

一般的には

*「html escape」とか、*「url encode」とかっていうキーワードでぐぐると

情報はいくつかあるようです。

 

わたしも上記のメソッドはいくつか調べて実行してみたのですが、

うまく反映されず、結局ブチっと切れたメールしか立ち上がらず..

最終的にこの方法で解決しました!↓

 

①まずは文字コードに変換するメソッドを用意

-(NSString *)htmlEntityEncode:(NSString *)string

{    

    string = [string stringByReplacingOccurrencesOfString:@"&"withString:@"%26"];

    string = [string stringByReplacingOccurrencesOfString:@"?"withString:@"%3f"];

    

    return string;

}

NSStringのメソッドで、文字を置換するメソッドがあります。

これを使って、@"&"という文字がきたら

この文字コードに変換してね、と書いてやります。

他にもあらゆる記号で文字コードさえかければ変換かけれます。

 

②本文をまずUTF8に変換する

 NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

先ほどのmailtoの作成で使ったメソッドと同じものをbodyに対してかけます。

 

③それをさらに文字コード変換する

    NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString* enc = [self htmlEntityEncode:body];

追加したメソッドを実行するときはselfで。

 

④できあがったNSStringをそのままメールにつっこむ

    NSString* title = @"おはよう";

    NSString* body = [[NSString stringWithFormat:@"朝ですね。%@",_msg] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSString* enc = [self htmlEntityEncode:body];

    NSString* mailtoURL = [NSStringstringWithFormat:@"xxx@mail.com?subject=%@&body=%@",

                           [title stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],

                            enc];

    [[UIApplicationsharedApplication] openURL:[NSURLURLWithString:mailtoURL]];

これ、やってみるとわかるかと思いますが、

AddingPercent...を使わずに普通に代入してメーラーを起動しようとすると

ぴくりともしないので、

絶対にこの書き方じゃないとダメなのかと思いきや、

実はエンコードさえちゃんとかかっていれば認識して立ち上がってくれます。

ちなみにhtmlEntityEncode→UTF8Encodeの順だとうまくいきません(注)※

 

メソッドとステップを1つ追加で無事解決!

誰かの参考になりますようにヽ(´ω)ノ♪

 

メモリ管理

よくわかってないけどとりあえず

 

はじめにViewDidLoadでMutableArrayをallocすると、

(@propertyもつくって落ちにくくする)

今回特にaddObjectは明示的にしてなくて、

よそからひっぱってきてそのまま値を入れて使っている場合、

途中で中身を入れ替えたいときに一旦からにする際、

 

①まず、「中身が入っている」という判定に、

1●if (self.array != nil){     と書くか

2●if ([self.array count] > 0) {  と書くか迷った。

 

②次にその「中身を空にする」という作業で

1■self.array = nil;        と書くか

2■[self.array removeAllObjects];  と書くか迷った。

 

結果、●のときは、

中身はたしかに入っているはずなのに、

2の判定式は通らないという現象が...なんでだろう。

だからとりあえず!=nilをつかった。

 

■のときは、ログを吐くと

1をつかうとself.array = (null)となっているのに対し、

2をつかうとself.array = ()となった。

addObjectsしてないからremoveは危険かも、と思ったけど

object自体はなくなりはしないみたい。

property効果かな。

このへん本当に難しくて違いがわからない(;_;)

結局どっちが使えばいいのかわからず、今のとこは2を使ってる。

誰か教えて...orz

文字のアニメーション

Blocksで簡単にアニメーションが出来るのはやったことあったけど、

UIViewだけかと思っていたら

どうやらUILabelでも出来るとの噂!

ちょっとトライしてみる!(どきどき)

http://sarudeki.jp/dconcent/code_memo/animate/

xcode 4.5 xib 〜scrollViewとWebView〜

scrollViewの使い方むずい。

いつも無駄にイライラするからメモっとっく。

 

◆scrollView

xib側の設定で高さ調節。

中のコンテンツサイズも指定してboundsの跳ね返り調節。

セットする。

                self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"bg.png"]];

                [_howtoView setFrame:CGRectMake(0, 39, 320, 770)];

                _howtoView.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"bg.png"]];//パターン塗り

                [_scrollView addSubview:_howtoView];

                [_scrollView setContentSize:_howtoView.frame.size];

                [self.viewinsertSubview:_scrollViewbelowSubview:_navigationView];

 

 

かつ、addするビューの中身は上下サイズをびよーんて伸ばすかどうするか

みたいなチェックを「縦も横ものばしません!」にして、

上と左の幅?みたいなやつだけチェック。

スクロールビュー自体には全部チェックを入れると思ったようになってくれた..

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

*追記*

スクロールビューを使うときは、

スクロールビュー自体のサイズは320*480(320*568)内におさめて、

中のコンテンツの長さ(たとえばUIView)を320*1000とかにして使います!

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

◆webView

[self.webViewsetFrame:CGRectMake(0, 39, 320, 509)];

            _webView.backgroundColor = [UIColorclearColor];

           // self.navigationController.title = self.title;

            self.webView.scalesPageToFit = YES;

            [self.viewinsertSubview:self.webViewbelowSubview:_navigationView];//webViewnavigationViewの下に

            [self.view addSubview:_waitingView];

xib側のwサイズ調節というよりかは中のコンテンツサイズで長さ調節した。

 

 

どういうこっちゃ。

ただ、xibの画面上ですでにのっかっているものは

addとかしないでねん∩(´∀`)∩

addしてるやつは重ねて無い状態でviewだけ作ったやーつ。