0

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; 
    } 
} 

답변

1

문제는 activityViewControllerPlaceholderItem이 사전을 반환한다는 것입니다. 여기서 반환하는 유형은 사용자가 판매하는 개체의 유형을 나타내는 데 사용됩니다. Airdrop은 신비한 사전을 받기를 원치 않으므로 응답하지 않습니다. vending이 파일 URL이면, URL을 리턴해야합니다.

+0

사실 위에 표시된 코드의 자리 표시 자 항목은 URL이며 이는 항목 공급자에게 제공하는 것입니다. – KeithTheBiped

+0

나는 그게 무슨 뜻인지 모르겠다. 당신은'return @ {@ "body": @ "", @ "url": url};'을 말하고 있습니다. URL이 아닌 사전입니다. 모든 것은 반환하는 객체의 유형에 달려 있습니다. – matt

+0

잡기에 감사드립니다. 실제로 코드를 좀 더 실험하고 있었는데 실제로 찾은 것은 URL이나 사전에 자리 표시자를 설정하면 실제로 중요하지 않지만 중요한 것은 이니셜 라이저에서 자리 표시 자 값을 url 및 with - (id) activityViewControllerPlaceholderItem : (UIActivityViewController *) activityViewController; 만약 내가 "Item"메쏘드에서 반환하는 실제 타입이 다른 타입이라하더라도 같은 타입을 리턴하도록 설정했다면 괜찮습니다. – KeithTheBiped

관련 문제