2011/05/29

NSURLConnectionで自己認証証明書回避について

アプリとサーバを組み合わせたシステムを開発するとき、
まだSSLの証明書が正式なものではないことがよくある。
この場合は自己認証証明書を使用するのだが、普通にNSURLConnectionとかでアクセスするとエラーで取得できない。
↓こんなエラー
Error Domain=NSURLErrorDomain Code=-1202

そのための回避方法は以下の通り
- (void) httpRequest:(NSURL*)url
{
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection connectionWithRequest:request delegate:self]; 
}

#pragma mark - NSURLConnectionDelegate
// 以下 SSL回避 ...
- (BOOL) connection:(NSURLConnection *)connection 
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] 
             forAuthenticationChallenge:challenge];
    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

あと、よく見かける方法はNSURLRequestをオーバーライドする方法。
@implementation NSURLRequest(SSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host {
    // do some filter based off of "host" here
    return YES;
}
@end
/*NSURLRequestをオーバーライドする方法は正直よく分からない。。
何故かうまくいかないんだよね(´・ω・`)*/

ちなみに、アプリ申請時にはこのあたりはコメントアウトするなりして無効にすること。

2011/05/14

Twitterやfacebookを簡単に導入できるShareKitが思いのほか便利な件

Twitterとかfacebookとか自分でいちいち作るのはけっこう面倒だったんだけども、
いいのがあるよと教えてもらったのがこのShareKit
「3行で簡単実装できる!」が売りらしいです。
実装はこんな感じ
SHKItem *item = [SHKItem URL:[NSURL URLWithString:@"http://getsharekit.com"]
                                                  title:@"ShareKit is Awesome!"];
SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
[actionSheet showFromToolbar:navigationController.toolbar];
これでOK(設定ファイルでいろいろ設定する必要があるけど)
アクションシートでTwitterだったりfacebookだったりが選択できる。

でもこの場合だ必ずアクションシートが表示される。
まぁ、ソースを見ればわかるけど、
「このボタン押したらTwitterの投稿画面が表示したいよー」という場合は
SHKItem *item = [SHKItem URL:[NSURL URLWithString:@"http://getsharekit.com"]
                                                  title:@"ShareKit is Awesome!"];
[SHKTwitter performSelector:@selector(shareItem:) withObject:item];
とすればOK
facebookとかも同様にできる。。が、itemのところはtextで設定しないとデフォルトで表示させたい文字がはいらなかった。
また今度ちょっと時間がある時に見てみる。
あと、環境によっては
#import </usr/include/objc/objc-class.h>
でエラーがでる。
その場合
#import <objc/objc-class.h>
とするとか
#import <objc/runtime.h>
とするといいらしい。

※追記
一度表示した後閉じて、表示していたViewControllerを閉じて再度表示するとEXE_BAD_ACCESSになっていた。
どうやら「currentHelper」がリリースされていないのが原因らしい。
適当に「- (void)hideCurrentViewControllerAnimated:(BOOL)animated」の中でリリースするようにしてみたら
とりあえず、エラーはでなくなったけど。
元のコードを変えることなく、修正できないものか・・・うーん。
でも便利なようで不便なShareKit....