iPhoneアプリの開発について - オフライン表示の方法がわからない

このQ&Aのポイント
  • iPhoneアプリの開発において、ウェブサイトをローカルに保存しオフラインで表示する方法がわかりません。試した方法では正しく表示されず、スマートフォン向けのページがPC版として表示されました。
  • 使用したプログラムに一部間違いがあるのか、それとも方法自体が間違っているのかわかりません。ご指摘いただけると幸いです。
  • 他の方法として、Qiitaの記事を参考にして試しましたが、同様にオフラインでの表示ができませんでした。
回答を見る
  • ベストアンサー

iPhoneアプリの開発についてです。

ウェブサイトをローカルに保存しオフラインでUIWebViewに表示したいです。 http://blog.livedoor.jp/sionami/archives/3551091.htmlのサイトを参考にし実行してみましたが、オフラインでは表示されませんでした。また、表示されたサイトは(オンライン時)スマートフォン向けだったページがPC版の表示で表示されました。 以下が実行したプログラムです。コードの一部が間違っているのでしょうか。それともやり方そのものが間違っているのでしょうか。ご指摘お願いします。(エラー時のプログラムは省略しました) NSString *filePath; - (void)downloadHTML:(NSString *)html { NSString *directoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"]; //ダウンロードファイルの保存先 NSString *fileName = [html lastPathComponent]; filePath = [[directoryPath stringByAppendingPathComponent:fileName] stringByStandardizingPath];//保存したファイルへのパス NSURL *url = [NSURL URLWithString:html]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLResponse *response = nil; NSError *error = nil; NSData *data = [ NSURLConnection sendSynchronousRequest : request returningResponse : &response error : &error ]; //ファイル書き込み NSFileManager *fm = [NSFileManager defaultManager]; [fm createFileAtPath:filePath contents:[NSData data] attributes:nil]; NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:filePath]; [file writeData:data]; } - (IBAction)refresh:(UIButton *)sender { NSString *htmlStr = [NSString stringWithContentsOfFile:filePath]; [_myWebView loadHTMLString:htmlStr baseURL:nil]; } また、http://qiita.com/EntreGulss/items/8da6847e4dae59bfb1ebのサイトの方法も試しましたが同じくオフラインで表示されませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> iOSシミュレータでは機内モードができずずっとPCのWIFIを切って実行していたのでそれが原因だったと思います。 シミュレータなら、その方法でオフラインにできるはずです。 サンプルプロジェクトのRNCachingURLProtocol.mのuseCacheメソッド内の reachableがNOになればオフラインと認識されるわけですが、 私の方でシミュレータを使ってWi-FiをOFFにしたらreachableはNOになりました。 うまく行かないならオフラインモードとオンラインモードを切り替えるスイッチを 画面内に作り、useCacheメソッドでそのスイッチの値を返却するよう サンプルプロジェクトを改造してもよいと思います。 で、このサンプルプロジェクトがちゃんと動作しているのかもう少し調べてみました。 すると、cnn.com、bbc.comとwww.yahoo.co.jpはちゃんとキャッシュできるのですが、 yahoo.comとwww.google.co.jpは一部しかキャッシュされてなく、正しく動作して いないことがわかりました。 (www.yahoo.co.jpとwww.yahoo.co.jpは独自で追加したものです。) その原因を調べたところ、yahoo.comとwww.google.co.jpは内部でhttpsに リダイレクトされているようで、このサンプルプロジェクトがhttpsのページを キャッシュするようにできていないためでした。 問題は、このサンプルプロジェクトのRNCachingURLProtocol.mの canInitWithRequestメソッド内で[[request URL] scheme]が @"http"の場合だけYESを返すようになっているところです。 ここを@"http"または@"https"の場合とするよう条件式を変更するだけで、 httpsのページにも対応でき、yahoo.comとwww.google.co.jpも 正しくキャッシュできるようになりました。 ここを修正して、うまくオフライン表示できるか試してみてはどうでしょうか? > ここから特定のキャッシュのパスを取得するにはどうしたらいいでしょうか? > またパスを取得できたとして > [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:path]]]; > でサイトはオフラインで開けるのでしょうか? この質問の意味があまりちゃんと理解できてないのですが、 サンプルプロジェクトでキャッシュしたデータはどこに保存されているか? という意味でしたら、 RNCachingURLProtocol.mのcachePathForRequestメソッドで リクエストURLに対応するキャッシュファイル名を求めているので その処理を確認すればよいと思います。 また、このキャッシュファイルにデータを書きだす処理は RNCachingURLProtocol.mのconnection:willSendRequestメソッドの [NSKeyedArchiver archiveRootObject:cache toFile:cachePath]; の部分です。 そして、キャッシュファイルからデータを読み込む処理は RNCachingURLProtocol.mのstartLoadingメソッドの RNCachedData *cache = [NSKeyedUnarchiver unarchiveObjectWithFile:[self cachePathForRequest:[self request]]]; になります。 このあたりが理解できればキャッシュを読み書きする処理も 自分の好きなように作れると思います。 ただ、このサンプルプロジェクトはかなり難しいので、本当に理解するには 「URLローディングシステムプログラミングガイド」 https://developer.apple.com/jp/devcenter/ios/library/documentation/URLLoadingSystem.pdf をちゃんと読んだ方がよいと思います。

