Имитация отправленных SMS на iPhone

Поскольку при запуске / установке приложения на устройстве Xcode 4.3 на iOS 5.1 выполняется очень медленно, я использую симулятор, который запускается намного быстрее. (см. мой вопрос относительно этой проблемы здесь https://stackru.com/questions/11541288/xcode-4-3-with-ios5-1-pauses-about-10secs-when-debug-starts-simulator-starts-i)

Так что все, что мне нужно сделать, это что-то вроде этого:

MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
picker.messageComposeDelegate = delegate;
NSString *s = @"1234567";
picker.recipients =[NSArray arrayWithObject: s];   
picker.body =smsTxt;
if (simulationMode) {
    MessageComposeResult result = MessageComposeResultSent;            <-----------
    [delegate messageComposeViewController:picker didFinishWithResult: result];
} else
    [delegate presentModalViewController:picker animated:YES];

Теперь проблема в том, что при выполнении на iOS-симуляторе MFMessageComposeViewController не может быть создан и всегда дает ноль.

Есть ли способ создать еще один объект MyOwnMFMessageComposeViewController на симуляторе iOS, который совместим с MFMessageComposeViewController и может быть передан тем же методом, что и MFMessageComposeViewController?

Что-то вроде этого:

    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
    picker.messageComposeDelegate = delegate;
    NSString *s = @"1234567";
    picker.recipients =[NSArray arrayWithObject: s];   
    picker.body =smsTxt;
    if (simulationMode) {
        MyOwnMFMessageComposeViewController *mypicker = [[MFMessageComposeViewController alloc] init];
        mypicker.messageComposeDelegate = delegate;
        NSString *s = @"1234567";
        mypicker.recipients =[NSArray arrayWithObject: s];   
        mypicker.body =smsTxt;
        MessageComposeResult result = MessageComposeResultSent;   
        picker = (MFMessageComposeViewController) mypicker;          
        [delegate messageComposeViewController:picker didFinishWithResult: result];
    } else
        [delegate presentModalViewController:picker animated:YES];

1 ответ

Решение

То, что вы ищете, называется "фиктивным объектом" и часто используется в тестовой разработке. По сути, вы создаете подкласс MFMessageComposeViewController. Этот подкласс работает точно так же, как и mfmessagecomposeviewcontroller, за исключением того, что вы также создаете переменные экземпляра, чтобы показать, что что-то произошло.

Например, если ваш делегат вызывает messageComposeViewController: didFinishWithResult. Ложный объект, скорее всего, будет хранить результат и флаг, что этот метод был запущен. Обратите внимание, что на самом деле это ничего не отправит, а просто скажет, что делегат сработал и на реальном объекте будет работать.

Другие вопросы по тегам