#ios5 #icloud
#ios5 #icloud
Вопрос:
Я обновляю свое приложение для использования iCloud и хочу, чтобы моя цель развертывания iOS оставалась 3.2. Я условно экранирую любые вызовы iOS 5, чтобы предотвратить сбой любых версий заднего уровня. Мой applicationDidFinishLaunching выглядит следующим образом…
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSLog(@"Launching Began...");
navigationController = [[UINavigationController alloc] init];
navigationController.navigationBar.barStyle = UIBarStyleBlack;
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
// Getting the documentsPath.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
// Setting up the mainCarList
//unarchive the saved carlist
NSString *archivePathFilename = [documentsPath stringByAppendingString:@"/carlist.archive"];
self.mainCarList = nil;
self.mainCarList = [[NSKeyedUnarchiver unarchiveObjectWithFile:archivePathFilename] retain];
//if OS version => 5.0 then
NSString *reqSysVer = @"5.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
NSLog(@"in ApplicationDidFinishLaunching iOS version > 5.0");
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(carListDocumentStateChanged) name:@"UIDocumentStateChangedNotification" object:Nil];
NSString *carListDocumentURLString = [documentsPath stringByAppendingString:@"/mainCarListDocument.CLD"];
self.mainCarListDocumentURL = [NSURL fileURLWithPath:carListDocumentURLString]; //sets the local save location only in this property
Class cls = NSClassFromString (@"NSMetadataQuery");
if (cls) {
NSMetadataQuery *query;
query = [[NSMetadataQuery alloc] init]; // <------- This crashes when running v4.3 iPhone sim.
/*
NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
[self setDocumentMetaDataQuery:query];
[query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDataScope]];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", NSMetadataItemFSNameKey, @"mainCarListDocument.CLD"]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering) name:NSMetadataQueryDidFinishGatheringNotification object:Nil];
BOOL didStart = NO;
didStart = [query startQuery];
if (didStart) {
NSLog(@"documentMetaDataQuery started");
}
else {
NSLog(@"error starting documentMetaDataQuery");
}
*/
[query release];
}
...
Я думаю, что что-то происходит во время компиляции, поскольку журнал «Запуск начался» не опубликован. Условный блок работает правильно. Если я закомментирую инициализацию запроса, блок запускается только в том случае, если запущена iOS 5. Есть идеи?
Ответ №1:
Замените следующий код:
NSMetadataQuery *query;
query = [[NSMetadataQuery alloc] init];
С помощью этого кода:
id query;
query = [[cls alloc] init];
Ответ №2:
Вы должны использовать cls вместо NSMetadataQuery.