返回

iOS Viber URL Scheme交互:实现应用启动与内容分享

IOS

在 iOS 上通过 URL Scheme 启动 Viber 并交互:方法与实践

很多 iOS 开发者想在自己的 App 里实现一个功能:一键跳转到 Viber,并直接打开某个联系人的聊天窗口,或者干脆直接拨打 Viber 电话。听起来很方便,对吧?但当你兴冲冲地尝试像 Android 那样使用 viber://tel:<phone_number>viber://chat:<phone_number> 时,往往会发现——嘿,在 iOS 上根本行不通!

这篇博客就来聊聊这个事儿,看看在 iOS 上和 Viber App 交互,到底有哪些可行的路子,以及为啥 Android 的方法在 iOS 上水土不服。

为什么 Android 的方法在 iOS 上失效?

简单说,这主要是平台差异和 App 自身支持的问题。

  1. 平台机制不同: Android 使用 Intents(意图)机制,这是一个灵活的消息传递系统,允许应用之间进行更广泛的通信。而 iOS 主要依赖 URL Schemes 和 Universal Links。URL Scheme 像是给 App 注册了一个网址协议 (比如 viber://),别的 App 可以通过这个协议链接来请求启动它。
  2. 开发者决定: 一个 App 支持哪些 URL Scheme 操作,完全由这个 App 的开发者(这里就是 Viber 团队)说了算。他们需要在 App 里编写代码来解析收到的 URL,并执行相应的动作。如果 Viber 的 iOS 版本没有实现解析 viber://tel:viber://chat: 并触发对应功能,那外部调用自然就无效了。
  3. 官方文档缺失: 要命的是,Viber 似乎没有提供公开、详细的 iOS URL Scheme 文档,特别是关于直接通过电话号码发起呼叫或打开聊天的具体指令。这就导致开发者们只能靠猜、靠社区零散的信息,或者依赖一些非官方、可能随时失效的方法。

所以,Android 上好使的 viber://tel:viber://chat:,在 iOS 上通常无法达到预期效果,根源在于 Viber 的 iOS 版本很可能就没支持这些特定的 Scheme 路径和参数。

可行的 iOS Viber URL Scheme 方案

既然直接通过电话号码进行呼叫或聊天的官方路径似乎不通,我们在 iOS 上还能怎么和 Viber 交互呢?下面列出几种方法,各有优劣。

方案一:检查 Viber 是否安装与基础启动

这是最基本的操作,先确认用户手机上装了 Viber 没,如果装了,就把它打开。

原理与作用:

iOS 提供了一个 API UIApplication.shared.canOpenURL(_:) 来检查系统中是否有 App 能响应该 URL Scheme。如果检查通过(返回 true),说明 Viber 已安装。然后就可以用 UIApplication.shared.open(_:options:completionHandler:) 来启动它。最基础的 viber:// Scheme 通常只会将 Viber App 打开到主界面。

操作步骤与代码示例 (Swift):

  1. 配置 Info.plist:
    你必须在你的 App 的 Info.plist 文件里声明你要查询的 URL Scheme。否则 canOpenURL 会一直返回 false。添加 LSApplicationQueriesSchemes 键(如果还没有的话),它是一个数组,在里面添加一个字符串 viber

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>viber</string>
        <!-- 如果需要查询其他 App,也加在这里 -->
    </array>
    
  2. 检查并启动 Viber:

    import UIKit
    
    func launchViber() {
        guard let viberURL = URL(string: "viber://") else {
            print("无效的 Viber URL Scheme")
            return
        }
    
        if UIApplication.shared.canOpenURL(viberURL) {
            // Viber 已安装,尝试启动
            UIApplication.shared.open(viberURL, options: [:]) { success in
                if success {
                    print("成功打开 Viber")
                } else {
                    print("尝试打开 Viber 失败")
                    // 可以在这里提示用户,或采取其他措施
                }
            }
        } else {
            // Viber 未安装
            print("用户未安装 Viber App")
            // 可以在这里提示用户去 App Store 下载
            // 例如:
            // if let appStoreURL = URL(string: "itms-apps://itunes.apple.com/app/id382617920") { // Viber 的 App Store ID
            //     UIApplication.shared.open(appStoreURL, options: [:], completionHandler: nil)
            // }
        }
    }
    
    // 在你的按钮点击事件或其他触发点调用这个函数
    // launchViber()
    

安全与建议:

  • 务必添加 LSApplicationQueriesSchemes: 不加这个,canOpenURL 在 iOS 9 及以后版本永远返回 false,你的功能就废了。
  • 不要滥用查询: Apple 限制了一个 App 可以查询的 Scheme 数量(大约是 50 个)。只添加你确实需要交互的 App 的 Scheme。如果添加过多不相关的 Scheme,可能会影响 App 审核。
  • 处理未安装情况: 用户可能没装 Viber,你的代码需要优雅地处理这种情况,比如提示用户,或者提供去 App Store 下载的链接。

方案二:尝试有限的、可能非官方的交互 Scheme

虽然直接按电话号码交互的路不好走,但社区或通过逆向工程可能会发现一些其他的、有限的 Viber URL Scheme。用这些要有心理准备,它们可能随时失效。

原理与作用:

这类 Scheme 可能是 Viber 内部使用或早期遗留的,没有公开文档。它们可能能实现一些基础功能,比如跳转到特定标签页,或者执行某些特定动作(比如分享)。但因为非官方,可靠性没保障。

示例与操作步骤:

一个流传较广、相对可能还奏效的 Scheme 是用于分享文本内容viber://forward?text=...:

  1. 构造 URL:

    func shareTextToViber(text: String) {
        // 对要分享的文本进行 URL 编码,很重要!
        guard let encodedText = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
              let viberURL = URL(string: "viber://forward?text=\(encodedText)") else {
            print("构造 Viber 分享 URL 失败")
            return
        }
    
        if UIApplication.shared.canOpenURL(viberURL) {
            UIApplication.shared.open(viberURL, options: [:]) { success in
                if success {
                    print("成功跳转到 Viber 分享界面") // 用户还需要在 Viber 内选择联系人
                } else {
                    print("尝试打开 Viber 分享界面失败")
                }
            }
        } else {
            print("用户未安装 Viber App")
            // 处理未安装情况...
        }
    }
    
    // 调用示例
    // shareTextToViber(text: "看看这个链接:https://example.com")
    

    注意: 这个 Scheme 通常只会打开 Viber 并预填好文本内容,用户还需要手动选择一个或多个联系人来发送。它并不能直接打开与特定联系人的聊天窗口并发送。

其他可能的(非常不确定且风险高)Scheme 猜想:

过去曾有提及 viber://add?number=<phone_number> 用于添加联系人,或 viber://callsviber://chats 直接跳转到对应标签页。但强烈建议不要依赖这些! 它们很可能早已失效,或者从未在所有 iOS 版本和 Viber 版本上稳定工作过。如果你实在想试试,务必:

  • 在多种 iOS 版本和 Viber 版本上做充分测试。
  • 做好它们随时失效的准备,应用内要有替代方案或优雅降级。
  • 绝对不要把它们用在核心业务逻辑或需要高可靠性的地方。

安全与建议:

  • 极不可靠: 重复强调,非官方 Scheme 稳定性极差。Viber 一更新,你的功能可能就挂了。
  • 用户体验差: 如果 Scheme 失效,用户点击按钮后没有任何反应,或者 App 崩溃,体验会很糟糕。
  • 测试!测试!测试!: 如果你非要用,请在你能找到的所有设备和系统组合上反复测试。

方案三:使用 UIActivityViewController (通用分享菜单)

这可以说是 iOS 上最标准、最推荐的应用间内容分享方式了。

原理与作用:

UIActivityViewController 是 iOS 提供的标准分享组件。当你提供一些内容(文字、图片、URL 等)给它时,它会弹出一个分享菜单,列出所有能处理这些内容的 App 和服务(包括 Viber,如果用户安装了且 Viber 支持处理该类型内容)。用户可以从列表里选择 Viber,然后 Viber 会接管后续操作(通常是让用户选择联系人进行分享)。

操作步骤与代码示例 (Swift):

import UIKit

func shareViaActivityController(text: String? = nil, url: URL? = nil, image: UIImage? = nil, presentingViewController: UIViewController) {
    var itemsToShare: [Any] = []
    if let text = text {
        itemsToShare.append(text)
    }
    if let url = url {
        itemsToShare.append(url)
    }
    if let image = image {
        itemsToShare.append(image)
    }

    if itemsToShare.isEmpty {
        print("没有可分享的内容")
        return
    }

    let activityViewController = UIActivityViewController(activityItems: itemsToShare, applicationActivities: nil)

    // 防止在 iPad 上崩溃
    if let popoverController = activityViewController.popoverPresentationController {
        popoverController.sourceView = presentingViewController.view // 或者指定一个按钮作为源
        popoverController.sourceRect = CGRect(x: presentingViewController.view.bounds.midX, y: presentingViewController.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = [] // 或者设置为 .up, .down 等
    }

    // 可选:排除某些不希望出现的分享类型
    // activityViewController.excludedActivityTypes = [
    //     .postToFacebook,
    //     .postToTwitter,
    //     // ... 其他系统提供的 Activity Type
    // ]

    presentingViewController.present(activityViewController, animated: true, completion: nil)
}

// 在你的 ViewController 中调用,假设有一个分享按钮触发:
// @IBAction func shareButtonTapped(_ sender: UIButton) {
//     shareViaActivityController(text: "来自我的 App 的分享!", url: URL(string: "https://example.com"), presentingViewController: self)
// }

优势:

  • 官方推荐,稳定可靠: 这是 Apple 的标准做法,不会因为 Viber 更新就失效。
  • 用户熟悉: 用户对这个分享界面很熟悉,操作流程一致。
  • 灵活性高: 可以分享文本、URL、图片等多种类型的数据。
  • 自动适配: 系统会自动显示支持所分享内容类型的 App。

缺点:

  • 非直接跳转: 不能直接打开 Viber 的特定聊天或拨打电话。用户需要多步操作(选择 Viber -> 选择联系人 -> 发送)。
  • 依赖用户选择: 最终是否通过 Viber 分享,以及分享给谁,完全由用户决定。

进阶使用技巧:

  • 自定义 UIActivityItemSource: 如果你需要根据不同的分享目标(比如分享到邮件和分享到 Viber 时提供不同的内容),可以创建一个遵循 UIActivityItemSource 协议的类,更精细地控制分享数据。
  • 创建自定义 UIActivity: 如果你想在分享菜单里添加自己 App 的特定操作(不只是分享到其他 App),可以创建自定义的 UIActivity

方案四:研究 Viber 的官方 API 或 SDK(若有)

有时候,服务提供商会提供官方的 API 或 SDK,允许开发者进行更深度的集成。

原理与作用:

这些通常是给合作伙伴或者需要高级功能(如客服、机器人)的开发者使用的。它们可能提供比 URL Scheme 更强大、更稳定的集成方式。

分析与步骤:

  1. 搜索 Viber 开发者资源: 访问 Viber 的官方网站,查找是否有“Developers”、“API”、“SDK”或“Partners”相关的入口。
  2. 评估适用性: 仔细阅读文档,看是否有提供适用于你的场景(从普通 iOS App 跳转到用户 Viber 客户端进行通话或聊天)的 API。
    • 可能性分析: 大部分情况下,Viber 提供的公开 API 可能更多是面向 Viber Business Messages APIChatbot 开发 。这类 API 通常是服务器端的集成,用于代表企业账号发送消息、建立客服流程等,可能需要付费、审核,并且不一定能实现 从一个普通用户的 App 跳转到另一个普通用户的 Viber App 进行个人间通话或打开特定聊天的功能。
  3. 按需集成: 如果确实找到了合适的 API/SDK 并且符合你的需求和成本考虑,就按照官方文档进行集成。这通常涉及注册应用、获取密钥、处理认证、调用相应的接口等步骤。

建议:

  • 期望管理: 不要抱太大希望通过公开 API 找到直接触发个人间 Viber 通话或聊天的简单方法,这类功能往往涉及用户隐私和安全,平台方通常会限制。
  • 关注业务 API: 如果你的应用场景是商业性的(比如 CRM 系统集成 Viber 客服),那么 Viber Business API 可能是更值得研究的方向。

总结与建议

回到最初的问题:如何在 iOS App 里通过 URL Scheme 让 Viber 自动拨打某个号码或打开与某个号码的聊天窗口?目前看来,似乎没有稳定可靠、官方支持的直接方法。

对于想要在 iOS App 中与 Viber 进行交互的开发者,以下是几点务实的建议:

  1. 优先使用标准方式:

    • 通过 canOpenURL 检查 Viber 是否安装,用 openURL 启动 Viber 到主界面 (viber://) 是最基础也最可靠的操作。记得配置好 Info.plist
    • 对于分享内容,强烈推荐使用 UIActivityViewController。这是最符合 iOS 生态、最稳定、用户体验也最好的方式,尽管它需要用户手动选择 Viber 和联系人。
  2. 谨慎对待非官方 Scheme:

    • viber://forward?text= 这样的也许能用,但要准备好它随时失效的预案。
    • 绝对避免依赖那些网上流传的、未经证实或早已过时的 Scheme,如直接通过电话号码交互的 viber://tel:viber://chat:。风险太高。
  3. 关注官方动态:

    • 留意 Viber 是否未来会发布新的官方 iOS URL Scheme 文档或提供相关功能的 SDK。访问他们的开发者网站是获取第一手信息的地方。
  4. 管理用户预期:

    • 如果你的产品设计依赖于和 Viber 的深度集成(如一键通话),可能需要调整设计或明确告知用户当前的局限性,引导他们使用分享等间接方式。

相关资源