カテゴリー: iPhone関連のプログラムなど

【iOS13】最新のAdMob SDKに更新する時の注意点【UIWebViewが廃止】

iOS13になり、いくつか「今までOKだったけどこれからはダメ」というものが増えました。

詳しくは下記あたりを参照してほしいのですが、その中でも「今後はUIWebViewを使ったアプリは申請できなくなる」というのが最も大きい変更かなと思っています。

iOS 13における必須対応について
2020年中に対応すべき iOS13 以降向けの対応 (WebView, Split View など)まとめと補足
iOS13対応をまとめてみた

実際にいつごろから本格的に禁止になるかはわかりませんが、
(上記サイトには2020年4月から新規アプリでUIWebViewを使っているものはリジェクト、既存アプリは2020年12月末でリジェクトと書いています。まぁアップルさんは微妙にずれることもあるので)
今後禁止になるのは間違いないので今から対応しましょう。

アプリ内のUIWebViewを、今後推奨されているWKWebViewに変更するのはそんなに大変じゃないっぽいです。私のアプリも既存のUIWebViewクラスのクラス名をWKWebViewに変更して、XIB内のWebViewをWeb Kit Viewに変えるだけでいけました。

<2020年5月6日:追加>
全然違いました。UIWebViewからWKWebViewへの変更で注意する点についても後日書きます。

WKWebView対応のAdMobのSDKを使用する時の注意点

さて本題ですが、上記UIWebViewの廃止に伴い、AdMobがWKWebViewを使ったSDKをリリースしました。AdMobを利用している方はこちらを早めに入れておいた方がいいと思います。

一点注意点というか、私が勝手にハマったところなのですが、AdMobの最新SDKをダウンロードすると下記のフレームワークが入っています。

・GoogleAppMeasurement.framework
・GoogleMobileAds.framework
・GoogleUtilities.xcframework
・nanopb.xcframework
・Licenses

最後の「Licenses」は必要ないとして、AdMobのスタートガイドにしたがって上記4つのフレームワークをプロジェクトに突っ込んだら、なんかエラーがでました。

エラーの内容は「必要なフレームワークが足りない」とのことだったので、エラー文にしたがって「webKit.framework」と「JavaScriptCore.framework」を追加したらエラーが消えました。

でも、なーんかおかしいな〜スタートガイドにそんなの入れろって書いてないのにな〜なんて思って見直してみたら、上記4つのフレームワークの「GoogleUtilities.xcframework」と「nanopb.xcframework」が「.xcframework」って書いてありました。

聞いたこともなかったので調べたら、xcframeworkというのはいろんなプラットフォームで使うフレームワークを1まとめにできるものらしいです。

xcframeworkフォルダの中を見ると、

・ios-armv7_arm64
・ios-i386_x86_64-simulator
・ios-x86_64-maccatalyst

というフォルダがあり、その中にそれぞれフレームワークが入っています。

AdMobをiOSアプリで表示するのに必要なのは「ios-armv7_arm64」フォルダの中にあるフレームワークだけなので、「GoogleUtilities.xcframework」と「nanopb.xcframework」の中の「ios-armv7_arm64」からそれぞれ「GoogleUtilities.framework」と「nanopb.xcframework」を選んでプロジェクトに突っ込めばOKです。

これでさっき入れた「webKit.framework」と「JavaScriptCore.framework」を消してもエラーが出ずに広告が表示されました。

知ってる人からしたら当たり前のことだったのかもしれませんが、私はハマったので書いておきます。

あと、個人的にはiPadを12.9インチ対応せずに自動で引き延ばしているため、Launch Imageが廃止になってLaunch StoryboardやXIBにしなくてはいけないのがめんどくさいです・・・。

Launch Storyboardとかにしたら12.9インチなどのiPadで起動した時に引き延ばされず、ちゃんとそれぞれの画面サイズに対応しなくちゃいけないので・・・

AdMobが新しくなってなんか変わった。

AdMobが何やら新しくなった。

前回ガラっと変わったのは確か2012年とかそのあたりで、AdSenseとシステムが統合されたためリニューアルと同時に単価が激しく上昇していた記憶がある。

今回のリニューアルでは単価の上昇とかはなくて、FireBaseを本格的に使ってもらうためのものだと思われる。

