Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アドフリくんSDKをSwift4で組み込む
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
studioshin
June 25, 2018
Programming
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アドフリくんSDKをSwift4で組み込む
studioshin
June 25, 2018
More Decks by studioshin
See All by studioshin
HealthKitをSwift4でいじってみた
studioshin
0
600
8年前にObjective-Cで書いたアプリをゼロからSwift3で書き直した話
studioshin
0
400
Other Decks in Programming
See All in Programming
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
280
XHTMLが残したもの
yosuke_furukawa
PRO
1
370
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
100
Building an Out-of-Order CPU
latte72
0
380
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
200
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
300
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
500
[DroidKaigi 26] How We Moved from Android Studio to Slack
thisaay
0
160
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
620
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
130
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
130
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
890
Facilitating Awesome Meetings
lara
57
7.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Optimizing for Happiness
mojombo
378
71k
Transcript
ΞυϑϦ͘ΜSDKΛSwift4ͰΈࠐΉ ΠϯλʔεςΠγϟϧ ωΠςΟϒ ಈըΠϯλʔεςΠγϟϧ ಈըωΠςΟϒ ಈըϦϫʔυ όφʔ *OΞυϑϦδϡΫ
ΞυϑϦ͘Μ4%,ͷಋೖ IUUQTBEGVSJLVOKQBEGVSJLVO ·ͣΞΧϯτొ
ΠϯλʔεςΠγϟϧ ωΠςΟϒ όφʔ
ΞυϑϦ͘Μ4%,ͷಋೖ μϯϩʔυϖʔδ͔Β4%,Λμϯϩʔυ ࠂΛ࡞ͬͯɺࠂ*%Λൃߦ͢Δɻ
ΞυϑϦ͘Μ4%,ͷಋೖ ϓϩδΣΫτʹ4%,ΛՃ 4%,Λυϥοάˍυϩοϓɻ
ΞυϑϦ͘Μ4%,ͷಋೖ ϑϨʔϜϫʔΫΛՃ
ΞυϑϦ͘Μ4%,ͷಋೖ ϒϦοδϔομͷՃ 0CKFDUJWF$ͷదͳΫϥ εΛՃɻ͋ͱͰফ͢ɻ
ΞυϑϦ͘Μ4%,ͷಋೖ ϒϦοδϔομͷՃ ίϯύΠϧઃఆʹϒϦοδ ϔομ͕Ճ͞ΕΔɻ
όφʔʗΠϯλʔεςΠγϟϧ
όφʔʗΠϯλʔεςΠγϟϧࠂͷදࣔ ϒϦοδϔομهೖ #import <adfurikunsdk/AdfurikunView.h> #import <adfurikunsdk/AdfurikunPopupView.h>
func makeBannerAd() { let adfurikunView = AdfurikunView(frame: CGRect(x: 0, y:
0, width: 320, height: 50)) self.view.addSubview(adfurikunView) adfurikunView.appID = “ࠂID” adfurikunView.transitionDulation = 0.5 adfurikunView.testModeEnable() // ςετϞʔυ adfurikunView.startShowAd() adfurikunView.center = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height - 25) } όφʔࠂͷදࣔ 6*7JFX$POUSPMMFSʹදࣔ͢Δఆ
όφʔࠂͷදࣔ
ΠϯλʔεςΠγϟϧࠂͷදࣔ 6*7JFX$POUSPMMFSʹදࣔ͢Δఆ var adfurikunInter: AdfurikunPopupView! func makeInterstisialAd() { self.adfurikunInter =
AdfurikunPopupView() self.adfurikunInter.appID = “ࠂID” self.adfurikunInter.testModeEnable() // ςετϞʔυ self.adfurikunInter.setSchedule(1) self.adfurikunInter.preloadAd() } @IBAction func showInterstisialAd(_ sender: Any) { self.view.addSubview(self.adfurikunInter) self.adfurikunInter.center = CGPoint(x: self.view.frame.size.width/2, y: self.view.frame.size.height/2) self.adfurikunInter.preloadShowAd() }
ΠϯλʔεςΠγϟϧࠂͷදࣔ 6*7JFX$POUSPMMFSʹදࣔ͢Δఆ
ωΠςΟϰ
ωΠςΟϒࠂͷදࣔ ϒϦοδϔομهೖ #import <adfurikunsdk/AdfurikunNativeAd.h> #import <adfurikunsdk/AdfurikunNativeAdInfo.h>
ωΠςΟϒࠂͷදࣔ var adfurikunNative: AdfurikunNativeAd! var nativeLinkURL: URL? //ࠂϦϯΫ var imageView:
UIImageView! //ࠂը૾ var titleLabel: UILabel! //ࠂλΠτϧ var textLabel: UILabel! //ࠂςΩετ var nativeAdView: UIView! //ࠂදࣔϏϡʔ ࠂදࣔ༻ͷϓϩύςΟΛఆٛ
ωΠςΟϒࠂͷදࣔ func nativeAd(size: CGSize) -> UIView { let adView =
UIView(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height)) self.nativeAdView = adView adView.backgroundColor = UIColor.white //ը૾ self.imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: size.height, height: size.height)) imageView.contentMode = .scaleAspectFit adView.addSubview(imageView) //λΠτϧ self.titleLabel = UILabel(frame: CGRect(x: size.height + 5.0, y: 0, width: size.width - (size.height + 5.0), height: size.height * 0.3)) titleLabel.numberOfLines = 2 titleLabel.minimumScaleFactor = 0.5 adView.addSubview(titleLabel) //ςΩετ self.textLabel = UILabel(frame: CGRect(x: size.height + 5.0, y: size.height * 0.3, width: size.width - (size.height + 5.0), height: size.height * 0.7)) textLabel.numberOfLines = 4 textLabel.minimumScaleFactor = 0.5 adView.addSubview(textLabel) ࠂදࣔ༻ͷϏϡʔΛ࡞Δ
ωΠςΟϒࠂͷදࣔ self.adfurikunNative = AdfurikunNativeAd(“ࠂID”) self.adfurikunNative.delegate = self self.adfurikunNative.getNativeAd() return adView
} ࠂදࣔ༻ͷϏϡʔΛ࡞Δ σϦήʔτΛઃఆ AdfurikunNativeAdDelegate
ωΠςΟϒࠂͷදࣔ func apiDidFinishLoading(_ nativeAdInfo: AdfurikunNativeAdInfo, adnetworkKey networkKey: String!) { if
let url = URL(string: nativeAdInfo.img_url) { let task = URLSession.shared.dataTask(with: url) { data, response, error in if let d = data, error == nil{ DispatchQueue.main.async { self.imageView.image = UIImage(data: d) //ը૾ self.titleLabel.text = nativeAdInfo.title //λΠτϧ self.textLabel.text = nativeAdInfo.text //ςΩετ //ϦϯΫ if let url = nativeAdInfo.link_url { self.nativeLinkURL = URL(string: url) } //λοϓδΣενϟʔ let tapGesture = UITapGestureRecognizer(target: self.nativeAdView, action: #selector(self.naitiveAdTap(_:))) self.nativeAdView.addGestureRecognizer(tapGesture) } } } task.resume() } } func apiDidFailWithError(_ err: Int32, adnetworkKey: String!) { print("Native Ad error: \(adnetworkKey)=\(err)") } σϦήʔτϝιουͰϦιʔεΛऔಘ ϝΠϯεϨουͰઃఆ AdfurikunNativeAdDelegate λοϓΛݕͰ͖ΔΑ͏ʹ ͢Δɻ
ωΠςΟϒࠂͷදࣔ @objc func naitiveAdTap(_ tap: UITapGestureRecognizer) { if let url
= self.nativeLinkURL, UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url, options: [:], completionHandler: { (ok) in AdfurikunNativeAdInfo.makeInstance().recClick() }) } } ࠂΫϦοΫͷ௨
ωΠςΟϒࠂͷදࣔ
ಈըΠϯλʔεςΠγϟϧ ಈըωΠςΟϒ ಈըϦϫʔυ
ΞυϑϦ͘Μಈը4%,ͷಋೖ μϯϩʔυϖʔδ͔Β4%,Λμϯϩʔυ ֤ΞυωοτϫʔΫͷઃఆɺ ͜ͷϚχϡΞϧΛ͝ཡ͍ͩ͘͞ɻ ʢ͜͜ͰׂѪ͠·͢ʣ $PDPB1PETΛ͏ํ๏ָ͕ʂ
ΞυϑϦ͘Μಈը4%,ͷಋೖ ϓϩδΣΫτʹ4%,ΛՃ 4%,Λυϥοάˍυϩοϓɻ BEOFUXPSLT
ΞυϑϦ͘Μ4%,ͷಋೖ ϑϨʔϜϫʔΫΛՃ
ϒϦοδϔομهೖ JNQPSU"%'.PWJF3FXBSE"%'NZ.PWJF3FXBSEI JNQPSU"%'.PWJF3FXBSE"%'NZ.PWJF*OUFSTUJUJBMI JNQPSU"%'.PWJF3FXBSE"%'NZ.PWJF/BUJWFI JNQPSU"%'.PWJF3FXBSE"%'NZ.PWJF/BUJWF"E7JFXI JNQPSU"%'.PWJF3FXBSE"%'NZ.PWJF/BUJWF"E'MFYI JNQPSU"%'.PWJF3FXBSE"%'.PWJF0QUJPOTI ΞυϑϦ͘Μಈը4%,ͷಋೖ
ಈըωΠςΟϰ
ಈըωΠςΟϒࠂͷදࣔ var adfurikunMovieNativeView: ADFmyMovieNativeAdView! var videoNativeAdView: UIView! //ಈըωΠςΟϰࠂදࣔϏϡʔ ࠂදࣔ༻ͷϓϩύςΟΛఆٛ
ಈըωΠςΟϒࠂͷදࣔ if ADFmyMovieNativeAdView.isSupportedOSVersion() { ADFmyMovieNativeAdView.configure(withAppID: “ࠂID”) } ॳظԽ ىಈޙʹ࣮ߦ
ಈըωΠςΟϒࠂͷදࣔ func makeVideoNativeView(size: CGSize) -> UIView { let rect =
CGRect(x: 0, y: 0, width: size.width, height: size.height) let adView: UIView = UIView(frame: rect) if ADFmyMovieNativeAdView.isSupportedOSVersion() { self.adfurikunMovieNativeView = ADFmyMovieNativeAdView(appID: “ࠂID”, layoutPattern: .default) self.adfurikunMovieNativeView.autoLoad = true self.adfurikunMovieNativeView.loadAndNotify(to: self) } self.videoNativeAdView = adView return adView } ࠂදࣔ༻ͷϏϡʔΛ࡞Δ σϦήʔτΛઃఆ ADFmyMovieNativeAdViewDelegate
ಈըωΠςΟϒࠂͷදࣔ //ࠂͷऔಘޭ func onNativeMovieAdViewLoadFinish(_ appID: String) { if let adv
= self.adfurikunMovieNativeView.getAdView() { adv.bounds = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) self.addSubview(adv) adv.center = CGPoint(x: self.frame.size.width / 2, y: self.frame.size.height / 2) self.adfurikunMovieNativeView.setVideoDelegate(self) self.adfurikunMovieNativeView.playVideo() } } //ࠂͷऔಘࣦഊ func onNativeMovieAdViewLoadError(_ error: ADFMovieError, appID: String) { print("ωΠςΟϰࠂͷऔಘࣦഊ:\(error.errorMessage)") } ಈըͷऔಘ σϦήʔτΛઃఆ ADFmyNativeAdViewVideoDelegate ADFmyMovieNativeAdViewDelegate
ಈըωΠςΟϒࠂͷදࣔ ಈըͷ࠶ੜ֬ೝσϦήʔτ //ࠂͷ࠶ੜ։࢝ func onNativeMovieAdViewPlayStart(_ appID: String) { print("ࠂͷ࠶ੜ։࢝:\(appID)") }
//ࠂͷ࠶ੜྃ func onNativeMovieAdViewPlayFinish(_ appID: String, isVideo: Bool) { print("ࠂͷ࠶ੜྃ:\(appID) isVideo=\(isVideo)") } //ࠂͷ࠶ੜࣦഊ func onNativeMovieAdViewPlayFail(_ appID: String, error: ADFMovieError) { print("ࠂͷ࠶ੜࣦഊ:\(appID) \(error.errorMessage)") } ADFmyNativeAdViewVideoDelegate
ಈըΠϯλʔεςΠγϟϧ
ಈըΠϯλʔεςΠγϟϧࠂͷදࣔ if ADFmyMovieInterstitial.isSupportedOSVersion() { ADFmyMovieInterstitial.initWithAppID(“ࠂID”, viewController: self) } if let
ad = ADFmyMovieInterstitial.getInstance(“ࠂID”, delegate: self) { if ad.isPrepared() { ad.play(withPresenting: self) } } ॳظԽ දࣔ ىಈޙʹ࣮ߦ σϦήʔτΛઃఆ ADFmyMovieRewardDelegate
// ࠂͷදࣔ४උ͕ऴΘͬͨ func adsFetchCompleted(_ isTestMode_inApp: Bool) { } // ࠂͷද͕ࣔ։͔࢝ͨ͠
func adsDidShow(_ adnetworkKey: String) { } // ࠂͷදࣔΛ࠷ޙ·ͰऴΘ͔ͬͨ func adsDidCompleteShow() { } // ಈըࠂ࠶ੜΤϥʔ࣌ͷΠϕϯτ func adsPlayFailed() { } // ࠂΛดͨ࣌͡ͷΠϕϯτ func adsDidHide() { } ಈըΠϯλʔεςΠγϟϧࠂͷදࣔ σϦήʔτϝιου ADFmyMovieRewardDelegate σϦήʔτͷϓϩτίϧɺ ಈըϦϫʔυͱಉ͡ʂ ಈըϦϫʔυͷ߹ɺ͜ͷσϦήʔτϝιο υ͕ݺΕͨ࣌ͰɺใुΛ༩͑Δɻ
ಈըϦϫʔυ
ಈըϦϫʔυࠂͷදࣔ ࠂදࣔ༻ͷϓϩύςΟΛఆٛ var adfurikunMovieReward: ADFmyMovieReward!
ॳظԽ දࣔ ಈըϦϫʔυࠂͷදࣔ if ADFmyMovieReward.isSupportedOSVersion() { ADFmyMovieReward.initWithAppID(“ࠂID”, viewController: self) self.adfurikunMovieReward
= ADFmyMovieReward.getInstance(“ࠂID”, delegate: self) } ىಈޙʹ࣮ߦ if self.adfurikunMovieReward.isPrepared() == true { self.adfurikunMovieReward.play() } else { print("ADF ࠂͷऔಘ͕͍ྃͯ͠·ͤΜ") } σϦήʔτΛઃఆ ADFmyMovieRewardDelegate
// ࠂͷදࣔ४උ͕ऴΘͬͨ func adsFetchCompleted(_ isTestMode_inApp: Bool) { } // ࠂͷද͕ࣔ։͔࢝ͨ͠
func adsDidShow(_ adnetworkKey: String) { } // ࠂͷදࣔΛ࠷ޙ·ͰऴΘ͔ͬͨ func adsDidCompleteShow() { } // ಈըࠂ࠶ੜΤϥʔ࣌ͷΠϕϯτ func adsPlayFailed() { } // ࠂΛดͨ࣌͡ͷΠϕϯτ func adsDidHide() { } ಈըϦϫʔυࠂͷදࣔ σϦήʔτϝιου ADFmyMovieRewardDelegate ͜ͷσϦήʔτϝιου͕ݺΕͨ࣌Ͱɺ ใुΛ༩͑Δɻ
ΞυϑϦ͘ΜSDKΛSwift4ͰΈࠐΉ *OΞυϑϦδϡΫ Ҏ্ɺ Ͳ͏͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