Программно контролировать версии iPhone OS, чтобы включить функции для OS 3.x и 4 - проблема MFMessageComposeViewController - PullRequest
6 голосов
/ 30 июня 2010

Для поддержки iPhone OS 3.x и 4.0 я программно управляю функциональностью MFMessageComposeViewController, как это (используйте ее, только если версия ОС 4.0 или выше):

// if iPhone OS version >= 4.0
if (os_version_num >= 4) {
   MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
   if([MFMessageComposeViewController canSendText])
   {
      controller.body = text;
      controller.recipients = [NSArray arrayWithObjects: nil];
      controller.messageComposeDelegate = self;
      [self presentModalViewController:controller animated:YES];
      [controller release];
   }
}

Но, когда я пытаюсь запустить его на устройстве iPhone 3.1.3, я сразу получаю следующую ошибку (даже до загрузки приложения):

dyld: Symbol not found: _OBJC_CLASS_$_MFMessageComposeViewController
  Referenced from: /var/mobile/Applications/7232C474-FAD5-4E28-ABC5-8520F62300B0/TextMe.app/TextMe
  Expected in: /System/Library/Frameworks/MessageUI.framework/MessageUI

Средство форматирования данных временно недоступно, повторная попытка после «продолжения». (В настоящее время небезопасно звонить длопену.)

Что я делаю не так?

Ответы [ 6 ]

17 голосов
/ 02 июля 2010

Вам необходимо убедиться, что вы делаете несколько вещей:

В настройках сборки вашей цели:

  • установите Базовый SDK на iPhone Device 4.0
  • установите в качестве цели развертывания iPhone OS значение iPhone OS 3.1.3 (или ниже)

В общих настройках цели в разделе «Связанные библиотеки» измените «Тип» рядом с MessageUI.framework на «Слабый».

Не импортируйте <MessageUI/MFMessageComposeViewController.h>, иначе при запуске в 3.x произойдет сбой.Просто импортируйте <MessageUI/MessageUI.h>

Я не знаю, что такое os_version_num, но вот код, который я использую для проверки доступности MFMessageComposeViewController:

Class smsClass = (NSClassFromString(@"MFMessageComposeViewController"));
if (smsClass != nil && [MFMessageComposeViewController canSendText]) {
   MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
   controller.body = text;
   controller.recipients = [NSArray arrayWithObjects: nil];
   controller.messageComposeDelegate = self;
   [self presentModalViewController:controller animated:YES];
   [controller release];                
}
2 голосов
/ 02 июля 2010
Class theClass = NSClassFromString(@"MFMessageComposeViewController");
MFMessageComposeViewController *controller = theClass ? [[theClass alloc] init] : nil;

Вы можете использовать тип MFMessageComposeViewController как в:

MFMessageComposeViewController *controller;

Но вы не можете использовать глобальный объект MFMessageComposeViewController как в:

[MFMessageComposeViewController alloc];

Вместо этого используйте поиск класса такВы не зависите от компоновщика:

[NSClassFromString(@"MFMessageComposeViewController") alloc];
1 голос
/ 04 марта 2011

В целевых параметрах просто установите для messageUI.framework тип 'слабый'

0 голосов
/ 08 марта 2011

А если у вас есть функции, которые вы хотите включить только условно.

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller   
                 didFinishWithResult:(MessageComposeResult)result {
    [self dismissModalViewControllerAnimated:YES];
}

Например, если определение функции содержало MFMessageViewController, как сделать эту часть условной (то естьвызвать проблему с OS 3.x).Или это вообще не проблема?

0 голосов
/ 11 января 2011

У меня была такая же проблема, и я решил ее по-другому:

С левой стороны окна XCode,

  1. Если вы прокрутите вниз до Bulls Eye с помощью «Targets» и развернете это

  2. Расширьте свой

  3. + на «Связать двоичные файлы с библиотеками»

  4. Выберите «Добавить» -> «Существующие рамки»

  5. Выберите «MessageUI.framework» и нажмите «Добавить»

Это должно добавить интерфейс сообщения в ваше приложение, скажите мне, если оно работает.

0 голосов
/ 28 декабря 2010

Если вы импортируете <MessageUI/MessageUI.h> и устанавливаете слабую ссылку на среду MessageUI, вы можете напрямую вызвать:

   if ([MFMessageComposeViewController canSendText]) {
        controller.body = body;
        controller.recipients = [NSArray arrayWithObjects:number, nil];
        controller.messageComposeDelegate = self;
        [self presentModalViewController:controller animated:YES];
        [controller release]; 
    } else {
        [[UIApplication sharedApplication] openURL: [NSURL URLWithString:[NSString stringWithFormat:@"sms:%@",number]]];
    }

В iOS 3.1.2 вы получите nil в предложении if, и будет запущен старый метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...