なお、いつ出来たのかは知らないが、広告のユニットID以外に下記のような感じに「アプリID」をAppDelegate内で指定する必要があるようす。

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // Initialize Google Mobile Ads SDK
  // Sample AdMob app ID: ca-app-pub-3940256099942544~1458002511
  [GADMobileAds configureWithApplicationID:@"YOUR_ADMOB_APP_ID"];
  return YES;
}
@end

詳しくはAdMobのGet Startedを参照してください。

そういえば以前は本番の広告ユニットIDを指定するとテスト環境でも広告が表示されたが、今は表示されないみたいです。

なので、テスト環境ではAdMobが指定するテスト用広告IDを設定してね、ということらしい。インプレッション広告とかもあるから不正な収益が発生してしまうからでしょうね。

通常のiPad解像度(1536×2048)でつくったアプリをiPad Pro(2048×2732)で引き伸ばして表示する方法

iPadアプリを申請したらいきなりitunes connectでエラーが発生。

どうやらiPad Proの12.9インチ版スクリーンショットが必須になったらしい。ということはつまり、iPadアプリではiPad Proで動くことが必須になったということですね。

といってもiPad Proの解像度(2048×2732)なんて意識して作っていなかったので、どうしましょ、iPhoneアプリをiPadで起動すると自動で引き伸ばしてくれるように、なんとか引き伸ばして表示させる方法はないだろうかと調べたところ、ありました。

従来のソフトのままでiPad Proの画面に対応する方法
iPad Proが広すぎるため、取り急ぎ今までのアプリと同じサイズで対応しておきたい

Launch Screen Fileを設定しなければよい

Launch Screen Fileを設定する箇所を白紙にしておけばよいようです。大変助かりました。

引き伸ばしたスクリーンショットをitunes connectで設定して実際に申請したところ、問題なく「Ready for Sale」になりました。よかったよかった。

iPhoneでは5.5インチ、4.7インチ、4インチ、3.5インチと様々な解像度対応が必要で大変ですが、どの機種も一般のユーザーが使う解像度なので対応必須は当然だと思っています。しかし、個人的にはiPad Proは一般ユースとはちょっと違うんじゃないかな〜と感じていて、対応必須というのはちょっと厳しいような気がします。

Xcodeやitunes connectで、12.9インチ対応するかどうかをチェックボックスで選択できたりしたら分かりやすいんですけどね。

私もしばらくはこのLaunch Screen Fileを白紙にする方法で対応したいと思います。

“file xxx.png is missing from working copy” at project building というワーニングの対処

すでに削除した画像を読みにいってしまってるか、そのあたりのエラー。

下記のリンクを参考に、Xcodeの「Source Control」から「Commit」をクリックして、「!」マークのついてる対象のファイルを削除すればOK。

http://stackoverflow.com/questions/25338428/xcode-issue-file-xxx-png-is-missing-from-working-copy-at-project-building

Xcode8で”is missing from working copy” 消えました \(^^)/・・・・・が

NSDataReadingMappedIfSafe が deprecated になったので、その対処法

NSDataReadingMappedIfSafeがiOS8でdeprecatedになってしまった。

こちらがNSDataReadingMappedIfSafeを使ったもの

NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"caf"];
NSData *buffer = [NSData dataWithContentsOfMappedFile:path];

これを下記に変更する。

NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"caf"];
NSData *buffer = [NSData dataWithContentsOfFile:path
                                            options:NSDataReadingMappedIfSafe
                                              error:nil];

オプションのところは「NSDataReadingMappedIfSafe」と「NSDataReadingUncached」と「NSDataReadingMappedAlways」から選ぶ。
どういう違いかはあまり調べてないが、ここに書いてある。

http://samplecodebank.blogspot.jp/2013/06/NSData-NSDataReadingMappedIfSafe-example.html

プロフィール

PICxPIC
1983年生まれ。2010年からiOSアプリを開発し、2012年に法人化。メディア掲載やランキング、ダウンロード数などの詳しい実績などはこちら

PICxPICのアプリ

赤ちゃんの大冒険

おさるランド

動物オーケストラ2

子どもゲームランド

おしゃべりボタン

天空までのぼれ!

ジャンプで川下り

ひよこランド

動物オーケストラ

ポコポコアニマル

キラキラお絵かき

音が出るお絵かき

あいづちん