アプリからウェブページを呼び出す

ウェブページの表示とか、ウェブページの呼び出しとか、アプリにちょっとしたヘルプを付けたり、ネットワークを通して外部のページを呼び出したり、覚えておくと以外に便利につかえるものです.

ゲームアプリだと、ヘルプの表示に利用するのがほとんどだと思うんですけど...

そんなわけで、アプリから safari を呼び出してみたり、アプリ内部の html を自身のアプリで表示したりしてみました.

WebView

UIWebView を利用すると、手軽にアプリ内で webページの表示を行うことができる.

表示できるページは、通常の Safari と同様、url を指定してインターネット上のページを開くこともできるし、
アプリケーションに含めたhtmlなんかも表示することができる.

@interface WebToSampleAppDelegate 
    : NSObject <UIApplicationDelegate>
{
    UIWindow* m_window;
    IBOutlet UIWebView* m_web_view;
}

@property (nonatomic, retain) IBOutlet UIWindow* window;
@property (nonatomic, retain) UIWebView* webView;

/// WebView の表示へ
- (IBAction) gotoWebView;

@end
@implementation WebToSampleAppDelegate

@synthesize window = m_window;
@synthesize webView = m_web_view;

- (void)applicationDidFinishLaunching:(UIApplication *)application
{    
    [m_window addSubview:m_web_view];
    [m_web_view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://d.hatena.ne.jp/It_lives_vainly/"]]];
    [m_window makeKeyAndVisible];
}

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

@end

切りはりしただけなんで、このコードでそのまま動かなかったらごめん.
まぁ、このぐらいで出来ますよ程度に捉えてもらった方が良いかと...

UIWebView の loadRequest には、NSURLRequest を指定することになる.
NSURLRequest には、 NSURL を渡すのだが、この URL がファイルのURLだったら、そのファイルが開かれることを覚えておきたい.

つまり、アプリケーション内にあるhtmlを開くことも可能.

具体的な指定方法は、次のようになる

    NSString* a_path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
    NSURL* a_url = [NSURL fileURLWithPath:a_path];
    [m_web_view loadRequest:[NSURLRequest requestWithURL:a_url]];

URLスキームの利用

iPhone では、自分以外の iPhone アプリケーションと連動して動作する仕組みとして、URLスキームを利用することができる.

つまり、これを利用して、自作のアプリから Safari を呼び出したり、 Mail,AppStore,YouTube,Maps 等を呼び出すことができる.
(他のアプリが呼び出された場合、アプリは終了する)

URLスキームなどと言っても特に難しいことはなく、 YouTube の動画へのURLを指定すれば YouTube アプリケーションが立ち上がるし、
AppStore へのURLなら AppStore アプリが立ち上がる.

念のため、エントリーの下の方に例示をしておく.

※ URLスキームを使って、他の*自作*アプリを呼び出すこともできるんですか?(教えて偉い人)

URLを指定して Safari を開く

アプリケーションから、URLを指定して Safari を開くのは次のようにする.
(アプリは終了する)

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://d.hatena.ne.jp/It_lives_vainly/"]]; 

ここで指定するURLにも、当然のようにURLスキームが利用できるので、直接アプリの"Maps"や"YouTube","AppStore"を
呼び出すことが可能.

URLスキームの補足

URLスキームは、アプリから呼び出す時以外に、htmlから指定することも可能.(むしろ、そちらが本分)
htmlから指定するときには、通常のリンクと同様にリンクのタグで指定すればよい.

<a href="http://www.xxxx.jp/">HIGI Page.</a><BR>
<a href="mailto:hogehoge@me.com">higp_support@hicorp.co.jp</a><BR>
<a href="tel:03-0123-4567">03-0123-4567</a><BR>
<a href="http://www.youtube.com/watch?v=xxxxxx">Youtube.<a><BR>>
<a href="http://maps.google.com">map.<a><BR>
<a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=xxxxx&mt=x">store<a><BR>
Mail
NSURL* a_url = [NSURL URLWithString:@"mailto:hogehoge@me.com"];
電話
NSURL* a_url = [NSURL URLWithString:@"tel:03-0123-4567"];

htmlで指定した場合、電話番号の検出は、(デフォルトでは)自動でも行われてしまうので、誤った解釈をされたくない場合には、
htmlにメタタグを埋め込んでおく必要がある.

<head>
  <meta name = "format-detection" content = "telephone=no">
</head>
YouTube
NSURL* a_url = [NSURL URLWithString:@"http://www.youtube.com/watch?v=xxxxxxxx"]
Maps
NSString* a_addr = [NSString stringWithCString:"JR東京駅" encoding:NSUTF8StringEncoding];
NSString* a_query = [a_addr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
NSURL* a_url = [NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", a_query]];  

アプリから使用したい場合には、クエリーの文字列に気を付けること.
上の例を参考にしていただければ分かると思うが、 UTF8エンコーディングを行っている.

google map のクエリーは、他にも色々あるようだが割愛する.

AppStore
NSURL* a_url = [NSURL URLWithString:@"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=xxxxxxx&mt=xxx"]

AppStore へのリンクは、規則がめんどくさいので、生成のために "ITMS Link Maker" というwbbebベースのツールを利用する.

ITMS Link Maker へのリンク.
http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStoreServices.woa/wa/itmsLinkMaker

おわりに

さすがにこのあたりのことは、きっちりと整備されていてとても便利です.