nylonraw999
質問者

お礼

質問が分かりにくくなってしまってすみません。 でもなんとか意図は伝わっているようなので良かったです。 わざわざそちらでテストまでしてもらってありがとうございます。 あとは何とか自分でやってみようと思います。

その他の回答 (1)

回答No.1

質問に書かれているdownloadHTMLメソッドとrefreshメソッドを使って ごく簡単なHTMLファイルをキャッシュし、オフラインで表示してみましたが 問題なく表示されましたよ。 ただ、このコードは、HTMLファイル内の画像リンク(img srcタグ)等、 別ファイルで定義されている情報を自動的に読み込んでキャッシュする 機能はありません。 したがって、画像ファイルのあるWebページやCSSファイル/JavaScriptファイルを 使ったページ等、要するに一般的なWebサイトには対応できないと思います。 また、 > 表示されたサイトは(オンライン時)スマートフォン向けだったページがPC版の表示で表示されました。 この原因は、NSURLRequestでリクエストする時のUser-Agentが 「User-Agent: (アプリ名)/(ver.) CFNetwork/(ver.) Darwin/(ver.)」 という形式になるため、iPhoneのブラウザからのアクセスではなく アプリからの独自リクエストと認識されたためだと思います。 (User-Agentのことを知らなければ検索してください) で、一般的なWebサイトの情報をiPhoneからアクセスした形でローカルに 保存したいということであれば、質問の最後に書かれてあった http://qiita.com/EntreGulss/items/8da6847e4dae59bfb1eb の方法で実装する必要があると思います。 質問では、この方法でもオフラインで表示されなかったとのことですが、 この記事は概要が書かれてあるだけで、実際にはその記事から リンクされている https://github.com/EntreGulss/CachedWebpage のサンプルプロジェクトをダウンロードして実行するだけだと思います。 実際に私の方でダウンロード/実行してみたところ、古いプロジェクトなので AutoLayoutの使用でエラーが出たりしましたが、AutoLayoutの使用をOFFに すれば、普通に実行できて、一般的なyahoo等のWebページをキャッシュし オフラインで表示できました。 なお、このサンプルは通信経路があるかどうかを「Reachability」という クラスを使って判断し、通信経路がない場合だけキャッシュから読み込みますから 一度Webサイトにアクセスした後、機内モードに変更する等した上で 再読み込みボタンを押す必要があります。 そうするとキャッシュから読まれます。 あと、JavaScriptを使ってページ内で追加データを取得するようなケースには このサンプルでも当然対応できませんから、うまく表示されない時は 問題のWebページがどのような内容になっているか調べる必要があると思います。

nylonraw999
質問者

補足

回答ありがとうございます。 iOSシミュレータでは機内モードができずずっとPCのWIFIを切って実行していたのでそれが原因だったと思います。 私はまだ実機でテストできる環境ではないのでキャッシュを読み込めるならhttp://qiita.com/EntreGulss/items/8da6847e4dae59bfb1ebのやり方で作業の方を進めていこうと思います。 そこで、取得した特定のキャッシュをNSUserDefaultなどに入れておき自由に取り出せるようキャッシュのパスを取得→保存→取り出し→読み込みをしたいと思います。 http://d.hatena.ne.jp/ntaku/20110104/1294146555にキャッシュが保存されるというキャッシュディレクトリのパスがありました。 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *dir = [paths objectAtIndex:0]; ここから特定のキャッシュのパスを取得するにはどうしたらいいでしょうか? またパスを取得できたとして [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:path]]]; でサイトはオフラインで開けるのでしょうか? 差し支えなければ回答お願いします。

