フォト

最近のトラックバック

無料ブログはココログ

« Oresund(#3.0.0) リリースされました! | トップページ | アップルとサムソンの訴訟について »

2012年8月23日 (木)

Oresund #3.0.0の iCloud対応を終えて。

今回、Oresund#3.0.0を開発するにあたってApple社が提供するクラウドサービス、iCloudを使った
機能を実装してみたのだが、まあ、うまくいかないことが多々あり、苦労が絶えなかった。

まず、進捗率が取得できない。
iOS5.0から、「NSURLUbiquitousItemPercentDownloadedKey」と、「NSURLUbiquitousItemPercentUploadedKey」という名前のパラメータが追加されており、
マニュアルによれば、resourceValuesForKeys メソッドなどを利用することによって取得できるとされている。
NSURL *url = [NSURL alloc] init];
NSArray *array = [NSArray arrayWithObjects:
NSURLUbiquitousItemPercentDownloadedKey, // 転送率
NSURLUbiquitousItemPercentUploadedKey // 転送率
, nil];
NSError *error = nil;
NSDictionary *dict = [url resourceValuesForKeys:array error: &error];

しかしながら、するとこれらのパラメータは取得できない。
値で、nilや、0.0が入ってくるというわけでもない。
dict内に、「NSURLUbiquitousItemPercentDownloadedKey」と、「NSURLUbiquitousItemPercentUploadedKey」のキーすら保持しない。

これは、iOS6.0Beta版でも同様である。
GoodReaderでは進捗率を表示しているのだが、どうやって取得しているものか?

一応、これらのパラメータは取得できるので、処理が完了したかどうか?についてはアプリのほうで
検知できるのが救いである。
NSURLIsUbiquitousItemKey,// iCloudに同期されているか?
NSURLUbiquitousItemHasUnresolvedConflictsKey,// 競合していないか?
NSURLUbiquitousItemIsDownloadedKey, // ローカルにデータがあるか?
NSURLUbiquitousItemIsDownloadingKey, // ダウンロード中
NSURLUbiquitousItemIsUploadedKey, // クラウドにデータがあるか?
NSURLUbiquitousItemIsUploadingKey, // アップロード中

また、iCloudからのダウンロードにも問題がある。
どういうケースで発生するかわからないが、ダウンロードが開始されないことがあった。
これは、「NSURLUbiquitousItemIsDownloadingKey」パラメータが「Yes」とならないことから
判断できる。
(これについては、力技で対応。)

さらに、「NSURLIsUbiquitousItemKey」 == YESとなっていても、NSURLUbiquitousItemIsUploadedKey == NOというケースがある。
これは、iCloudの仕組みに起因する。

iCloudはデバイス内に、一時的にデータを保管する領域(サンドボックスというらしい)が存在する。
ファイルのアップロードを行うと、「NSURLIsUbiquitousItemKey」 == YESとなり、ファイル自体はサンドボックス配下に移動になる。

この、「NSURLIsUbiquitousItemKey」 == YES は、厳密いうと、「サンドボックスにデータファイルが入った」もしくは「iCloud上にデータがある状態」である。

「サンドボックスにデータが入ってもすぐにはiCloudストレージには反映されない。
どうも、iOS5.0にはデーモンのような仕組みがあるらしく、デバイス内のあまったリソースでiCloudストレージにデータを転送を行なっているようだ。

ユーザからしてみれば、iCloudにデータがアップロードされたように見えるので、そんなに意識する必要はないのだが、iCloud上にはデータがないので他のデバイスで参照しようとすると見えない・・・。
なーんってことが平気で発生する。

今回、iCloud上のデータファイルのリンク先を取得出来る機能を追加しているのだけれども、もちろん、Nullが帰ってくる。
困ったものである。

最後に、もっとも手こずったのが、CoreDataの処理である…。
iPhoneだけでなく、iPadなどをお持ちの方も増えたと思う。
複数の、iOSデバイスでファイル管理を共有する仕組みを採用。

Apple社が世界6都市?で特別にカンファレンスを開いた「CoreData + iCloud」である。
そんなこんなで、iCloud上にCoreaDataのストレージを設け、そこから各デバイスのローカルストレージと同期をとれるようにしています。
(他にやっているアプリがあったら、ぜひ教えて下さい!。いろいろと勉強したい!)

仕組み的には、iPhone内のCoreDataストレージが更新されたタイミングで、iCloud上のストレージと同期をとり、iCloud上のCoreDataは更新ログを他のデバイスに配信するのだ。

しかし、これがめちゃくちゃクセモノだった。
トランザクションをコミットできない事態が発生したことだった・・・。
データの保存ができたようにみえるけれども、アプリを停止、再起動するとデータが反映されていないことがあった。
これについては、データ登録後、再度、フェッチすることでとりあえず事象が収まりはしたが、何が原因なのかさっぱりだ。。。今後、バージョンが上がっていった際にどう影響するか今から心配…。


さらに、今回はDropboxのAPIが一新されたとので、これの対応を行った。
これも、新APIになって認証方法が変更となった他、かなり機能強化が行われていたため、こちらのほうも取り込みました。

この話はまた今度・・・。

« Oresund(#3.0.0) リリースされました! | トップページ | アップルとサムソンの訴訟について »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/144298/55492482

この記事へのトラックバック一覧です: Oresund #3.0.0の iCloud対応を終えて。:

« Oresund(#3.0.0) リリースされました! | トップページ | アップルとサムソンの訴訟について »

最近の写真