Возврат к поведению приложения после телефонного звонка, отличного по собственному коду от UIWebView

Согласно документации Apple, чтобы сделать телефонный звонок из моего приложения, мне нужно реализовать следующие протоколы:

HTML-ссылка:

<a href="tel:1-408-555-5555">1-408-555-5555</a>

Строка URL собственного приложения:

tel:1-408-555-5555

Тем не менее, после завершения телефонного звонка, инициированного с помощью HTML-ссылки внутри UIWebView, я перенаправлен обратно в свое приложение. Но после завершения телефонного звонка, сделанного из строки URL-адреса собственного приложения, мой iphone остается в обычном приложении телефона iphone, и если я хочу вернуться в свое приложение, я должен сделать это вручную.

Насколько я могу судить по прочтению того, что говорили другие, изменить это поведение невозможно.

Вот мой вопрос:

  1. Правда ли, что невозможно вернуться в приложение после телефонного звонка из строки URL-адреса собственного приложения?
  2. Был бы какой-то недостаток в реализации UIWebView вместо UILabel в ситуациях, когда я действительно хотел, чтобы пользователь перенаправлялся обратно в мое приложение после завершения телефонного звонка?

4 ответа

Решение
  1. Поведение действительно различается между звонками -[UIApplication openURL:] с tel: URL и щелкнув ссылку на тот же URL в UIWebView,

  2. Используя UIWebView вместо UILabel могут быть некоторые недостатки, но вам не нужно отображать UIWebView чтобы получить его tel Поведение при обработке URL. Вместо этого просто загрузите tel URL-запрос в экземпляре UIWebView без добавления его в иерархию представлений.

Например:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface PhoneCaller : NSObject
{
  @private
    UIWebView *webview;
}
- (void)callTelURL:(NSURL *)url;
@end

@implementation
- (id)init
{
    self = [super init];
    if (self)
    {
        webview = [[UIWebView alloc] init];
    }
    return self;
}
- (void)callTelURL:(NSURL *)url
{
    [webview loadRequest:[NSURLRequest requestWithURL:url]];
}
- (void)dealloc
{
    [webview release];
    [super dealloc];
}
@end

Самый простой способ выглядит так:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt:0123456789"]];

Вы получите приглашение, и ваше приложение восстановит фокус после завершения вызова.

Позвольте мне немного упростить. Все, что вам нужно, это маленький фрагмент:

UIWebView *callWebview = [[UIWebView alloc] init];
NSURL *telURL = [NSURL URLWithString:@"tel:number-to-call"];
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];

который я получил здесь.

* Недавно успешно протестирован на iOS 5.0.

Метод Эрика Бротто все еще работает в 5.1. Вы должны добавить веб-представление к основному представлению до loadRequest, например так:

NSString *cleanedString = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *telURL = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", escapedPhoneNumber]];
UIWebView *mCallWebview = [[UIWebView alloc] init]  ;
[self.view addSubview:mCallWebview];
[mCallWebview loadRequest:[NSURLRequest requestWithURL:telURL]]; 

(Я добавил очиститель номера телефона, чтобы удалить любой нечисловой символ, который блокирует этот метод)

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