Android 에 Intent 가 있다면 iOS에는 UIDocumentInteractionController가 있다.
annotation을 태워서 같이 보내거나 하는 등의 intent와 여러모로 비슷한 옵션인데, 기본적인 동작은 AirDrop을 호출해 파일을 다른 앱의 번들안에 저장한 후 파일을 오픈하게 하는 구조이다.
그런데..
10.3에서 돌아가는 다음 소스가 11에선 돌아가지 않는다.
NSString* filepath = [[NSBundle mainBundle] pathForResource:@"Filename" ofType:@"pptx"]; NSURL *url = [NSURL fileURLWithPath:filepath]; self.documentController = [UIDocumentInteractionController interactionControllerWithURL:url];
아무리 로그를 봐도 그냥 파일 복사가 실패했다는 말만 나온다. 영문도 모르겠다. 더 열받는건 iOS의 기본앱(메모, 페이지)로는 또 열린다는 것이다. 그러다가 비슷한 처지의 글들을 보게 되었는데 결론은 그냥 iOS의 보안정책이 변했다.
AirDrop이란건 그냥 뻔한건데,
iOS에서 파일을 받을 경우 앱내에 있는 번들 스페이스에 저장하게 된다. 이 번들안에 저장된 URL을 서드파티앱에 넘기고, url을 받은 서드파티앱이 해당 url로 접근 후 파일을 복사해서 자신의 번들안에 저장하고 여는 구조라고 할 수 있는데, iOS 10까지는 이런 일련의 과정들이 허용되었으나 이젠 애플 기본앱이 아니면 접근 할 수 없다.
고로 접근할 수 있는 임시 디렉토리를 생성하고, URL을 다르게 전달해야만 앱이 오픈된다
NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; // get /tmp folder path NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"Filename"] URLByAppendingPathExtension:@"pptx"]; self.documentController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
정말 봐도봐도 거지같단 생각밖에 안든다. 여튼 이러면 열린다..