swiftUI APP 集成 Google 移动广告 Admob (二)

3 years ago 高效码农

书接上文 ~~~~ 激励广告 创建激励广告几乎与插页式广告相同。唯一的区别是,对于奖励广告,我们需要创建一个函数,该函数将在授予奖励时运行。 就像插页式广告一样,我们需要创建一个RewardedAdObject来处理广告的加载。 class RewardedAd: NSObject { var rewardedAd: GADRewardedAd? static let shared = RewardedAd() func loadAd(withAdUnitId id: String) { let req = GADRequest() GADRewardedAd.load(withAdUnitID: id, request: req) { rewardedAd, err in if let err = err { print("Failed to load ad with error: \(err)") return } self.rewardedAd = rewardedAd } } } 现在,我们将使用这个对象来创建RewardedAdView。 class RewardedAdView: NSObject, UIViewControllerRepresentable, GADFullScreenContentDelegate { let rewardedAd = RewardedAd.shared.rewardedAd @Binding var isPresented: Bool let adUnitId: String //This is the variable for our reward function let rewardFunc: (() -> Void) init(isPresented: Binding<Bool>, adUnitId: String, rewardFunc: @escaping (() -> Void)) { self._isPresented = isPresented self.adUnitId …

SwiftUI APP 集成 Google 移动广告 Admob (一)

3 years ago 高效码农

简介: 随着越来越多的应用程序使用 SwiftUI 构建,我想提供一种简单的方法将 Admob 直接集成到您的应用程序中。为了让大家集成的更容易,我计划将它作为 Cocoapod 发布。 先看一下集成后的效果: 设置 Google 移动广告 (Admob) SDK 申请应用,请参考 Google 的官方文档地址为:https://developers.google.com/admob/ios/quick-start。 使用 Cocoapods 导入 SDK pod ‘Google-Mobile-Ads-SDK’ 然后使用命令行运行 pod install –repo-update 更新 Info.plist 请更新应用的 Info.plist 文件以添加以下两个键: 一个字符串值为您的 AdMob 应用 ID 的 GADApplicationIdentifier 键(在 AdMob 界面中标识)。 一个 SKAdNetworkIdentifier 值为 Google(cstr6suwn9.skadnetwork),并选择向 Google 提供了这些值的其他买家的 SKAdNetworkItems 键。 <key>GADApplicationIdentifier</key> <string>ca-app-pub-3940256099942544~2435281174</string> 初始化 Google 移动广告 (Admob) SDK import SwiftUI import AppTrackingTransparency import GoogleMobileAds @main struct ExampleApp: App { //在 App Delegate 中使用 init() 代替 ApplicationDidFinishLaunchWithOptions init() { if ATTrackingManager.trackingAuthorizationStatus == .notDetermined { // TODO 这里可以弹出隐私协议 } else { ATTrackingManager.requestTrackingAuthorization { status in GADMobileAds.sharedInstance().start(completionHandler: nil) } } } var body: some Scene …

SwiftUI 开发问题集锦

3 years ago 高效码农

开发环境: xcode版本:13.1 swift版本:5.5.1 swift-driver version: 1.26.9 Apple Swift version 5.5.1 一、缺少文件: 问题: 创建新项目后缺少了 AppDelegate.swift、SceneDelegate.swift 文件,那么在初始化一些SDK时,无法初始化 解决方案: 在项目App.swift文件中加入init()方法: @main struct SwiftUIExampleApp: App { init() { // 可以在这里做初始化的操作 } var body: some Scene { WindowGroup { ContentView() } } } 二、找不到Info.plist文件 问题: 在需要往info.plist文件中添加值时,找不到info.plist文件 解决方案: info.plist 文件改为了xcode的配置,位置向导为;Project → Targets → Info → Custom iOS Target Properties 三、报错信息:Non-constant range: not an integer range 解决方案: 传递一个id参数 原因Apple官方解释: /// Creates an instance that generates Rotor content by combining, in order, /// individual Rotor content for each element in the data given to this /// `ForEach`. /// /// It’s important that the `id` of a data element …

Vapor安装教程问题集锦

3 years ago 高效码农

简介: Vapor 是 Swift 最常用的 Web 框架。这是一个适用于 macOS 和 Ubuntu 的 Swift 网络框架。 安装错误❌ : 1、要在 macOS 上使用 Vapor,您只需要安装 Xcode 9.3 或更高版本。 2、swift build –disable-sandbox -c release -Xswiftc -cross-module-optimization 在执行到 brew install vapor/tap/vapor 会报各种github库超时错误:如LibreSSL SSL_connect: Operation timed out in connection to github.com:443 解决方案: 1、配置git全局代理: # 设置当前代理 git config –global http.proxy http://127.0.0.1:**自己的端口号** git config –global https.proxy https://127.0.0.1:**自己的端口号** # 取消当前代理 git config –unset http.proxy #取消全局代理 git config –global –unset http.proxy #设置socks5代理 git config http.proxy socks5://127.0.0.1:**自己的端口号** 2、设置终端代理: # 修改shell配置文件 ~/.bashrc ~/.zshrc等 export http_proxy=socks5://127.0.0.1:1081 export https_proxy=$http_proxy 3、 再次执行brew install vapor/tap/vapor brew install vapor/tap/vapor 创建Hello项目时,一路选n Cloning template… name: Hello Would you like to use Fluent? …

swift学习笔记

4 years ago 高效码农

文章只是根据自身情况,记录swift语言和其他语言的区别,请勿对号入座,请根据自身情况选择性学习: 一、类型注解 注意:类型注解作为一个需要了解的知识点,不做深入研究,因为在项目实操中很少需要写类型注解;理由是:Swift 可以推断出常量或者变量的类型 当你声明常量或者变量的时候可以加上类型注解(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类型注解,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。 var x:String 声明中的冒号代表着“是…类型”,所以这行代码可以被理解为: “声明一个类型为 String ,名字为 x 的变量。” “类型为 String ”的意思是“可以存储任意 String 类型的值。” x 变量现在可以被设置成任意字符串: x = "高效码农" print(x) 完整代码: var x:String x = "高效码农" print(x) 你可以在一行中定义多个同样类型的变量,用逗号分割,并在最后一个变量名之后添加类型注解: var red, green, blue: Double 二、整数 Swift提供的整数类型有:Int、Int8、Int16、Int32、Int64、UInt、UInt8、UInt16、UInt32、UInt64 带U的为无符号整数; 除非你需要特定长度的整数,一般来说使用 Int 就够了。这可以提高代码一致性和可复用性。即使是在32位平台上,Int 可以存储的整数范围也可以达到 -2,147,483,648 ~ 2,147,483,647,大多数时候这已经足够大了。 三、类型别名 类型别名(type aliases)就是给现有类型定义另一个名字。你可以使用 typealias 关键字来定义类型别名。 typealias exmple = UInt32 var typeExmple = exmple.max 本例中,exmple 被定义为 UInt32 的一个别名。因为它是别名,exmple.min 实际上是 UInt32.max ,所以会给 typeExmple 赋一个初值 4294967295。 项目实操中没有用到过这个特性,在其他语言实战中也没有遇到有类似需求的场景,不知道干啥用的; 四、可选类型 声明一个可选常量或者变量 var surveyAnswer: String? print(surveyAnswer) // surveyAnswer 被自动设置为 nil Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。 五、可选绑定 在Swift中,返回值或者数据类型后面加 ?表示可选类型,值可以为空,但是后面加 …

swift导入OC版QMUI SDK

5 years ago 高效码农

一、xcode11 新建swift5 项目 参考:https://www.xugj520.cn/archives/xcode-swift.html 二、接入 SDK 在项目目录下执行 $ pod init 在 Podfile 中指定: pod ‘QMUIKit’ 在项目目录终端下执行: $ pod install 三、新建桥接的头文件 并添加到 四、在头文件中导入 #import <QMUIKit/QMUIKit.h> 五、在swift文件中使用QMUI import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.title = "aaa" self.view.backgroundColor = UIColor(hue: 0.50, saturation: 0.20, brightness: 0.86, alpha: 1.00) let button = QMUIButton(); button.frame = CGRect(x: 10, y: 210, width: 300, height: 50) button.backgroundColor = UIColor.red button.addTarget(self, action: #selector(buttonClick), for: .touchUpInside) self.view.addSubview(button) } @objc func buttonClick(){ print("被点击了") } }

Xcode11新建低版本iOS,swift项目流程及问题

5 years ago 高效码农

一、新建一个工程 User interface:选择Storyboard,因为SwiftUI只支持iOS13 二、修改deployment target 三、删除文件 删除SceneDelegate.swift 官方文档: In iOS 13 and later, use UISceneDelegate objects to respond to life-cycle events in a scene- based app. 这个场景呢,如果不使用ipad的多窗口就不建议使用 删除 Main.storyboard 不使用storyboard布局,打开info.plist,删除Main storyboard file base name和Application Scene Manifest选项。 3.删除 AppDelegate.swift文件中的下面2个方法函数 4.添加rootViewController 在AppDelegate.swift第一个方法中添加: let screen = UIScreen.main.bounds //获得设备尺寸 self.window = UIWindow.init(frame: screen) //给“输出窗口“实例化并设置frame let viewController = ViewController() //实例化一个ViewController let navigationController = UINavigationController(rootViewController: viewController) //为ViewController设置一个导航栏 self.window?.rootViewController = navigationController//将“输出窗口”的根视图设置为导航栏 self.window?.makeKeyAndVisible() // 设置"输出窗口可见" 5.在ViewController.swift中添加测试代码 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. view.backgroundColor = UIColor.red } 四、效果如下