【问题标题】:Return to app behavior after phone call different in native code than UIWebView通话后返回应用行为,本机代码与 UIWebView 不同
【发布时间】:2011-07-16 02:58:21
【问题描述】:

根据Apple's documentation,为了从我的应用程序拨打电话,我需要实现以下协议:

HTML 链接:

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

本机应用程序 URL 字符串:

tel:1-408-555-5555

但是,在完成从 UIWebView 内的 HTML 链接发起的电话呼叫后,我会被重定向回我的应用程序。但是,在通过本机应用程序 URL 字符串完成电话呼叫后,我的 iphone 将停留在 iphone 的常规电话应用程序中,如果我想返回我的应用程序,我必须手动执行此操作。

据我阅读其他人所说的,我无法改变这种行为。

这是我的问题:

  1. 真的不可能吗 之后返回应用程序 从本地人打来电话 应用程序 URL 字符串?
  2. 会有什么缺点吗 实现 UIWebView 而不是 一个 UILabel 在我的情况下 真的希望用户成为 重定向回我的应用程序 打完电话后?

【问题讨论】:

    标签: iphone objective-c uiwebview


    【解决方案1】:
    1. 使用tel: URL 调用-[UIApplication openURL:] 和单击UIWebView 中指向同一URL 的链接之间的行为确实不同。

    2. 使用 UIWebView 代替 UILabel 可能有一些缺点,但您不必实际显示 UIWebView 即可获得其 tel URL 处理行为。相反,只需在 UIWebView 的实例中加载 tel URL 请求,而不将其添加到您的视图层次结构中。

    例如:

    #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
    

    【讨论】:

    • 这太棒了,谢谢!我从来没有想过使用 UIWebView 只是为了打电话。另一个额外的好处是它会创建一个警报,这为我节省了一步。
    • 它适用于 iOS 4.x 设备.. 你们有没有尝试在 iOS 5 上这样做,显然它停止工作了.. 谢谢!
    • 嘿,我正在加载一个包含电话号码的网络视图。 Webview 在点击电话号码链接时调用呼叫警报。但是当用户点击呼叫屏幕上的取消按钮时,我的应用程序不会恢复。它显示黑屏 这发生在 IOS5 设备中。它在以前版本的设备中工作正常。请帮忙..
    • 你也可以这样做 [[UIApplication sharedApplication] openURL:@"telprompt:0123456789"];获取提示并在之后返回您的应用。
    • 用户需要点击“通话”才能继续。有没有办法自动调用?
    【解决方案2】:

    请允许我简化一下。你只需要这个小sn-p:

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

    我得到了here

    *最近在 iOS 5.0 上测试成功。

    【讨论】:

    • 什么时候发布 UIWebView?电话结束并返回您的应用程序后?这不会像你写的那样泄漏吗?还是您在应用程序的整个生命周期都保留 webview 并将其用于所有调用?
    • @leolobato 也许您输入了错误的号码。 (必须没有空格,没有“ + ”等...适用于我的所有版本。
    • 这适用于 iOS 7 吗?我刚试了一下,好像没用。
    • 将 webview 添加到我的视图中适用于 iOS 7.1 [self.view addSubview:callWebview];
    • 有没有人在请求之前将 webview 添加到主视图中?看我的回答
    【解决方案3】:

    Eric 的 Brotto 方法在 5.1 中仍然有效。您必须在 loadRequest 之前将 webview 添加到主视图,如下所示:

    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]]; 
    

    (我添加了电话号码清理器,以删除阻止此方法的所有非数字字符)

    【讨论】:

    • 完美运行!多谢!!!有什么方法可以自定义电话前显示的弹出消息?
    • 好吧,不使用这种方式。你看,如果你使用它,这是“合法的”(应用程序不会在 App Store 被拒绝)。还有另一种方法:创建弹出窗口并使用旧方法(使用 sharedApplication 调用 openURL),但不能使用“tel”方案,而是必须将其更改为“telprompt”。请注意,此功能未记录在案,因此,您的应用可能会被拒绝。
    【解决方案4】:

    最简单的方法似乎是:

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

    通话结束后,您将收到提示,您的应用将重新获得焦点。

    【讨论】:

    • 你测试过这个吗?当需要一个 NSURL 对象时,您正在传递一个字符串。这不是有效的代码,甚至会在编译时抛出警告;不用说它会在运行时爆炸。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多