UIActivityViewController не показывает опцию AirDrop в iOS11

У меня есть некоторый код, который показывает UIAcvityViewController для экспорта пользовательского объекта из моего приложения, отформатированного как JSON. Этот код отлично работает в предыдущих версиях iOS, но теперь не работает на iOS 11. Проблема в том, что при отображении контроллера вида деятельности он вообще не отображает панель Airdrop или доступные устройства получателей. Документ представляет собой NSDictionary, который кодируется и записывается в объект NSData, а затем записывается на диск и на него ссылается NSURL. Как я уже говорил, этот код работал нормально и все еще отлично работает в предыдущих версиях iOS. У меня также есть другое место, где я использую UIActivityViewController для экспорта файла изображения, и Airdrop продолжает нормально работать в iOS 11. Я предполагаю, что проблема связана с форматом файла, который экспортируется и на который ссылается URL-адрес I Я ссылаюсь в URL-ключе ActivityProvider, но я попробовал все способы вывода и кодирования этого объекта, который имеет смысл. Вот код, который я использую:

NSString *textToShare = @"I am sharing this record with you!";
NSURL* url = [self.record exportNoteToURL];

NSMutableArray* activityProviders = [[NSMutableArray alloc]initWithCapacity:0];
NoteRecordActivityProvider *provider = [[NoteRecordActivityProvider alloc] initWithPlaceholderItem:@{@"body":textToShare, @"url":url}];
[activityProviders addObject:provider];

//Initialize the ActivityViewController
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityProviders applicationActivities:applicationActivities];

NSArray *excludeActivities = @[UIActivityTypePostToFacebook,
                               UIActivityTypePostToTwitter,
                               UIActivityTypePostToWeibo,
                               //UIActivityTypeMessage,
                               //UIActivityTypeMail,
                              //UIActivityTypePrint,
                               UIActivityTypeCopyToPasteboard,
                               UIActivityTypeAssignToContact,
                               UIActivityTypeSaveToCameraRoll,
                               UIActivityTypeAddToReadingList,
                               UIActivityTypePostToFlickr,
                               UIActivityTypePostToVimeo,
                               UIActivityTypePostToTencentWeibo,
                               //UIActivityTypeAirDrop,
                               UIActivityTypeOpenInIBooks];

activityController.excludedActivityTypes = excludeActivities;
[activityController setValue:[NSString stringWithFormat:@"Record:  %@", self.record.title] forKey:@"subject"];
activityController.popoverPresentationController.barButtonItem = (UIBarButtonItem*)sender;
activityController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
    if (completed)
    {
        NSLog(@"The Activity: %@ was completed", activityType);
    }
    else
    {
        NSLog(@"The Activity: %@ was NOT completed", activityType);
    }
    [FileSystemProvider clearExportsDirectory];
};
[self presentViewController:activityController animated:YES completion:nil];

Ниже приведен код, который экспортирует словарь в URL, который, кажется, работает правильно.

#pragma mark Document Export
-(NSURL*) exportNoteToURL
{
    NSMutableDictionary* dict =[[NSMutableDictionary alloc]initWithCapacity:0];

    // 1 Create Dictionary
    NSDictionary* noteDict = [self getSettingsDictionary];
    [dict setValue:noteDict forKey:@"Note"];

    // 2 Get File Name and create file path
    NSString* fullFilePath = [[FileSystemProvider documentPath]stringByAppendingPathComponent:@"Exports"];
    NSLog(@"Export Path:  %@", fullFilePath);
    [MiscUtilities createDirectory:fullFilePath];

    NSString* fileName = @"ExportedNoteRecord.lgz";
    fileName = self.title;
    fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@""];
    fileName = [MiscUtilities SanitizeFileNameString:fileName];
    fileName = [NSString stringWithFormat:@"%@%@", fileName, @".lgz"];

    fullFilePath = [fullFilePath stringByAppendingPathComponent:fileName];

    // 3 Write dictionary to FileSystem
    NSURL* url = [[NSURL alloc]initFileURLWithPath:fullFilePath];
    BOOL res = [dict writeToURL:url error:&error];

    if (res)
    {
        return url;
    }
    else
    {
        return nil;
    }
}

1 ответ

Проблема в том, что ваш activityViewControllerPlaceholderItem возвращает словарь. Тип, который вы здесь возвращаете, используется как показатель того, какой тип объекта вы торгуете. Airdrop не хочет получать загадочный словарь, поэтому он не отвечает. Если то, что продается, является URL-адресом файла, вы должны были вернуть URL-адрес.

Другие вопросы по тегам