GADUBanner.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. // Copyright 2014 Google Inc. All Rights Reserved.
  2. #import "GADUBanner.h"
  3. #import <CoreGraphics/CoreGraphics.h>
  4. #import <UIKit/UIKit.h>
  5. #import "GADUPluginUtil.h"
  6. #import "UnityAppController.h"
  7. @interface GADUBanner () <GADBannerViewDelegate>
  8. /// Defines where the ad should be positioned on the screen with a GADAdPosition.
  9. @property(nonatomic, assign) GADAdPosition adPosition;
  10. /// Defines where the ad should be positioned on the screen with a CGPoint.
  11. @property(nonatomic, assign) CGPoint customAdPosition;
  12. @end
  13. @implementation GADUBanner
  14. - (id)initWithBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  15. adUnitID:(NSString *)adUnitID
  16. width:(CGFloat)width
  17. height:(CGFloat)height
  18. adPosition:(GADAdPosition)adPosition {
  19. return [self initWithBannerClientReference:bannerClient
  20. adUnitID:adUnitID
  21. adSize:[GADUPluginUtil adSizeForWidth:width height:height]
  22. adPosition:adPosition];
  23. }
  24. - (id)initWithBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  25. adUnitID:(NSString *)adUnitID
  26. width:(CGFloat)width
  27. height:(CGFloat)height
  28. customAdPosition:(CGPoint)customAdPosition {
  29. return [self initWithBannerClientReference:bannerClient
  30. adUnitID:adUnitID
  31. adSize:[GADUPluginUtil adSizeForWidth:width height:height]
  32. customAdPosition:customAdPosition];
  33. }
  34. - (id)initWithSmartBannerSizeAndBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  35. adUnitID:(NSString *)adUnitID
  36. adPosition:(GADAdPosition)adPosition {
  37. // Choose the correct Smart Banner constant according to orientation.
  38. UIInterfaceOrientation currentOrientation =
  39. [UIApplication sharedApplication].statusBarOrientation;
  40. GADAdSize adSize;
  41. if (UIInterfaceOrientationIsPortrait(currentOrientation)) {
  42. adSize = kGADAdSizeSmartBannerPortrait;
  43. } else {
  44. adSize = kGADAdSizeSmartBannerLandscape;
  45. }
  46. return [self initWithBannerClientReference:bannerClient
  47. adUnitID:adUnitID
  48. adSize:adSize
  49. adPosition:adPosition];
  50. }
  51. - (id)initWithSmartBannerSizeAndBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  52. adUnitID:(NSString *)adUnitID
  53. customAdPosition:(CGPoint)customAdPosition {
  54. // Choose the correct Smart Banner constant according to orientation.
  55. UIInterfaceOrientation currentOrientation =
  56. [UIApplication sharedApplication].statusBarOrientation;
  57. GADAdSize adSize;
  58. if (UIInterfaceOrientationIsPortrait(currentOrientation)) {
  59. adSize = kGADAdSizeSmartBannerPortrait;
  60. } else {
  61. adSize = kGADAdSizeSmartBannerLandscape;
  62. }
  63. return [self initWithBannerClientReference:bannerClient
  64. adUnitID:adUnitID
  65. adSize:adSize
  66. customAdPosition:customAdPosition];
  67. }
  68. - (id)initWithAdaptiveBannerSizeAndBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  69. adUnitID:(NSString *)adUnitID
  70. width:(NSInteger)width
  71. orientation:(GADUBannerOrientation)orientation
  72. adPosition:(GADAdPosition)adPosition {
  73. return [self initWithBannerClientReference:bannerClient
  74. adUnitID:adUnitID
  75. adSize:[GADUPluginUtil adaptiveAdSizeForWidth:(CGFloat)width
  76. orientation:orientation]
  77. adPosition:adPosition];
  78. }
  79. - (id)initWithAdaptiveBannerSizeAndBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  80. adUnitID:(NSString *)adUnitID
  81. width:(NSInteger)width
  82. orientation:(GADUBannerOrientation)orientation
  83. customAdPosition:(CGPoint)customAdPosition {
  84. return [self initWithBannerClientReference:bannerClient
  85. adUnitID:adUnitID
  86. adSize:[GADUPluginUtil adaptiveAdSizeForWidth:(CGFloat)width
  87. orientation:orientation]
  88. customAdPosition:customAdPosition];
  89. }
  90. - (id)initWithBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  91. adUnitID:(NSString *)adUnitID
  92. adSize:(GADAdSize)size
  93. adPosition:(GADAdPosition)adPosition {
  94. self = [super init];
  95. if (self) {
  96. _bannerClient = bannerClient;
  97. _adPosition = adPosition;
  98. _bannerView = [[GADBannerView alloc] initWithAdSize:[GADUPluginUtil safeAdSizeForAdSize:size]];
  99. _bannerView.adUnitID = adUnitID;
  100. _bannerView.delegate = self;
  101. _bannerView.rootViewController = [GADUPluginUtil unityGLViewController];
  102. [self addPaidEventHandler];
  103. }
  104. return self;
  105. }
  106. - (id)initWithBannerClientReference:(GADUTypeBannerClientRef *)bannerClient
  107. adUnitID:(NSString *)adUnitID
  108. adSize:(GADAdSize)size
  109. customAdPosition:(CGPoint)customAdPosition {
  110. self = [super init];
  111. if (self) {
  112. _bannerClient = bannerClient;
  113. _customAdPosition = customAdPosition;
  114. _adPosition = kGADAdPositionCustom;
  115. _bannerView = [[GADBannerView alloc] initWithAdSize:[GADUPluginUtil safeAdSizeForAdSize:size]];
  116. _bannerView.adUnitID = adUnitID;
  117. _bannerView.delegate = self;
  118. _bannerView.rootViewController = [GADUPluginUtil unityGLViewController];
  119. [self addPaidEventHandler];
  120. }
  121. return self;
  122. }
  123. - (void)dealloc {
  124. _bannerView.delegate = nil;
  125. }
  126. - (void)addPaidEventHandler {
  127. __weak GADUBanner *weakSelf = self;
  128. _bannerView.paidEventHandler = ^void(GADAdValue *_Nonnull adValue) {
  129. GADUBanner *strongSelf = weakSelf;
  130. if (strongSelf.paidEventCallback) {
  131. int64_t valueInMicros = [adValue.value decimalNumberByMultiplyingByPowerOf10:6].longLongValue;
  132. strongSelf.paidEventCallback(
  133. strongSelf.bannerClient, (int)adValue.precision, valueInMicros,
  134. [adValue.currencyCode cStringUsingEncoding:NSUTF8StringEncoding]);
  135. }
  136. };
  137. }
  138. - (void)loadRequest:(GADRequest *)request {
  139. if (!self.bannerView) {
  140. NSLog(@"GoogleMobileAdsPlugin: BannerView is nil. Ignoring ad request.");
  141. return;
  142. }
  143. [self.bannerView loadRequest:request];
  144. }
  145. - (void)hideBannerView {
  146. if (!self.bannerView) {
  147. NSLog(@"GoogleMobileAdsPlugin: BannerView is nil. Ignoring call to hideBannerView");
  148. return;
  149. }
  150. self.bannerView.hidden = YES;
  151. }
  152. - (void)showBannerView {
  153. if (!self.bannerView) {
  154. NSLog(@"GoogleMobileAdsPlugin: BannerView is nil. Ignoring call to showBannerView");
  155. return;
  156. }
  157. self.bannerView.hidden = NO;
  158. }
  159. - (void)removeBannerView {
  160. if (!self.bannerView) {
  161. NSLog(@"GoogleMobileAdsPlugin: BannerView is nil. Ignoring call to removeBannerView");
  162. return;
  163. }
  164. [self.bannerView removeFromSuperview];
  165. }
  166. - (NSString *)mediationAdapterClassName {
  167. return self.bannerView.responseInfo.adNetworkClassName;
  168. }
  169. - (GADResponseInfo *)responseInfo {
  170. return self.bannerView.responseInfo;
  171. }
  172. - (CGFloat)heightInPixels {
  173. return CGRectGetHeight(CGRectStandardize(self.bannerView.frame)) * [UIScreen mainScreen].scale;
  174. }
  175. - (CGFloat)widthInPixels {
  176. return CGRectGetWidth(CGRectStandardize(self.bannerView.frame)) * [UIScreen mainScreen].scale;
  177. }
  178. - (void)setAdPosition:(GADAdPosition)adPosition {
  179. _adPosition = adPosition;
  180. [self positionBannerView];
  181. }
  182. - (void)setCustomAdPosition:(CGPoint)customPosition {
  183. _customAdPosition = customPosition;
  184. _adPosition = kGADAdPositionCustom;
  185. [self positionBannerView];
  186. }
  187. - (void)positionBannerView {
  188. /// Align the bannerView in the Unity view bounds.
  189. UIView *unityView = [GADUPluginUtil unityGLViewController].view;
  190. if (self.adPosition != kGADAdPositionCustom) {
  191. [GADUPluginUtil positionView:self.bannerView inParentView:unityView adPosition:self.adPosition];
  192. } else {
  193. [GADUPluginUtil positionView:self.bannerView
  194. inParentView:unityView
  195. customPosition:self.customAdPosition];
  196. }
  197. }
  198. #pragma mark GADBannerViewDelegate implementation
  199. - (void)adViewDidReceiveAd:(GADBannerView *)adView {
  200. // Remove existing banner view from superview.
  201. [self.bannerView removeFromSuperview];
  202. // Add the new banner view.
  203. self.bannerView = adView;
  204. /// Align the bannerView in the Unity view bounds.
  205. UIView *unityView = [GADUPluginUtil unityGLViewController].view;
  206. [self positionBannerView];
  207. [unityView addSubview:self.bannerView];
  208. if (self.adReceivedCallback) {
  209. self.adReceivedCallback(self.bannerClient);
  210. }
  211. }
  212. - (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error {
  213. if (self.adFailedCallback) {
  214. NSString *errorMsg = [NSString
  215. stringWithFormat:@"Failed to receive ad with error: %@", [error localizedDescription]];
  216. self.adFailedCallback(self.bannerClient, [errorMsg cStringUsingEncoding:NSUTF8StringEncoding]);
  217. }
  218. }
  219. - (void)adViewWillPresentScreen:(GADBannerView *)adView {
  220. if (self.willPresentCallback) {
  221. self.willPresentCallback(self.bannerClient);
  222. }
  223. }
  224. - (void)adViewWillDismissScreen:(GADBannerView *)adView {
  225. // Callback is not forwarded to Unity.
  226. }
  227. - (void)adViewDidDismissScreen:(GADBannerView *)adView {
  228. if (self.didDismissCallback) {
  229. self.didDismissCallback(self.bannerClient);
  230. }
  231. }
  232. - (void)adViewWillLeaveApplication:(GADBannerView *)adView {
  233. if (self.willLeaveCallback) {
  234. self.willLeaveCallback(self.bannerClient);
  235. }
  236. }
  237. @end