簡単にiCloudで複数のデバイスのセーブデータの同期方法。
こないだiCloudについて色々調べてまして、わかった事だけちょこっとメモみたいな感じで書き込んでおきます。
まず、iCloudの方を説明する前にNSUserDefaultsを知っているかです。
多分皆知っていると思いますが、
//保存
[[NSUserDefaults standardUserDefaults] setObject: @"object"
forKey: @"object-key"];
//これだが、シンクロナイズメソッドを呼ばなくても保存出来る。
//ここはまだ良くわからないがとりあえずしておく。
[[NSUserDefaults standardUserDefaults] synchronize];
こんな感じで@"object"というNSStringを object-key というキーで保存して
//ロード
NSString* str = [[NSUserDefaults standardUserDefaults] objectForKey: @"object-key"];
こんな感じで取り出せます。
もちろん
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSString* str = [userDefaults objectForKey: @"object-key"];
これも同じ事です。
何もない場合はnilだったかな?BOOL ならNO.が返ってきます。
ではでは、iCloudに保存してみましょう。
//iCloudのNSUbiquitousKeyValueStoreをもらって
NSUbiquitousKeyValueStore* cloudStore = [NSUbiquitousKeyValueStore defaultStore];
//ま、このままだと何にもならないが、とりあえずこれで保存
[cloudStore setData: [NSData data]
forKey: @"data-key"];
//今のままだと、iPhoneのメモリに保存しただけなので、これをiCloudとシンクさせる。
[cloudStore synchronize];
これで保存
//取り出す時は
NSUbiquitousKeyValueStore* cloudStore = [NSUbiquitousKeyValueStore defaultStore];
//シンク
[cloudStore synchronize];
//これで取り出す
NSData* data = [cloudStore dataForKey: @"data-key"];
これでソースはこれで完了です。
ただここからが大事な所で、
1。provistioningがiCloudが有効になっていないといけません。
2。iPhondの設定のiCloudが有効になっていて、書類・データがONになっていないといけません。
これをしないと多分コンソールにエラーがでます。
後、この方法ではなくcoredataを使う方法もあるそうです。
ここはデベロッパーしか見る事が出来ませんが、
https://devforums.apple.com/community/ios/ios5beta/icloud
の一番上に
iPhoneCoreDataRecipes Sample Codeというのがあります。
サンプルソースもあります。
自分はまた他にやる事が出来てiCloudはいったんやめて他の仕事し移りますが、
早く日本語でもiCloudについての記事が見つかるといいですね。
英語が全くできないので、ここまで理解するのにもすごい時間がかかりました。
まず、iCloudの方を説明する前にNSUserDefaultsを知っているかです。
多分皆知っていると思いますが、
//保存
[[NSUserDefaults standardUserDefaults] setObject: @"object"
forKey: @"object-key"];
//これだが、シンクロナイズメソッドを呼ばなくても保存出来る。
//ここはまだ良くわからないがとりあえずしておく。
[[NSUserDefaults standardUserDefaults] synchronize];
こんな感じで@"object"というNSStringを object-key というキーで保存して
//ロード
NSString* str = [[NSUserDefaults standardUserDefaults] objectForKey: @"object-key"];
こんな感じで取り出せます。
もちろん
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSString* str = [userDefaults objectForKey: @"object-key"];
これも同じ事です。
何もない場合はnilだったかな?BOOL ならNO.が返ってきます。
ではでは、iCloudに保存してみましょう。
//iCloudのNSUbiquitousKeyValueStoreをもらって
NSUbiquitousKeyValueStore* cloudStore = [NSUbiquitousKeyValueStore defaultStore];
//ま、このままだと何にもならないが、とりあえずこれで保存
[cloudStore setData: [NSData data]
forKey: @"data-key"];
//今のままだと、iPhoneのメモリに保存しただけなので、これをiCloudとシンクさせる。
[cloudStore synchronize];
これで保存
//取り出す時は
NSUbiquitousKeyValueStore* cloudStore = [NSUbiquitousKeyValueStore defaultStore];
//シンク
[cloudStore synchronize];
//これで取り出す
NSData* data = [cloudStore dataForKey: @"data-key"];
これでソースはこれで完了です。
ただここからが大事な所で、
1。provistioningがiCloudが有効になっていないといけません。
2。iPhondの設定のiCloudが有効になっていて、書類・データがONになっていないといけません。
これをしないと多分コンソールにエラーがでます。
後、この方法ではなくcoredataを使う方法もあるそうです。
ここはデベロッパーしか見る事が出来ませんが、
https://devforums.apple.com/community/ios/ios5beta/icloud
の一番上に
iPhoneCoreDataRecipes Sample Codeというのがあります。
サンプルソースもあります。
自分はまた他にやる事が出来てiCloudはいったんやめて他の仕事し移りますが、
早く日本語でもiCloudについての記事が見つかるといいですね。
英語が全くできないので、ここまで理解するのにもすごい時間がかかりました。
現在iOS5のカレンダーバグ(予定の追加が出来ない!!)
iPhons4sを買ってから早速も基本内蔵カレンダーのバグが見つかりました。
バグと言っていいのかどうなのかはわかりませんが。
iCloudカレンダーをOn にした後、この機能いらないやと思ってiCloudのカレンダーをOffにしたら
ボタンが2つ出ます。
今までのiCloud予定を消すか。
今までのiCloud予定を消すか。
もちろんテストとしてiCloud機能をオンにしただけだったので、消すとしました。
そしたら、本体にあった全てのカレンダーをなくしたと処理が行われたのでしょうか。
予定などはそのまま残っている物の、予定追加が出来なくなったのです。
解決方法は
1。iCloudカレンダー機能をOnにする。
2。もう一度Offにしてから、
3。カレンダーを残すを選択する。
これで元の予定もそのまま残って今まで通りに使えます。
バグと言っていいのかどうなのかはわかりませんが。
iCloudカレンダーをOn にした後、この機能いらないやと思ってiCloudのカレンダーをOffにしたら
ボタンが2つ出ます。
今までのiCloud予定を消すか。
今までのiCloud予定を消すか。
もちろんテストとしてiCloud機能をオンにしただけだったので、消すとしました。
そしたら、本体にあった全てのカレンダーをなくしたと処理が行われたのでしょうか。
予定などはそのまま残っている物の、予定追加が出来なくなったのです。
解決方法は
1。iCloudカレンダー機能をOnにする。
2。もう一度Offにしてから、
3。カレンダーを残すを選択する。
これで元の予定もそのまま残って今まで通りに使えます。
常にデバッグの事を考えて自分なりのNSLogを作ろう〜
#ifdef DEBUG
#define kLOG(fmt, ...) NSLog((@"kLOG \n %s [Line %d] \n " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define kLOG(fmt, ...) ;
#endif
私はこんな風にしてます。
というか、最近こういう風にする事にしました。
開発をしていてNSLogを良く使っていますが、実際に出す時にいちいち消すのはめんどいし、
消しちゃうとアップデートする時などにまたテストの為に書いたりする物で・・・。
大事な所には常にデバッグの為にNSLogを残したいと思いマクロについて色々調べまして
こんなのを見つけたので自分なりに少し変更を加えています。
kLOG(@"test %f", (float)15);
まあこんな感じで書くと、メソッド名と何行目なのかがNSLogのログと一緒に出てきます。
(...)と__VA_ARGS__の可変引数と__PRETTY_FUNCTION__, __LINE__というマクロを使ったマクロです。
#define kLOG(fmt, ...) NSLog((@"kLOG \n %s [Line %d] \n " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define kLOG(fmt, ...) ;
#endif
私はこんな風にしてます。
というか、最近こういう風にする事にしました。
開発をしていてNSLogを良く使っていますが、実際に出す時にいちいち消すのはめんどいし、
消しちゃうとアップデートする時などにまたテストの為に書いたりする物で・・・。
大事な所には常にデバッグの為にNSLogを残したいと思いマクロについて色々調べまして
こんなのを見つけたので自分なりに少し変更を加えています。
kLOG(@"test %f", (float)15);
まあこんな感じで書くと、メソッド名と何行目なのかがNSLogのログと一緒に出てきます。
(...)と__VA_ARGS__の可変引数と__PRETTY_FUNCTION__, __LINE__というマクロを使ったマクロです。