Открыть локальный файл PDF в iBooks

Я пытаюсь открыть файл PDF, который хранится локально в моем приложении в iBooks. В настоящее время у приложения есть список "литературы" в табличном представлении, и при нажатии каждой ячейки приложение переходит к веб-представлению, которое отображает файл PDF (прекрасно работает). Я сделал BarButton в правом верхнем углу в navBar, чтобы позволить пользователю открывать PDF в iBooks (чтобы они могли хранить его на своем устройстве).

Пока кнопка откроет UIDocumentInteractionController в нем отображаются все приложения на устройстве, которые могут открыть файл (после проверки, установлен ли iBooks). Затем, когда я нажимаю значок iBooks, приложение вылетает. Я смог изменить код так, чтобы iBooks открывался без сбоев, но PDF-файл не передавался, так что это бессмысленно (приведенный ниже код возвращается к тому, когда он падает).

Код ниже находится внутри IBAction barButton...

NSString *path = [[NSBundle mainBundle] pathForResource:litFileName ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];

UIDocumentInteractionController *docController = [UIDocumentInteractionController interactionControllerWithURL:targetURL];

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"itms-bookss:"]])
{
    [docController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];
    NSLog(@"ibooks is installed");
}
else
{
    NSLog(@"no ibooks installed");
}

2 ответа

Решение

Починил это! Отнял некоторое время у проекта, и после того, как вернулся через две недели, я понял это менее чем через 15 минут.

Так что это была проблема с памятью для docController, и, объявив в файле.h и используя (сохранить), он работает отлично. Я также смог использовать метод [NSBundle mainBundle].

.h
@property (retain)UIDocumentInteractionController *docController;

.m
@synthesize docController;

//in bar button IBAction
NSString *path = [[NSBundle mainBundle] pathForResource:litFileName ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];

docController = [UIDocumentInteractionController interactionControllerWithURL:targetURL];

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"itms-books:"]]) {

    [docController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];
    NSLog(@"iBooks installed");

} else {

    NSLog(@"iBooks not installed");

}

На iOS 8 изменилась структура файловой системы, и обмен файлами напрямую из основного пакета больше не работает. Скопируйте файл в каталог документов и поделитесь им оттуда.

Вот как создать путь к файлу:

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *fileName = [NSString stringWithFormat:@"%@.pdf",litFileName];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];
NSURL *url = [NSURL fileURLWithPath:filePath];
Другие вопросы по тегам