JSON으로 포맷 된 내 응용 프로그램에서 사용자 정의 객체를 내보내는 UIAcvityViewController를 보여주는 코드가 있습니다. 이 코드는 이전 버전의 iOS에서는 제대로 작동하지만 이제 iOS 11에서는 실패합니다. 문제는 활동보기 컨트롤러가 표시 될 때 Airdrop 패널이나 사용 가능한 수신 장치를 전혀 표시하지 않는 것입니다. 이 문서는 인코딩되어 NSData 객체에 쓰여진 다음 디스크에 쓰여지고 NSURL에 의해 참조되는 NSDictionary입니다. 앞에서 설명한 것처럼이 코드는 정상적으로 작동하며 이전 버전의 iOS에서도 계속 작동합니다. 나는 또한 UIActivityViewController를 사용하여 이미지 파일을 내보내는 또 다른 장소를 가지고 있으며 Airdrop은 iOS 11에서 계속 잘 작동합니다.이 문제는 파일의 형식과 관련이 있으며 URL에 의해 참조됩니다. ActivityProvider의 url 키를 참조하고 있지만이 객체를 출력하고 인코딩하는 모든면에서 노력했습니다. 다음은 내가 사용하고있는 코드입니다.UIActivityViewController가 iOS11에서 AirDrop 옵션을 표시하지 않습니다.
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;
}
}
사실 위에 표시된 코드의 자리 표시 자 항목은 URL이며 이는 항목 공급자에게 제공하는 것입니다. – KeithTheBiped
나는 그게 무슨 뜻인지 모르겠다. 당신은'return @ {@ "body": @ "", @ "url": url};'을 말하고 있습니다. URL이 아닌 사전입니다. 모든 것은 반환하는 객체의 유형에 달려 있습니다. – matt
잡기에 감사드립니다. 실제로 코드를 좀 더 실험하고 있었는데 실제로 찾은 것은 URL이나 사전에 자리 표시자를 설정하면 실제로 중요하지 않지만 중요한 것은 이니셜 라이저에서 자리 표시 자 값을 url 및 with - (id) activityViewControllerPlaceholderItem : (UIActivityViewController *) activityViewController; 만약 내가 "Item"메쏘드에서 반환하는 실제 타입이 다른 타입이라하더라도 같은 타입을 리턴하도록 설정했다면 괜찮습니다. – KeithTheBiped