関連するQ&A

  • objective-Cについてご相談があります。

    現在objective-cを勉強中なのですが、 jsonについて教えて頂きたい事があります。 jsonのファイル・データ・オブジェクトそれぞれを 取得する必要があると習ったのですが、それらの違いが 今ひとつ分かりません。 下記のような記述なのですが、それぞれの違いをどなたか ご教示頂けないでしょうか。 // 対象Jsonファイル取得 NSBundle *bnd = [NSBundle mainBundle]; NSString *ptn = [bnd pathForResource:@"Test01" ofType:@"json"]; NSURL *url = [NSURL fileURLWithPath:ptn]; // Jsonオブジェクトの取得 NSURLRequest *req =[NSURLRequest requestWithURL:url]; NSData *dat = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; // Jsonデータの取得 NSDictionary *dick01 = (NSDictionary *) [NSJSONSerialization JSONObjectWithData:dat options:NSJSONReadingMutableContainers error:nil]; 以上、何卒宜しくお願い致します。

  • iphoneアプリの開発

    電卓アプリを作っています。 今困っているのは 1.割り算で小数点以下の計算ができない。 2.3つ以上の計算が(2×3×4のような)足し算しかできない。 3.間違えて数値を入力した場合に使うバックスペース的なボタンの作り方。 です。 どれか一つでもいいのでアドバイスいただけたらありがたいです。 #import "myViewController.h" @implementation myViewController // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. } return self; } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; startInput = YES; currentValue = 0; } -(IBAction)numberButtonPressed:(id)sender { UIButton *b = (UIButton *)sender; if( startInput ){ // 最初の1桁目が0なら表示しない if( b.tag == 0 ) return; // 新しく表示する文字列を作成 label.text = [NSString stringWithFormat:@"%d", b.tag]; startInput = NO; } else { // すでに表示されている文字列に連結 label.text = [NSString stringWithFormat:@"%@%d", label.text, b.tag]; } NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)equalButtonPressed:(id)sender { currentValue = sum; sum = sum-sum; // 直前に押された演算子で場合分け if( operation == 0 ){ currentValue += [label.text intValue]; } else if( operation == 1 ){ currentValue -= [label.text intValue]; } else if( operation ==2){ currentValue *= [label.text intValue]; } else if (operation ==3){ currentValue /= [label.text intValue]; } // 表示の更新 label.text = [NSString stringWithFormat:@"%d", currentValue]; startInput = YES; label2.text =@"="; NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)opButtonPressed:(id)sender { UIButton *b = (UIButton *)sender; // 現在値の保存 if( operation == 0 ){ currentValue= [label.text intValue]; sum +=currentValue; label.text =[NSString stringWithFormat:@"%d", sum]; } // 演算の保存 operation = b.tag; startInput = YES; if( operation == 0 ){ label2.text =@"+"; } if( operation == 1 ){ label2.text =@"-"; } if( operation == 2 ){ label2.text =@"×"; } if( operation == 3 ){ label2.text =@"÷"; } NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)clearButtonPressed:(id)sender { label.text = @"0"; startInput = YES; label2.text =@""; NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [super dealloc]; } @end

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa

  • xcode iOSでのファイル操作について。

    知っている方、いましたらご教授お願いいたします。 ■現状 xCodeにてios7アプリを開発中で、ボタンが押下されたら テキストファイルへ文字列を保存するものを作っています。 しかしながら、なぜかテキストファイルへの保存がiosシュミレーター上で失敗してしまいます。 ソースコードは以下になります。 ■ソース NSString *homeDir; NSString *docDir; NSString *filePath; NSString *str; NSError *error; //Homeディレクトリのパス取得 homeDir=NSHomeDirectory(); //Documentsディレクトリのパス作成 docDir=[homeDir stringByAppendingPathComponent:@"Documents"]; //ファイルのパス作成 filePath=[docDir stringByAppendingPathComponent:@"test.txt"]; //ファイルのパスを表示 NSLog(filePath); //ファイルへの書き込み str=@"test¥ntest¥ntest"; //testを3行書く //[str writeToFile:filePath atomically:YES]; BOOL result = [str writeToFile:inSaveFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error]; if(result != YES) { NSLog(@"Error:%@", [error localizedDescription]); } ■エラー内容 error NSError * domain: @"NSCocoaErrorDomain" - code: 4 0x08dd4130 なにが悪いのかがさっぱり分からず困惑しています。 サンプルページなどでも構いませんので、ご教授のほどお願いいたします。 以上、よろしくお願いいたします。

  • objective-cで困っています。

    objective-cをトライ&エラーで試しながら学習しているのですが、 下記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。 現在tml5のcanvasを使ってお絵描きアプリを作りました。このcanvasに書き込んだデータをiPhoneのカメラロールに保存することをトライしています。いろいろ調べてみると「HTML5 CANVASの描画内容をUIImage経由でカメラロールに保存する」という記事をみつけました。http://lab.spec5zigen.com/archives/html5-canvasの描画内容をuiimage経由でカメラロールに保存する/ その記事を参考に #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // UIWebViewのインスタンス化 CGRect rect = self.view.frame; UIWebView *webView = [[UIWebView alloc]initWithFrame:rect]; // Webページの大きさを自動的に画面にフィットさせる webView.scalesPageToFit = YES; // デリゲートを指定 webView.delegate = self; // URLを指定 NSURL *url = [NSURL URLWithString:@"http://xxxxxxxxxxxxxxxxxxxxxx"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // リクエストを投げる [webView loadRequest:request]; // UIWebViewのインスタンスをビューに追加 [self.view addSubview:webView]; } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ return YES; } NSString * requestString = [[request URL] absoluteString]; NSArray *params = [requestString componentsSeparatedByString:@"data:image/png;base64,"]; // dataFromBase64String // NSData+Base64 Copyright 2009 Matt Gallagher. All rights reserved. // http://www.cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];//decode base64 to NSData UIImage *image = [UIImage imageWithData:decodedData]; UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//カメラロールに保存 return NO; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end としてみたのですが、 if(![[request.URL.scheme] isEqualToString:@"sp5canvas2app"]){ の行にExpected identifierというエラーが、 NSData * decodedData = [NSData dataFromBase64String:[params objectAtIndex:1]];の行にNo known class method for selector 'dataFromBase64String:'というエラーが という状況で詰っている状況です。 メソッドの定義や宣言されていないメソッドを使っているなどのエラーということを調べて分かったのですが、objective-cを始めたばかりで初歩的なミスかも知れませんがエラーの対応の仕方がまだまだよくわかっていません。 スキーマなど参考にしたサイトの内容も十分に理解しているのではないのですが、「sp5canvas2app」の部分は自由に変えていいのでしょうか? 解決の仕方を教えていただけないでしょうか? 宜しくお願いします。

  • iPhone開発について

    初歩的な質問ですが、お願い致します。 ボタンをタップで音が鳴り、再びタップで音を止めるという動きを AVAudioPlayerを利用し実装したいと考えておりますがストップが思い通りに動きません。 プレイは正常に動作しております。 xCode4 で xib を利用しております。 該当部分だけコードを以下に抜粋させていただきます。 hogeController.m - (IBAction)btn{ NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *oto = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; if (hogeFlg == NO){ hogeFlg = YES; [oto play]; }else{ hogeFlg = NO; [oto stop]; } } デバッグでは、2回目のタップで、[oto stop];は通過しております。 基本的なところが理解できていないためということはわかっているのですが、解決策がわかりません。 また、xib を利用しておりますので、起動時に、- (void)viewDidload を読み込むのかな? と思い、入れてみたのですが通っておりません。 本当は、ここでセットして、ボタンタップじでは、再生と停止の処理だけを入れたいのですが、そういうことは可能なのでしょうか。 どうぞ、よろしくお願い致します。

  • objectiv-cで困っています。教えてください

    以前に外部のテキストファイルの中身を読み込む質問をして解答をいただき、助かりました。今回はそれを参考に外部にあるCSVファイルを読み込み解析しようとしているのですが、うまくいきません。CSVの中身は文章,数字/文章,数字/文章,数字/…となっています。いろいろ調べてみたのですが、外部のCSVファイルの読み込みについて書かれているものが分かりませんでした。どのようにしたらよいのでしょうか、教えてください。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController{ NSString* text; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self loadcsv]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //CSVの読み込み - (void)loadcsv { // CSVファイルの読み込み // 送信するリクエストを生成する。 NSURL *url = [NSURL URLWithString:@"http://....................../test.csv"]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; // リクエストを送信する。 // 第3引数のブロックに実行結果が渡される。 [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error) { // エラー処理を行う。 if (error.code == -1003) { NSLog(@"not found hostname. targetURL=%@", url); } else if (-1019) { NSLog(@"auth error. reason=%@", error); } else { NSLog(@"unknown error occurred. reason = %@", error); } } else { int httpStatusCode = ((NSHTTPURLResponse *)response).statusCode; if (httpStatusCode == 404) { NSLog(@"404 NOT FOUND ERROR. targetURL=%@", url); // } else if (・・・) { // 他にも処理したいHTTPステータスがあれば書く。 } else { text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } } }]; // 行ごとに分割し、配列「lines」に格納 NSArray* lines = [text componentsSeparatedByString:@"\n"]; // 問題の数だけ繰り返し for(int i=0; i<[lines count]; i++){ //問題をカンマで区切って、要素を配列「items」に格納 NSArray* items = [[lines objectAtIndex:i] componentsSeparatedByString:@","]; NSString *q = [items objectAtIndex:0]; int a = [[items objectAtIndex:1] intValue]; // 変数の中身を出力する NSLog(@"文字列は%@", q); NSLog(@"数字は%d", a); }

  • iPhoneアプリの開発についてです。

    ディクショナリから文字列を取り出す際にエラーが発生します。 XMLファイルから、パースライブラリを利用しタイトルやURLの情報をNSDictionaryでいつでも取り出せるのですが、URLを取り出す際だけエラーが発生します。 XMLのリンクタグは2種類ほどあります。 タイプ1 <link rel="alternate" type="text/html" href="「url」"/> タイプ2 <link>「url」</link> この2つのリンクタグをXMLの形式に応じて取り扱いたいのですが、 NSString *str = dic[@"link"][@"href"]; //dicには既に記事のデータが入っているものとしてください if(str == nil) { str = dic[@"link"];} これだと -[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1112b4f60 というエラーが発生してしまいます。 ちなみにタグの種類に応じて文字列を取り出せば(例えばタイプ2のタグに対しdic[@"link"][@"href"]という風に取り出す)ちゃんとURLを取得できます。 ご指摘お願いします。

  • Swiftについて教えてください

    下記のようにようにサーバにある画像を読み込んでいます。サーバのimgフォルダの中の画像( 1.png~20.png)を全て読み込み配列に入れる方法を質問して、回答をいただき解決しました。(以下のコード)それを拡張してサーバのimgフォルダの中の画像の数が分かってないものを配列に読み込もうとしています。画像の数が分かってないものを全て読み込み配列に入れる方法が分からず困っています。よろしくお願いします。 // URLリクエストを作る for i in 1...20 { let url = NSURL(string:"http://xxxxxxxxxxxxxxxx/img/"+String(i)+".png") let request = NSURLRequest(URL : url!) var error: NSError? // 同期通信を開始 if let resData:NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error){ let image = UIImage(data:resData) self.imageArray.append(image!) } }

  • iPhoneアプリのプッシュ通知からの起動時に

    iPhoneアプリ開発初心者です。 プッシュ通知の件で前回も質問させていただいたのですが、 もう一つ、別の疑問が出てきてしまったので、質問させてください。 現在、画面に指定したURLのサイトを表示させる、 というタイプのiPhoneアプリを作成しております。 プッシュ通知を行い、通知からアプリを起動すると、 特定のURLを表示させたいと思っているのですが、 「AppDelegate.m」ファイルから画面の処理を行うには どうすればいいのか分からず、困っております。 ・現状では、アプリ起動時に以下のような処理を 「ViewController.m」ファイルで行っております。 ******************** @interface ViewController () <UIWebViewDelegate> @property (weak, nonatomic) IBOutlet UIWebView *myWebView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 特定のURLを画面いっぱいに表示 NSURL *myURL = [NSURL URLWithString:@"[※ここに表示させたいURLを記載]"]; NSURLRequest *myURLReq = [NSURLRequest requestWithURL:myURL]; [self.myWebView loadRequest:myURLReq]; self.myWebView.delegate = self; } ******************** 通常起動はここを通過してもいいのですが、 プッシュ通知からの起動時には、カスタムプロパティに特定のURLを設定し その・URLを表示させる、というような処理に変更したいな、と考えています。 ただ、当然だとは思うのですが、現在viewDidLoadメソッドに記載している処理を そのままAppDelegate.mファイルに移植しても、エラーが出てしまいました。 プッシュ通知から起動した場合に 表示させるURLを変更するには、どうすればいいのでしょうか? 知恵を貸していただければと思います。 どうぞよろしくお願いいたします!

専門家に質問してみよう