Objective c UIActivityViewController未在iOS11中显示空投选项

Objective c UIActivityViewController未在iOS11中显示空投选项,objective-c,xcode,uiactivityviewcontroller,airdrop,uiactivitytypeairdrop,Objective C,Xcode,Uiactivityviewcontroller,Airdrop,Uiactivitytypeairdrop,我有一些代码显示了一个UIAcvityViewController,用于从我的应用程序导出自定义对象,格式为JSON。此代码在以前版本的iOS中运行良好,但现在在iOS 11中失败。问题在于,当“活动视图”控制器显示时,它根本不显示空投面板或可用的收件人设备。文档是一个NSDictionary,它被编码并写入NSData对象,然后写入磁盘并由NSURL引用。正如我所说的,这段代码运行良好,并且在以前版本的iOS中仍然运行良好。我还有另外一个地方,我正在使用UIActivityViewContro

我有一些代码显示了一个UIAcvityViewController,用于从我的应用程序导出自定义对象,格式为JSON。此代码在以前版本的iOS中运行良好,但现在在iOS 11中失败。问题在于,当“活动视图”控制器显示时,它根本不显示空投面板或可用的收件人设备。文档是一个NSDictionary,它被编码并写入NSData对象,然后写入磁盘并由NSURL引用。正如我所说的,这段代码运行良好,并且在以前版本的iOS中仍然运行良好。我还有另外一个地方,我正在使用UIActivityViewController导出一个图像文件,Airdrop在iOS 11中仍然可以正常工作。我假设这个问题与我在ActivityProvider的URL键中引用的URL所导出和引用的文件的格式有关,但是我尝试了各种方法来输出和编码这个有意义的对象。以下是我正在使用的代码:

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的代码,该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;
    }
}

问题是activityViewControllerPlaceholderItem返回字典。您在此处返回的类型用于指示您要出售的对象的类型。Airdrop不想收到一本神秘的字典,所以它没有回应。如果要出售的是一个文件URL,您应该返回一个URL。

实际上,上面显示的代码中的占位符项是一个URL,这也是项目提供商提供的内容。我不知道您的意思。你说的是return@{@body:@,@url:url};。那是一本字典,不是URL。一切都取决于您返回的对象的类型。谢谢您的关注。我实际上只是对代码进行了更多的实验,我发现,如果我将占位符设置为url或字典,实际上并不重要,但重要的是,我将初始值设定项中的占位符值设置为url,并返回一个带有-idactivityViewControllerPlaceholderItem的字典:UIActivityViewController*activityViewController;如果我只是将它们设置为返回相同的类型,那么即使我在Item方法中返回的实际类型是完全不同的类型,它也可以正常工作!