ラベル NSString の投稿を表示しています。 すべての投稿を表示
ラベル NSString の投稿を表示しています。 すべての投稿を表示

9/26/2011

短縮URLを作るNSString (shortURL) カテゴリ

昨日の短縮URLを展開するNSString (expandURL) カテゴリと対となるカテゴリ。
Bitly APIを使用しているので、事前にBitlyのアカウントとAPIキーを取得しておく必要がある。また、JSON形式の返り値をNSDictionaryに変換するためにSBJSONを使用している。


NSString+shortURL.h
#import <Foundation/NSString.h>

@interface NSString (shortURL)
+ (NSString *)shortURL:(NSString *)longUrl;
@end

NSString+shortURL.m
#import "NSString+shortURL.h"
#import "SBJson.h"

static NSString *kBitlyWrapperString = @"http://api.bit.ly/shorten?version=2.0.1&format=json&longUrl=";
static NSString *kBitlyFootterString = @"&login=ログイン名&apiKey=APIキー";

@implementation NSString (shortURL)

+ (NSString *)shortURL:(NSString *)longUrl{
NSString *aaa = nil;
NSString *escapeStr = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)longUrl, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
NSString *str = [NSString stringWithFormat:@"%@%@%@",kBitlyWrapperString,escapeStr,kBitlyFootterString];
NSURL *url = [NSURL URLWithString:str];
NSData *data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *tempStr = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [tempStr JSONValue];
NSLog(@"%@",[aDic description]);
NSNumber *errorCode = [aDic objectForKey:@"errorCode"];
NSString *statusCode = [aDic objectForKey:@"statusCode"];
if ([errorCode intValue] == 0 && [statusCode isEqualToString:@"OK"]) {
NSDictionary *results = [[aDic objectForKey:@"results"]objectForKey:longUrl];
NSString *shortUrl = [results objectForKey:@"shortUrl"];
aaa = shortUrl;
} else {
aaa = longUrl;
}
} else {
aaa = longUrl;
}
return aaa;
}

@end

9/25/2011

短縮URLを展開するNSString (expandURL) カテゴリ

短縮URLを見ない日はなくなった。
Twitterなどは自前でt.coなる短縮URLを用意して悪意のある短縮URLからユーザーを守ろうという試みも行われている。また、アクセスの解析も行われているようだ。

iOSアプリケーションを開発する上では、短縮URLを展開して元URLのURLスキームを解析することにより、UIApplicationの-(BOOL)OpenURL:(NSURL *)メソッドを使用するか否かの判断が可能になる。
これを使用するとSafariやその他の外部アプリケーションが起動されるため、ユーザーが自前のアプリケーションから離れてしまうからだ。

この短縮URLを展開してくれるAPIが幾つか存在するので、その中の2つを使ってNSStringのカテゴリとしてまとめてみた。

APIが返す値はJSON形式で返ってくるものを選び、SBJSONを利用してNSDictionary形式に変換、後続の処理を行なっている。失敗した場合は展開前の短縮URLが返るようにしてある。展開できる短縮URLの種類はAPIに依存しているので注意されたし。またAPIサービスそのものの業務継続性にも注意が必要。

NSString+expandURL.h

#import <Foundation/NSString.h>

@interface NSString (expandURL)
+ (NSString *)expandURL:(NSString *)urlStr;
@end

NSString+expandURL.m

#import "NSString+expandURL.h"
#import "SBJson.h"

@implementation NSString (expandURL)

+ (NSString *)expandURL:(NSString *)urlStr{
NSString *str = nil;
NSURL *url = nil;
NSData *data = nil;
NSString *aaa = nil;
str = [NSString stringWithFormat:@"http://api.unshort.me/?r=%@&t=json",urlStr];
url = [NSURL URLWithString:str];
data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *result = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [result JSONValue];
NSString *status = [aDic objectForKey:@"success"];
if ([status isEqualToString:@"true"]){
aaa = [aDic objectForKey:@"resolvedURL"];
} else {
aaa = urlStr;
}
} else {
str = [NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@",urlStr];
url = [NSURL URLWithString:str];
data = [NSData dataWithContentsOfURL:url];
if (data) {
NSString *result = [[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
NSDictionary *aDic = [result JSONValue];
NSString *status = [aDic objectForKey:@"status"];
if ([status isEqualToString:@"OK"]){
aaa = [aDic objectForKey:@"end_url"];
} else {
aaa = urlStr;
}
} else {
aaa = urlStr;
}
}
return aaa;
}

@end