{"id":661,"date":"2012-06-26T18:03:13","date_gmt":"2012-06-26T18:03:13","guid":{"rendered":"http:\/\/www.sitekickr.com\/blog\/?p=661"},"modified":"2012-07-26T01:30:53","modified_gmt":"2012-07-26T01:30:53","slug":"phonegap-cordova-iad-integration","status":"publish","type":"post","link":"https:\/\/www.sitekickr.com\/blog\/phonegap-cordova-iad-integration\/","title":{"rendered":"PhoneGap \/ Cordova and iAd integration"},"content":{"rendered":"<p>PhoneGap (Cordova) users, you are no doubt used to dealing with PhoneGap plugins to interact with frameworks, to keep your distance from having to dive into Objective-C. Well, in the case of iAd integration, you might actually find that the native approach is easier.<\/p>\n<p>What&#39;s one of the biggest headaches as the layers of abstraction get higher and higher &#8211; dependencies. Finding the right plugin to match your version of PhoneGap, and integrating it requires another layer that just isn&#39;t necessary.<\/p>\n<p>I&#39;m going to describe the step to integrate iAd into your PhoneGap application, leaving you amazed at how simple it is. Note that I&#39;m walking through this using XCode 4.3.2. The steps may be different for earlier\/later releases.<\/p>\n<ol>\n<li>Click on the top-most item in your hierarchy, the target. In the <strong>Build Phases<\/strong> tab, expand <strong>Link Binary with Libraries<\/strong>.<\/li>\n<li>Click the + icon to add the iAd.framework to your project.<\/li>\n<li>In your app -&gt; Classes folder, open up <em>MainViewController.h<\/em>, and drop in the following code:\n<p class=\"p1\"><code><span class=\"s1\">#import <\/span>&lt;iAd\/iAd.h&gt;<br \/>\n\t\t\t<\/code><\/p>\n<p class=\"p1\"><code><span class=\"s1\">@interface<\/span> MainViewController : <span class=\"s2\">CDVViewController<\/span> {<br \/>\n\t\t\t&nbsp; &nbsp; ADBannerView<span class=\"s3\"> *adView;<br \/>\n\t\t\t<\/span>}<br \/>\n\t\t\t<\/code><\/p>\n<\/li>\n<li>\n<p class=\"p1\">Open up <em>MainViewController.m<\/em><\/p>\n<\/li>\n<li>\n<p class=\"p1\">In your viewDidUnload method, add:<\/p>\n<p class=\"p1\"><code><span class=\"s1\">[<\/span><span class=\"s2\">adView<\/span><span class=\"s1\"> <\/span>release<span class=\"s1\">];<\/span><\/code><\/p>\n<p>&nbsp;<\/p>\n<\/li>\n<li>\n<p class=\"p1\">In your&nbsp;webViewDidFinishLoad method, add:<br \/>\n\t\t\t&nbsp;<\/p>\n<p class=\"p1\"><code><span class=\"s2\">adView<\/span><span class=\"s1\"> = [[<\/span>ADBannerView<span class=\"s1\"> <\/span><span class=\"s3\">alloc<\/span><span class=\"s1\">] <\/span><span class=\"s3\">initWithFrame<\/span><span class=\"s1\">:<\/span>CGRectZero<span class=\"s1\">];<br \/>\n\t\t\t<\/span><span class=\"s2\"><br \/>\n\t\t\t<\/span><\/code><\/p>\n<p class=\"p1\"><code><span class=\"s2\">if<\/span><span class=\"s1\">([<\/span><span class=\"s3\">UIApplication<\/span><span class=\"s1\"> <\/span>sharedApplication<span class=\"s1\">].<\/span><span class=\"s3\">statusBarOrientation&nbsp;<\/span><span class=\"s1\">==&nbsp;<br \/>\n\t\t\t<\/span>&nbsp; &nbsp; UIInterfaceOrientationPortrait<span class=\"s1\"> || <br \/>\n\t\t\t&nbsp; &nbsp;[<\/span><span class=\"s3\">UIApplication<\/span><span class=\"s1\"> <\/span>sharedApplication<span class=\"s1\">].<\/span><span class=\"s3\">statusBarOrientation<\/span><span class=\"s1\"> ==<br \/>\n\t\t\t<\/span>&nbsp; &nbsp; UIInterfaceOrientationPortraitUpsideDown<span class=\"s1\">) {<br \/>\n\t\t\t<\/span><span class=\"s4\">&nbsp; adView<\/span><span class=\"s1\">.<\/span>currentContentSizeIdentifier<span class=\"s1\"> = <\/span>ADBannerContentSizeIdentifierPortrait<span class=\"s1\">;<br \/>\n\t\t\t}<br \/>\n\t\t\t<\/span>else<span class=\"s1\"> {<br \/>\n\t\t\t<\/span><span class=\"s4\">&nbsp; adView<\/span><span class=\"s1\">.<\/span>currentContentSizeIdentifier<span class=\"s1\"> = <\/span>ADBannerContentSizeIdentifierLandscape<span class=\"s1\">;<br \/>\n\t\t\t}<\/span><\/code><\/p>\n<p>\t\t<code><br \/>\n\t\tadView<span class=\"s1\">.<\/span>currentContentSizeIdentifier<span class=\"s1\"> = <\/span>ADBannerContentSizeIdentifierPortrait<span class=\"s1\">;<br \/>\n\t\t<\/span><span class=\"s4\">CGRect<\/span> adFrame = <span class=\"s2\">adView<\/span>.<span class=\"s4\">frame<\/span>;<br \/>\n\t\t<span class=\"s1\">adFrame.<\/span>origin<span class=\"s1\">.<\/span>y<span class=\"s1\"> = <\/span><span class=\"s5\">self<\/span><span class=\"s1\">.<\/span>view<span class=\"s1\">.<\/span>frame<span class=\"s1\">.<\/span>size<span class=\"s1\">.<\/span>height<span class=\"s1\">-<\/span><span class=\"s2\">adView<\/span><span class=\"s1\">.<\/span>frame<span class=\"s1\">.<\/span>size<span class=\"s1\">.<\/span>height<span class=\"s1\">;<br \/>\n\t\t<\/span><span class=\"s2\">adView<\/span>.<span class=\"s4\">frame<\/span> = adFrame;<br \/>\n\t\t<span class=\"s1\">[<\/span><span class=\"s5\">self<\/span><span class=\"s1\">.<\/span><span class=\"s4\">view<\/span><span class=\"s1\"> <\/span>addSubview<span class=\"s1\">:<\/span><span class=\"s2\">adView<\/span><span class=\"s1\">];<\/p>\n<p>\t\t<\/span><\/code><\/p>\n<p>&nbsp;<\/p>\n<\/li>\n<li>\n<p class=\"p1\">If you don&#39;t already have a&nbsp;willAnimateRotationToInterfaceOrientation method, add it, and drop in the following code:<br \/>\n\t\t\t&nbsp;<\/p>\n<p class=\"p1\"><code>- (<span class=\"s1\">void<\/span>)willAnimateRotationToInterfaceOrientation:(<span class=\"s2\">UIInterfaceOrientation<\/span>)newInterfaceOrientation duration:(<span class=\"s2\">NSTimeInterval<\/span>)duration {<br \/>\n\t\t\t<span class=\"s1\"><br \/>\n\t\t\t&nbsp; BOOL<\/span><span class=\"s3\"> hide = (newInterfaceOrientation == <\/span>UIInterfaceOrientationLandscapeLeft<span class=\"s3\"> || newInterfaceOrientation == <\/span>UIInterfaceOrientationLandscapeRight<span class=\"s3\">);<br \/>\n\t\t\t<\/span><span class=\"s3\">&nbsp; [[<\/span><span class=\"s2\">UIApplication<\/span><span class=\"s3\"> <\/span>sharedApplication<span class=\"s3\">] <\/span>setStatusBarHidden<span class=\"s3\">:hide <\/span>withAnimation<span class=\"s3\">:<\/span>UIStatusBarAnimationNone<span class=\"s3\">];<br \/>\n\t\t\t<\/span><span class=\"s2\">&nbsp; CGRect<\/span><span class=\"s3\"> mainFrame = [[<\/span><span class=\"s2\">UIScreen<\/span><span class=\"s3\"> <\/span>mainScreen<span class=\"s3\">] <\/span>applicationFrame<span class=\"s3\">];<br \/>\n\t\t\t<\/span>&nbsp; [<span class=\"s1\">self<\/span>.<span class=\"s2\">view<\/span> <span class=\"s4\">setFrame<\/span>:mainFrame];<\/code><\/p>\n<p class=\"p2\"><code><span class=\"s1\">&nbsp; if<\/span><span class=\"s3\"> (newInterfaceOrientation != <\/span>UIInterfaceOrientationLandscapeLeft<span class=\"s3\"> &amp;&amp; newInterfaceOrientation != <\/span>UIInterfaceOrientationLandscapeRight<span class=\"s3\">) {<br \/>\n\t\t\t<\/span><span class=\"s5\"><br \/>\n\t\t\t&nbsp; &nbsp; adView<\/span><span class=\"s3\">.<\/span>currentContentSizeIdentifier<span class=\"s3\"> = <\/span>ADBannerContentSizeIdentifierPortrait<span class=\"s3\">;<br \/>\n\t\t\t<\/span><span class=\"s3\">&nbsp; &nbsp; [<\/span><span class=\"s1\">self<\/span><span class=\"s3\">.<\/span><span class=\"s2\">view<\/span><span class=\"s3\"> <\/span>bringSubviewToFront<span class=\"s3\">:<\/span><span class=\"s5\">adView<\/span><span class=\"s3\">];<br \/>\n\t\t\t<\/span><span class=\"s5\">&nbsp; &nbsp; adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\"> = <\/span><span class=\"s4\">CGRectMake<\/span><span class=\"s3\">(<\/span><span class=\"s6\">0.0<\/span><span class=\"s3\">, <\/span><span class=\"s1\">self<\/span><span class=\"s3\">.<\/span>view<span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>height<span class=\"s3\"> - <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>height<span class=\"s3\">, <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>width<span class=\"s3\">, <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>height<span class=\"s3\">);<\/span><\/code><\/p>\n<p class=\"p1\"><code>&nbsp; }<\/code><\/p>\n<p class=\"p6\"><code>&nbsp; else<span class=\"s3\"> {<\/span><\/code><\/p>\n<p class=\"p4\"><code><span class=\"s5\">&nbsp; &nbsp;adView<\/span><span class=\"s3\">.<\/span>currentContentSizeIdentifier<span class=\"s3\"> = <\/span>ADBannerContentSizeIdentifierLandscape<span class=\"s3\">;<br \/>\n\t\t\t<\/span><span class=\"s3\">&nbsp; &nbsp;[<\/span><span class=\"s1\">self<\/span><span class=\"s3\">.<\/span><span class=\"s2\">view<\/span><span class=\"s3\"> <\/span>bringSubviewToFront<span class=\"s3\">:<\/span><span class=\"s5\">adView<\/span><span class=\"s3\">];<br \/>\n\t\t\t<\/span><span class=\"s5\">&nbsp; &nbsp;adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\"> = <\/span><span class=\"s4\">CGRectMake<\/span><span class=\"s3\">(<\/span><span class=\"s6\">0.0<\/span><span class=\"s3\">, <\/span><span class=\"s1\">self<\/span><span class=\"s3\">.<\/span>view<span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>width<span class=\"s3\"> - <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>height<span class=\"s3\">, <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>width<span class=\"s3\">, <\/span><span class=\"s5\">adView<\/span><span class=\"s3\">.<\/span>frame<span class=\"s3\">.<\/span>size<span class=\"s3\">.<\/span>height<span class=\"s3\">);<\/span><\/code><\/p>\n<p class=\"p1\"><code>&nbsp; &nbsp;}<\/code><\/p>\n<p class=\"p5\"><code>}<\/code><\/p>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p class=\"p5\">&nbsp;<\/p>\n<p class=\"p5\">Steps 1-6 should be somewhat straightforward, but let&#39;s talk about step #7 a bit. &nbsp;Essentially what we&#39;re doing here is handling the change in orientation of the phone from portrait to landscape mode, and vice-versa. iAd advertisements have different sizes which are better suited to a given orientation. But, this is not handled automatically.<\/p>\n<p class=\"p5\">You need to adjust not only the size of the ad displayed, but also it&#39;s position in the view, whenever the orientation is changed. One of the most confusing aspects, is that although the orientation has changed, the dimensions stick.<\/p>\n<p class=\"p5\">For example, in portrait mode, self.view.frame.size.width will read 320. However, it reads the same dimension even in landscape mode. So, to properly place the ad in landscape (if you wish to place it at the bottom of the view), we need to subtract the ad height from the frame width.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PhoneGap (Cordova) users, you are no doubt used to dealing with PhoneGap plugins to interact with frameworks, to keep your distance from having to dive&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"amp_status":""},"categories":[132],"tags":[181],"_links":{"self":[{"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/posts\/661"}],"collection":[{"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":4,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":693,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/posts\/661\/revisions\/693"}],"wp:attachment":[{"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/media?parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/categories?post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sitekickr.com\/blog\/wp-json\/wp\/v2\/tags?post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}