写点什么

StoreKit:iOS 应用内推广其他 App

作者:珲少
  • 2023-04-16
    上海
  • 本文字数:3042 字

    阅读完需:约 10 分钟

在 iOS 应用中,要推广其他 App 有两种途径,一种是直接跳转到 AppStore 软件的对应 App 商品页,还有一种是在当前应用内内嵌一个 App 商品页。相比第一种方式,第二种方式的体验更好,并且不会打断用户对当前应用的使用。


本篇文章,我们主要介绍 StoreKit 框架中的相关接口,使用 StoreKit 可以轻松的在当前应用内推广其他 App。

· 在应用内打开其他 App 的商品页

StoreKit 框架中提供了一个名为 SKStoreProductViewController 的类,此类事继承自 UIViewController 的,因此我们可以像使用普通视频控制器一样来使用它。只要我们提供了某个应用的 ITunes ID,就可以轻松的在应用中打开其 AppStore 商品页。


例如下面的代码:


// 创建视图控制器let appStoreController = SKStoreProductViewController()// 设置代理appStoreController.delegate = self// 定义参数let params = [SKStoreProductParameterITunesItemIdentifier: "387682726"]// 加载应用信息appStoreController.loadProduct(withParameters: params)// 将页面弹出self.present(appStoreController, animated: true)
复制代码


上面代码中使用了淘宝应用的 ITunes ID,代码执行效果如下图所示:



可以看到,我们直接在应用内就弹起了”淘宝“的详情页,可以直接进行下载/更新操作。


需要注意,上面代码只能在真机上进行测试,且默认页面的弹出方式为浮层样式。


下面我们再来详细看下 SKStoreProductViewController 这个类的用法,SKStoreProductViewController 本身比较简单,创建出实例后,只需要使用 loadProduct 来加载指定的应用即可,其所传的参数字典中,可配置的选项如下:


// 应用的iTunes ID @available(iOS 6.0, *)public let SKStoreProductParameterITunesItemIdentifier: String
// 内购商品的SKU码,如果配置了,则会显示内购商品信息 @available(iOS 11.0, *)public let SKStoreProductParameterProductIdentifier: String
// 自定义商品页的ID@available(iOS 15.0, *)public let SKStoreProductParameterCustomProductPageIdentifier: String
// 机构token@available(iOS 8.0, *)public let SKStoreProductParameterAffiliateToken: String@available(iOS 8.0, *)public let SKStoreProductParameterCampaignToken: String
// 用来分析提供者的token@available(iOS 8.3, *)public let SKStoreProductParameterProviderToken: String
// 广告伙伴token@available(iOS 9.3, *)public let SKStoreProductParameterAdvertisingPartnerToken: String
复制代码


其中,SKStoreProductParameterITunesItemIdentifier 键是必传的。


SKStoreProductViewController 中也定义了一个 delegate 属性,设置代理可以对商品页的关闭行为进行监听,如下:


extension ViewController: SKStoreProductViewControllerDelegate {    func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {        print("商品页关闭")    }}
复制代码


此代理方法是可选实现的。

· 一些小技巧

如何获取公开应用的 ITunes ID?


现在,我们以及知道了如何在应用内打开其他 App 的详情页,如何获取 ITunes 参数呢,其实是有官方的渠道可查的。地址如下:


https://tools.applemediaservices.com/


在其中输入我们要查询的应用名称,即可获取到与此应用相关的推广信息,如下图所示:



可以看到,图中有一段 Content Link,这其中就包含了应用的 ITunes ID 信息,只是其是被 URL encode 后的,将其复制出来,可以在如下网站进行 URL Decode,即可得到原始的 ITunes ID。


http://www.jsons.cn/urlencode/


对内嵌商品页弹起的高度,文本风格颜色进行配置?


虽然 SKStoreProductViewController 提供的接口很少,但我们依然有办法对其做一定程度上的定制,比如其中按钮的风格颜色,浮层的弹起高度。


新建一个继承于 SKStoreProductViewController 的类,实现如下:


import UIKitimport StoreKit
class MyStoreProductController: SKStoreProductViewController { override func viewDidLoad() { super.viewDidLoad() // 设置页面内部分元素的风格颜色 view.tintColor = .red }
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() // 这里可以控制页面弹起的高度 view.frame = CGRect(x: 0, y: 400, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height - 400) }}
复制代码


运行效果如下图所示:


· 使用应用挂件

SKStoreProductViewController 打开的是一个完整的产品详情页,有时候,我们更期望要推广的应用只是占据一个挂件的位置,在 iOS 14 及之后的版本中,StoreKit 框架中提供了 SKOverlay 类来实现应用挂件。


示例代码如下:


// 创建配置,传入要渲染的应用的ITunes IDlet config = SKOverlay.AppConfiguration(appIdentifier: "387682726", position: .bottom)let overlay = SKOverlay(configuration: config)// 指定展示在Scene上if let scene = UIApplication.shared.windows.first?.windowScene {    overlay.present(in: scene)}
复制代码


效果如下图所示:



可以看到,在窗口底部会出现一个应用挂件。


AppConfiguration 实例可配置的属性不多,列举如下:


@available(iOS 14.0, *)public class AppConfiguration : SKOverlay.Configuration {    // 初始化方法    public init(appIdentifier: String, position: SKOverlay.Position)
// ITunes ID open var appIdentifier: String
// 一些额外的Token open var campaignToken: String? open var providerToken: String?
// 自定义页面的ID @available(iOS 15.0, *) open var customProductPageIdentifier: String? // 设置要展示最近版本 @available(iOS 15.0, *) open var latestReleaseID: String?
// 挂件的位置,可枚举bottom和bottomRaised 差别不大 open var position: SKOverlay.Position
// 是否允许用户关闭 open var userDismissible: Bool
// 启动附加数据 open func setAdditionalValue(_ value: Any?, forKey key: String) open func additionalValue(forKey key: String) -> Any?
// 广告体验配置 @available(iOS 16.0, *) open func setAdImpression(_ impression: SKAdImpression)}
复制代码


整体来说,SKOverlay 不太灵活,对其出现的位置并不能精准的进行控制,SKOverlayDelegate 定义了一些方法来监听其行为,如下:


public protocol SKOverlayDelegate : NSObjectProtocol {    // 产品加载失败的回调        optional func storeOverlayDidFailToLoad(_ overlay: SKOverlay, error: Error)    // 挂件将要开始弹出的回调    optional func storeOverlayWillStartPresentation(_ overlay: SKOverlay, transitionContext: SKOverlay.TransitionContext)    // 挂件以及弹出的回调    optional func storeOverlayDidFinishPresentation(_ overlay: SKOverlay, transitionContext: SKOverlay.TransitionContext)    // 挂件将要消失的回调    optional func storeOverlayWillStartDismissal(_ overlay: SKOverlay, transitionContext: SKOverlay.TransitionContext)    // 挂件已经消失的回调    optional func storeOverlayDidFinishDismissal(_ overlay: SKOverlay, transitionContext: SKOverlay.TransitionContext)}
复制代码


专注技术,懂的热爱,愿意分享,做个朋友

发布于: 刚刚阅读数: 4
用户头像

珲少

关注

还未添加个人签名 2022-07-26 加入

还未添加个人简介

评论

发布
暂无评论
StoreKit:iOS应用内推广其他App_珲少_InfoQ写作社区