adview_ios.mm 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. #import "adview_ios.h"
  2. #import <AdSupport/ASIdentifierManager.h>
  3. #import <CommonCrypto/CommonDigest.h>
  4. #import <SDL.h>
  5. //Ugly stuff, but need these 'coz admob interstitial/rewardedvideo don't suspend/resume app?
  6. //
  7. static void suspendApp(){
  8. //send a 'fake' SDL_APP_WILLENTERBACKGROUND to app.
  9. SDL_Event event={0};
  10. event.type=SDL_APP_WILLENTERBACKGROUND;
  11. if( SDL_PeepEvents( (SDL_Event*)&event,1,SDL_ADDEVENT,SDL_FIRSTEVENT,SDL_LASTEVENT )!=1 ){
  12. printf( "SDL_PeepEvents error: %s\n",SDL_GetError() );fflush( stdout );
  13. }
  14. }
  15. static void resumeApp(){
  16. //send a 'fake' SDL_APP_DIDENTERFOREGROUND to app.
  17. SDL_Event event={0};
  18. event.type=SDL_APP_DIDENTERFOREGROUND;
  19. if( SDL_PeepEvents( (SDL_Event*)&event,1,SDL_ADDEVENT,SDL_FIRSTEVENT,SDL_LASTEVENT )!=1 ){
  20. printf( "SDL_PeepEvents error: %s\n",SDL_GetError() );fflush( stdout );
  21. }
  22. }
  23. @implementation BBAdmobDelegate{
  24. BBAdView *_view;
  25. }
  26. -(id)initWithView:(BBAdView*)view{
  27. self=[super init];
  28. if( self ){
  29. _view=view;
  30. }
  31. return self;
  32. }
  33. -(void)adViewDidReceiveAd:(GADBannerView*)bannerView{
  34. printf( "Monkey2 AdViewDelegate: adViewDidReceiveAd\n" );fflush( stdout );
  35. _view->setState( 2 ); //Ready
  36. }
  37. -(void)adView:(GADBannerView*)bannerView didFailToReceiveAdWithError:(GADRequestError*)error{
  38. NSString *err=error.localizedDescription;
  39. printf( "Monkey2 AdViewDelegate: bannerView didFailToReceiveAdWithError '%s' code=%ld\n",[err UTF8String],(long)error.code );fflush( stdout );
  40. _view->_error=error.code==9 ? 1 : -1;
  41. _view->setState( 3 ); //Error
  42. }
  43. -(void)interstitialDidReceiveAd:(GADInterstitial*)interstitial{
  44. printf( "Monkey2 AdViewDelegate: interstitialDidReceivedAd\n" );fflush( stdout );
  45. _view->setState( 2 ); //Ready
  46. }
  47. -(void)interstitial:(GADInterstitial*)ad didFailToReceiveAdWithError:(GADRequestError*)error{
  48. NSString *err=error.localizedDescription;
  49. printf( "Monkey2 AdViewDelegate: interstitial didFailToReceiveAdWithError '%s' code=%ld\n",[err UTF8String],(long)error.code );fflush( stdout );
  50. _view->_error=error.code==9 ? 1 : -1;
  51. _view->setState( 3 ); //Error
  52. }
  53. -(void)interstitialWillPresentScreen:(GADInterstitial*)interstitial{
  54. printf( "Monkey2 AdViewDelegate: interstitialWillPresentScreen\n" );fflush( stdout );
  55. suspendApp();
  56. }
  57. -(void)interstitialDidDismissScreen:(GADInterstitial*)interstitial{
  58. printf( "Monkey2 AdViewDelegate: interstitialDidDismissScreen\n" );fflush( stdout );
  59. _view->setState( 0 ); //Initial
  60. resumeApp();
  61. }
  62. -(void)rewardBasedVideoAd:(GADRewardBasedVideoAd*)rewardBasedVideoAd didRewardUserWithReward:(GADAdReward*)reward{
  63. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAd didRewardUserWithReward, type='%s', amount=%l\n",[reward.type UTF8String],[reward.amount doubleValue] );fflush( stdout );
  64. _view->_rewardType=bbString( reward.type ); //careful! threading...
  65. _view->_rewardAmount=(int)[reward.amount doubleValue];
  66. }
  67. -(void)rewardBasedVideoAdDidReceiveAd:(GADRewardBasedVideoAd*)rewardBasedVideoAd{
  68. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAdDidReceiveAd\n" );fflush( stdout );
  69. _view->setState( 2 ); //Ready
  70. }
  71. -(void)rewardBasedVideoAd:(GADRewardBasedVideoAd*)rewardBasedVideoAd didFailToLoadWithError:(NSError*)error{
  72. NSString *err=error.localizedDescription;
  73. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAd didFailToLoadWithError '%s' code=%ld\n",[err UTF8String],(long)error.code );fflush( stdout );
  74. _view->_error=error.code==9 ? 1 : -1;
  75. _view->setState( 3 ); //Error
  76. }
  77. -(void)rewardBasedVideoAdDidOpen:(GADRewardBasedVideoAd*)rewardBasedVideoAd{
  78. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAdDidOpen\n" );fflush( stdout );
  79. // _view->setState( 4 ); //Playing
  80. suspendApp();
  81. }
  82. -(void)rewardBasedVideoAdDidClose:(GADRewardBasedVideoAd*)rewardBasedVideoAd{
  83. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAdDidClose\n" );fflush( stdout );
  84. _view->setState( 0 ); //Initial
  85. resumeApp();
  86. }
  87. -(void)rewardBasedVideoAdDidStartPlaying:(GADRewardBasedVideoAd*)rewardBasedVideoAd{
  88. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAdDidStartPlaying\n" );fflush( stdout );
  89. }
  90. -(void)rewardBasedVideoAdWillLeaveApplication:(GADRewardBasedVideoAd*)rewardBasedVideoAd{
  91. printf( "Monkey2 AdViewDelegate: rewardBasedVideoAdWillLeaveApplication\n" );fflush( stdout );
  92. }
  93. @end
  94. static NSString *admobDeviceID(){
  95. NSUUID* adid = [[ASIdentifierManager sharedManager] advertisingIdentifier];
  96. const char *cStr = [adid.UUIDString UTF8String];
  97. unsigned char digest[16];
  98. CC_MD5( cStr, strlen(cStr), digest );
  99. NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  100. for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
  101. [output appendFormat:@"%02x", digest[i]];
  102. return output;
  103. }
  104. BBAdView::BBAdView( bbString size,bbString layout,bbString adUnitId,bbBool visible ):_size( size ),_layout( layout ),_adUnitId( adUnitId ),_visible( visible ){
  105. }
  106. void BBAdView::start( int callback ){
  107. _callback=callback;
  108. _adDelegate=[[BBAdmobDelegate alloc] initWithView:this];
  109. _adRequest=[GADRequest request];
  110. if( _size=="rewardedvideo" ){
  111. if( _adUnitId=="" ) _adUnitId="ca-app-pub-3940256099942544/1712485313";
  112. createRewardBasedVideoAd();
  113. }else if( _size=="interstitial" ){
  114. if( _adUnitId=="" ) _adUnitId="ca-app-pub-3940256099942544/1033173712";
  115. createInterstitialAd();
  116. }else{
  117. if( _adUnitId=="" ) _adUnitId="ca-app-pub-3940256099942544/6300978111";
  118. createBannerAd();
  119. }
  120. }
  121. void BBAdView::setState( int state ){
  122. if( state==_state ) return;
  123. _state=state;
  124. bbAsync::invokeAsyncCallback( _callback );
  125. }
  126. void BBAdView::createRewardBasedVideoAd(){
  127. _rewardBasedVideoAd=[GADRewardBasedVideoAd sharedInstance];
  128. _rewardBasedVideoAd.delegate=_adDelegate;
  129. [_rewardBasedVideoAd loadRequest:[GADRequest request] withAdUnitID:[NSString stringWithUTF8String:_adUnitId.c_str()]];
  130. setState( 1 );
  131. }
  132. void BBAdView::createInterstitialAd(){
  133. _interstitialAd=[[GADInterstitial alloc] initWithAdUnitID:[NSString stringWithUTF8String:_adUnitId.c_str()]];
  134. _interstitialAd.delegate=_adDelegate;
  135. [_interstitialAd loadRequest:[GADRequest request]];
  136. setState( 1 );
  137. }
  138. void BBAdView::createBannerAd(){
  139. UIWindow *keyWindow=[UIApplication sharedApplication].keyWindow;
  140. if( !keyWindow ) return;
  141. UIViewController *rootViewController=keyWindow.rootViewController;
  142. if( !rootViewController ) return;
  143. GADAdSize adSize=kGADAdSizeBanner;
  144. if( _size=="banner" ){
  145. adSize=kGADAdSizeBanner;
  146. }else if( _size=="large-banner" ){
  147. adSize=kGADAdSizeLargeBanner;
  148. }else if( _size=="medium-rectangle" ){
  149. adSize=kGADAdSizeMediumRectangle;
  150. }else if( _size=="full-banner" ){
  151. adSize=kGADAdSizeFullBanner;
  152. }else if( _size=="leaderboard" ){
  153. adSize=kGADAdSizeLeaderboard;
  154. }
  155. _adView=[[GADBannerView alloc] initWithAdSize:adSize];
  156. _adView.delegate=_adDelegate;
  157. _adView.adUnitID=[NSString stringWithUTF8String:_adUnitId.c_str()];
  158. _adView.rootViewController=rootViewController;
  159. _adView.hidden=_visible ? NO : YES;
  160. CGRect b1=keyWindow.bounds;
  161. CGRect b2=_adView.frame;
  162. if( _layout=="top-left" ){
  163. _adView.autoresizingMask=UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
  164. }else if( _layout=="top" ){
  165. b2.origin.x=(b1.size.width-b2.size.width)/2;
  166. _adView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
  167. }else if( _layout=="top-right" ){
  168. b2.origin.x=(b1.size.width-b2.size.width);
  169. _adView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleBottomMargin;
  170. }else if( _layout=="bottom-left" ){
  171. b2.origin.y=(b1.size.height-b2.size.height);
  172. _adView.autoresizingMask=UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin;
  173. }else if( _layout=="bottom" ){
  174. b2.origin.x=(b1.size.width-b2.size.width)/2;
  175. b2.origin.y=(b1.size.height-b2.size.height);
  176. _adView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin;
  177. }else if( _layout=="bottom-right" ){
  178. b2.origin.x=(b1.size.width-b2.size.width);
  179. b2.origin.y=(b1.size.height-b2.size.height);
  180. _adView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin;
  181. }else{
  182. b2.origin.x=(b1.size.width-b2.size.width)/2;
  183. b2.origin.y=(b1.size.height-b2.size.height)/2;
  184. _adView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;
  185. }
  186. _adView.frame=b2;
  187. [_adView.rootViewController.view addSubview:_adView];
  188. [_adView loadRequest:_adRequest];
  189. setState( 1 );
  190. }
  191. void BBAdView::setVisible( bool visible ){
  192. if( _adView ){
  193. _adView.hidden=!visible;
  194. return;
  195. }
  196. if( !visible ) return;
  197. if( _state!=2 ){
  198. printf( "Monkey2 AdView setVisible error, expecting _state==2, but _state==%i\n",_state );fflush( stdout );
  199. return;
  200. }
  201. if( _rewardBasedVideoAd ){
  202. if( _rewardBasedVideoAd.isReady ){
  203. UIWindow *keyWindow=[UIApplication sharedApplication].keyWindow;
  204. if( !keyWindow ) return;
  205. UIViewController *rootViewController=keyWindow.rootViewController;
  206. if( !rootViewController ) return;
  207. [_rewardBasedVideoAd presentFromRootViewController:rootViewController];
  208. }
  209. }else if( _interstitialAd ){
  210. if( _interstitialAd.isReady ){
  211. UIWindow *keyWindow=[UIApplication sharedApplication].keyWindow;
  212. if( !keyWindow ) return;
  213. UIViewController *rootViewController=keyWindow.rootViewController;
  214. if( !rootViewController ) return;
  215. [_interstitialAd presentFromRootViewController:rootViewController];
  216. }
  217. }
  218. }
  219. bool BBAdView::getVisible(){
  220. return _adView && _adView.hidden==NO;
  221. }
  222. int BBAdView::getState(){
  223. return _state;
  224. }
  225. int BBAdView::getError(){
  226. return _error;
  227. }
  228. bbString BBAdView::getRewardType(){
  229. return _rewardType;
  230. }
  231. int BBAdView::getRewardAmount(){
  232. return _rewardAmount;
  233. }
  234. void BBAdView::consumeReward(){
  235. _rewardType="";
  236. _rewardAmount=0;
  237. }
  238. void BBAdView::reload(){
  239. _state=0;
  240. if( _size=="rewardedvideo" ){
  241. createRewardBasedVideoAd();
  242. }else if( _size=="interstitial" ){
  243. createInterstitialAd();
  244. }else{
  245. createBannerAd();
  246. }
  247. }