2013-06-17 11 views
18

背景があります

私はアプリケーションの状態を保存したいiOSアプリケーションを作成しています。
このアプリがリリースされる前は、iOS 7がリリースされているか、まもなくリリースされる予定で、ほとんどがiOS 5から移行したようです。したがって、iOS 6以降の開発を決定しました。iOS 6以降で状態保存を手動で呼び出します

iOS 6には、状態を保存するための機能があります。ただ、ストーリーボード固有のIDのすべてのビューを与えると「AppDelegate」でこれらの二つの機能を実装しています

- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder; 
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder; 

のiOSは、「自動的に」アプリのナビゲーション履歴を保持します。方法は:

- (void)encodeRestorableStateWithCoder:(NSCoder*)coder; 
- (void)decodeRestorableStateWithCoder:(NSCoder*)coder; 

を使用して、データの格納と検索を行うことができます。
問題はありません。問題なく動作します。しかし、状態を保存するメソッドは、アプリがバックグラウンドに入ったときにのみトリガされます。

A、B、C、Dの4つのViewControllerを持つNavigationControllerが1つあるとします。ユーザはAからBに移動し、BではSafariに切り替えてGoogleに何かを渡します。アプリケーションの状態はBに保存されます。その後、ユーザーはアプリに戻り、CとDにナビゲートします.Dでは、アプリが残念なことに例外に遭遇してダウンします。ユーザーがアプリを再起動すると、iOSは保存された状態を復元しようとします。しかし、この状態はBに保存されました。つまり、アプリが起動したときに、ユーザーがその場所(D)を離れた場所ではなく、前のビュー(C)でなくBから始まります。

可能な解決策

上記のシナリオは、新しいビューごとに状態が保存されていれば回避できます。しかし、(私が知る限りは)州の保全プロセスを引き起こす公共の方法はありません。 私はデバッグしながら、コールスタックを調べるとiOSはiOSの6中のUIApplicationオブジェクトの次のメソッドを呼び出すことを見出した:

_saveApplicationPreservationState: 

とiOS 7で、次の方法:

_saveApplicationPreservationState:viewController:sessionIdentifier:beginHandler:completionHandler: 

ありもこのように、このメソッドを呼び出すことによって

_saveApplicationPreservationStateIfSupported 

:iOSのバージョンに応じて、上記のいずれかを呼び出し、別の方法であると思わ

if ([[UIApplication sharedApplication] respondsToSelector:@selector(_saveApplicationPreservationStateIfSupported)]) 
     [[UIApplication sharedApplication] performSelector:@selector(_saveApplicationPreservationStateIfSupported)]; 

予想されるメソッドが呼び出されることがわかります。

実際の質問

私は上記の溶液となるだろう場合は、私のアプリは、App Storeから拒否されますでしょうか?私は技術的には個人的な方法ではないことを意味し、それは単に公開されていません。 "respondsToSelector"で呼び出しをラップすることで、APIが変更されてもアプリケーションがクラッシュすることはなく、単に状態を頻繁に保存することはありません。しかし、アプリが拒否される可能性がある場合、それは選択肢ではありません。 上記以外の状態保存プロセスを手動で呼び出す方法はありますか? NSUserDefaultsに状態を保存するカスタムソリューションを構築するのではなく、組み込みの機能を使用することができれば嬉しいです。

+6

これらのメソッドの先頭にアンダースコアが付いているという事実は、それらがパブリックAPIの一部ではないことを強く示唆する**ヒントとして働くはずです。そのため、それらを使用するとApp Storeの拒否につながる可能性があります。 –

+0

+1、それは素晴らしい質問です。私も答えを知りたいです。しかし、私はジョンがそうした方法については正しかったと思います。かなりスケッチです。 – John

+0

私はこれにも非常に興味があります。私の次の推測は、アプリケーションの起動/終了(通常の組み込みのアプローチ)の状態を保持するためのすべてのメソッドを実装する必要があることですが、実行時の状態の変更中に状態を保存/復元するための独自の機構を作成しますできるだけ多くの他の実装コードを使用してください。 NSUserDefaultsと一緒に復元IDや同様のエンコード/デコードメソッドを再利用できると思っています。 –

答えて

1

イベントすでに質問が2歳の場合は、私は運を試してみます。 Btw op、おそらく、あなたは今までにそれを解決する可能性が高いでしょう。

あなたは確かに拒否されるでしょう。彼らは呼び出しているメソッドのソースコードをスキャンしています。私はUDIDメソッドを使用していたときに、これを数回持ちました。それが助けてくれたらと思います。

+1

ええ、私はそれを実現しました。だから私は自分の国家保存を作りました。私は実際に私の質問を更新するか、それに答える予定でしたが、それは私の心を崩しました。 要するに、NSUserDefualtsにコントローラのナビゲーションスタックと状態を格納するメカニズムがあります。ユーザーが別のビューをナビゲートしてアプリを離れるときはいつでも、このコードをトリガーします。 –

関連する問題