web-dev-qa-db-ja.com

2.23によるiOSアプリの拒否-iOSデータストレージガイドライン

Apple拒否についてのメッセージ:

2.23-アプリはiOSデータストレージガイドラインに従う必要があります。従わない場合、アプリは拒否されます2.23詳細

起動時とコンテンツのダウンロード時に、アプリは6.5 MBを保存しますが、これはiOSデータストレージガイドラインに準拠していません。

次のステップ

IOSデータストレージガイドラインの要求に応じて、ユーザーがアプリを使用して作成したコンテンツ(ドキュメント、新しいファイル、編集など)のみがiCloudによってバックアップされていることを確認してください。また、アプリで使用される一時ファイルが/ tmpディレクトリにのみ保存されていることを確認してください。不要になったと判断された場合は、この場所に保存されているファイルを削除することを忘れないでください。

再作成は可能ですが、アプリが適切に機能するために保持する必要があるデータ、またはユーザーがオフラインで使用できることを期待しているデータは、「バックアップしない」属性でマークする必要があります。 NSURLオブジェクトの場合、NSURLIsExcludedFromBackupKey属性を追加して、対応するファイルがバックアップされないようにします。 CFURLRefオブジェクトの場合、対応するkCRUFLIsExcludedFromBackupKey属性を使用します。

アプリケーションのデータファイルをデバイスとシミュレーターの両方でチェックアウトしました。アプリがしばらく使用されている場合、起動時にアプリの合計データに5〜6MBが保存される可能性があることがわかりました。しかし、アプリをアンインストールして再インストールし、もう一度確認したところ、アプリの起動時に最大3MBのデータストアが表示されます。

CoreDataデータベースやその他のデータベースファイルを保存していません。しかし、私はGoogleAnalyticsとGoogleTag Managerがこのパスにいくつかのsqliteデータを格納していることに気づきました: "AppData/Library"。つまり、「AppData/Library/Caches」というパスには保存されません。 iOSデータストレージガイドラインに違いはありますか?

ちなみに、iCloudはアプリケーションに対して無効になっています。

また、画像のダウンロードにSDWebImageを使用しており、起動時にほぼ3 MBの画像を保存し、次のパスに画像データを保存します: "AppData/Library/Caches"

この問題を処理するために私が何をすべきかについて何か考えがありますか?

20
ersentekin

昨日同じ拒否メッセージが届きました。

application:didFinishLaunchingWithOptions:で次のコードを使用して、アプリケーションがドキュメントフォルダー内にあるものと、iCloudバックアップに関する各アイテムのアクセス許可を確認します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSArray *documents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:basePath error:nil];
NSURL *URL;
NSString *completeFilePath;
for (NSString *file in documents) {
    completeFilePath = [NSString stringWithFormat:@"%@/%@", basePath, file];
    URL = [NSURL fileURLWithPath:completeFilePath];
    NSLog(@"File %@  is excluded from backup %@", file, [URL resourceValuesForKeys:[NSArray arrayWithObject:NSURLIsExcludedFromBackupKey] error:nil]);
}

そのフォルダ内にiCloudと同期しているファイルがいくつかありました。したがって、これらのファイルを別の場所に保存する代わりに、NSURLIsExcludedFromBackupKeyキーのリソース値をYESに設定して、次のようにこれらのファイルがiCloudによってバックアップされないようにします。

NSURL *URL = [NSURL fileURLWithPath:photoPath];
[URL setResourceValue:@(YES) forKey:NSURLIsExcludedFromBackupKey error:nil];

今日もアプリを送信して、機能するかどうかを確認します。

この助けを願っています。

25
Glauco Neves

最近、Apple同じ問題のレビューチームによって拒否されました、

起動時とコンテンツのダウンロード時に、アプリはユーザーのiCloudに9.65MBを保存しますが、これはiOSデータストレージガイドラインに準拠していません。

彼らは、上記の質問で述べたのと同じ次のステップに従うことを提案します。

私たちの場合、コンテンツをダウンロードするときに、コードでこのNSURLIsExcludedFromBackupKeyをすでに設定しています。レビューチームにすでにこれを行っていることを通知したので、問題に適切に対処するためにApple Developer Technical Support(DTS)にリダイレクトしました。

DTSは、問題の原因はAppIconファイルであると回答しました。

AppIconsはiCloudにバックアップされていますAppleは、アプリのダウンロード中にデバイスにアイコンを表示する必要があります。アプリのAppIconsファイルが非常に大きいため、拒否されたためです。大量のデータをiCloudにバックアップしています。これは、AppIconを追跡するこの新しいツールの変更を認識していないため、AppReviewチームから明確に伝えられていませんでした。

理由がわかったので、 ImageOptim を使用してアイコンを最適化し、サイズを75KBに最小化しました。

アプリを送信しました。1〜2日で承認されることを願っています。 :)

これが同じ問題を抱えている人に役立つことを願っています。 :)

7
KarenAnne

最近この同じ問題に遭遇し、Glaucoの答えをSwiftに翻訳しました(おそらくもっとSwiftlyに書くことができますが)

let directories = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true)
    if let documentDirectory = directories.first {
        do {
            let documents = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(documentDirectory)
            for files in documents {
                let urlForm = NSURL.fileURLWithPath(documentDirectory + "/" + files)
                do {
                    try print("\(files): \(urlForm.resourceValuesForKeys([NSURLIsExcludedFromBackupKey]))")
                } catch {
                    print("can't find key")
                }
            }
        } catch {
            print("can't retrieve contents")
        }
    }

SetResourceValueのコード

let urlToExclude = NSURL.fileURLWithPath(quoteSavePath!)
    do {
        try urlToExclude.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey)
    } catch { print("failed to set resource value") }
5
Antonydatiga