在你的 App 内直接下载其他应用

911 阅读2分钟

最近在使用一些 App 的时候发现他们可以在不打开 App Store 的时候直接在页面底部弹出一个 App Store 的 Banner,并且可以直接操作浮层上的获取按钮来直接安装。

图片1

研究了一下,主要用到的是一个名为 SKOverlay[1]  的类,直接配置一个 app ID,即可展示浮层

如何找到 app ID?

  1. 打开 App Store,搜索你想查找的 app

  2. 点击这个 app,进入详情页

  3. 点击分享按钮,唤起系统分享面板

  4. 点击复制链接

比如我复制出来的链接地址为 apps.apple.com/cn/app/%E6%… 1142110895 就是这个 app 在 App Store 上的 ID。**

用上述的办法找到抖音在 App Store 上的 id 为 1142110895,就可以很轻易的创建 SKOverlay。

let config = SKOverlay.AppConfiguration(appIdentifier: "1142110895", position: .bottom)
let overlay = SKOverlay(configuration: config)

至于如何唤起,在 swiftUI 里这样使用

import SwiftUI
import StoreKit

struct ContentViewView {
    @State var appID: String = "1142110895"
    @State var showOverlay = false
    var body: some View {
        VStack {
            HStack {
                TextField("输入 App ID"text: $appID)
                    .background(Color.gray)
                Button("Show Overlay") {
                    showOverlay = false
                    showOverlay = true
                }
                .appStoreOverlay(isPresented: $showOverlay) {
                    SKOverlay.AppConfiguration(appIdentifier: appID, position: .bottom)
                }
            }
        }
        .padding()
    }
}

上边这段代码会创建一个输入框,可以输入对应 app 的 ID,输入框后有个 Show Overlay 按钮,点击按钮后,在页面底部会弹出对应的 app

同样的功能,UIKit 中这样使用

func showOverlay() {
    guard let scene = self.view.window?.windowScene else {
        return
    }
    
    let config = SKOverlay.AppConfiguration(appIdentifier: "1142110895", position: .bottom)
    let overlay = SKOverlay(configuration: config)
    
    config.userDismissible = true
    overlay.delegate = self
    overlay.present(in: scene)
}

另外需要注意

  • SKOverlay 支持 iOS 14+,需要做好 iOS 14 以下的兼容

  • SKOverlay 目前无法自定义 UI,并且上边的按钮点击、下载进度等也都拿不到回调

  • 如果你要展示的 App 在当前用户 App Store 上不可见(比如要展示一个美区的 app,但当前用户登录的是国区的账号),就会报错,可以用代理来监控这种情况

参考资料

[1]

SKOverlay 官方文档: developer.apple.com/documentati…