amoad / amoad-ios-sdk

7 stars 12 forks source link

2回目以降の表示がおかしい(AMoAdView) #259

Closed arusu0629 closed 4 years ago

arusu0629 commented 4 years ago

【環境】

【実装概要】

 func setupRectangleAd(targetView: UIView, sid: String) {
        let adView = AMoAdView(frame: targetView.frame)
        adView.sid = sid
        adView.delegate = self
        adView.rotateTransition = .curlUp
        adView.horizontalAlign = .center
        adView.verticalAlign = .middle

        targetView.addSubview(adView)
 }

【不具合概要】 1回目の広告表示時には↑の setupRectangleAd が呼ばれて数秒後に amoadViewDidReceiveAd のコールバックが呼ばれて、広告が正しく表示されます。 しかし2回目以降に同じ手順(流れ)で処理をした際に amoadViewDidReceiveAd のコールバックが呼ばれる前に最初から広告が表示されてしまいます。また amoadViewDidReceiveAd のコールバックが呼ばれるまで10秒以上はかかってしまいます。

※まだ広告枠の審査中のためテスト広告が表示されているのですが、それが原因の可能性もあり?

tko3 commented 4 years ago

一度作成したAMoAdViewを破棄することなく同一SIDで短い間隔でsetupRectangleAd を実行していませんか? その場合ですと、SDKでは不正な間隔でアドリクエストが走らないようになっており仕様通りの挙動となります。

arusu0629 commented 4 years ago

@tko3 お返事ありがとうございます! AMoAdView は毎回違うインスタンスになっております(1回目と2回目で別々のものを使用して古いのは破棄している) ただ、同じ SID で短い間隔で setupRectangleAd は実行しています。

具体的にはどのぐらい間隔を開けたほうが良いでしょうか?

tko3 commented 4 years ago

広告のリフレッシュ間隔より長い必要があるので9秒以上となります。 同一SIDで繰り返し広告リクエストしているとのことですが、広告のリフレッシュではダメなのでしょうか

arusu0629 commented 4 years ago

広告のリフレッシュではダメなのでしょうか

すみません。広告のリフレッシュとは具体的にどういう事を指していますでしょうか? SID を違うものにする、または他の AdNW の広告を使うという意味でしょうか?

tko3 commented 4 years ago

https://github.com/amoad/amoad-ios-sdk/wiki/Inline#%E5%BA%83%E5%91%8A%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB こちらの広告ローテーションですね

arusu0629 commented 4 years ago

@tko3 説明ありがとうございます。 ただ上記だと要件を満たせないです。以下状況を説明致します。

【状況】

  1. 画面Aに遷移
  2. 画面Aに遷移したタイミングで AMoAdView のインスタンスを生成し広告表示を試みる
  3. 広告を閉じて画面Bへ遷移(この時画面Aで生成した AmoAdView のインスタンスは破棄している)
  4. 画面Bから画面Aに遷移
  5. 再び AMoAdView のインスタンスを生成し広告表示を試みる(2.で作成したインスタンスとは別物)

↑の状況のため広告ローテーションではなく、広告のリクエストになってしまいます。 画面Bから画面Aまでの遷移の間隔が短い(=広告のリクエスト間隔が短い)と当事象が起きる事については理解しました。 ただ何度か試した所 10~20秒 ほど開けても当事象が起きてしまいました。(9秒以上間隔設ける必要が有るとのことなので正しいと言えば正しい挙動なのですが...)

この状況で問題を解決するにはどうアプローチしたら良いでしょうか? お手数をおかけしますが、ご教授頂けますと幸いです。

tko3 commented 4 years ago

ただ何度か試した所 10~20秒 ほど開けても当事象が起きてしまいました。(9秒以上間隔設ける必要が有るとのことなので正しいと言えば正しい挙動なのですが...)

この事象になっているということはアプリ側でAMoAdViewが正常に破棄できていないのではないかと思います。 アプリ側で正常にAMoAdViewが破棄できているかご確認いただけますか?

arusu0629 commented 4 years ago

@tko3 承知致しました! 改めて AMoAdView が破棄されているか確認致しますmm

arusu0629 commented 4 years ago

@tko3 メモリリークしていたのですが、そちらを解消しても短い間隔(10秒ほど)で再度広告表示をすると同じ事象が発生してしまいますね... 1度そちらでもご確認頂けますでしょうか? AMoAdView が破棄されているかはメモリーグラフで確認致しました(AMoAd関連のインスタンスがいくつかありそうですが...) スクリーンショット 2020-07-30 15 40 25

tko3 commented 4 years ago

こちらで用意しているデモアプリではご指摘の事象は発生していません。 「破棄」についてですが、どのように破棄なさってますか? ソースコードをご提示ください

arusu0629 commented 4 years ago

@tko3 ソースコードについて少々お待ちください...! ちなみにテスト用の sid をご共有して頂くことは可能でしょうか?

arusu0629 commented 4 years ago

@tko3 遅くなりました。以下ソースコードになります! AMoAdデモ.zip

arusu0629 commented 4 years ago

@tko3 上記について何か分かりましたでしょうか?

tko3 commented 4 years ago

こちらで動作を確認したところ、こちらからお伝えした通りの挙動であることを確認しました。

例) 広告ローテーション間隔が9秒の時、

任意のタイミングで広告ローテーションを停止可能とした場合、 こちらの意図しない間隔で広告リクエストを行うことができてしまいますので、 この仕様となっていることをご理解ください。

arusu0629 commented 4 years ago

@tko3 ちゃんと理解出来ているか確認させてください...!

広告ローテーション間(0~8秒の間)にAMoAdViewの削除、再表示を行った場合 => 広告ローテーション間隔である9秒の段階で広告再取得

これは9秒経つまでは広告を再取得しに行かない。(=広告が表示されて2秒で閉じて、1秒後に広告を表示しても6秒間は再取得せずに、前に表示されていた広告が表示されっぱなし)という認識で合っていますでしょうか? ※2回目に表示される時に広告が既に表示済み(読み込み済み)を判断するメソッドやパラメータなどはありますでしょうか?

広告ローテーション間(08秒の間)にAMoAdViewの削除、9の間に再表示を行った場合 => 再表示実行時すぐに広告再取得

この場合に AMoAdView を生成しても前回表示した広告は表示されておらず、広告が再取得されたタイミングで次の新しい広告が表示される認識で合っていますでしょうか?

広告ローテーション間隔を0にした場合は毎回 AMoAdView を生成するたびに異なる広告の読み込みが開始されて表示されるという認識で合っておりますでしょうか? また、広告ローテーション間隔を0 にする場合の懸念点や注意点などがあればご教授頂けますとと幸いです。(広告切れが発生しやすい?など)

tko3 commented 4 years ago

これは9秒経つまでは広告を再取得しに行かない。(=広告が表示されて2秒で閉じて、1秒後に広告を表示しても6秒間は再取得せずに、前に表示されていた広告が表示されっぱなし)という認識で合っていますでしょうか? ※2回目に表示される時に広告が既に表示済み(読み込み済み)を判断するメソッドやパラメータなどはありますでしょうか?

上記であっております。読み込み済みかどうかを判断する方法はありません。

この場合に AMoAdView を生成しても前回表示した広告は表示されておらず、広告が再取得されたタイミングで次の新しい広告が表示される認識で合っていますでしょうか?

前回の広告が表示されている状態となり、広告が再取得されたタイミングで次の新しい広告が表示されます。

広告ローテーション間隔を0にした場合は毎回 AMoAdView を生成するたびに異なる広告の読み込みが開始されて表示されるという認識で合っておりますでしょうか? また、広告ローテーション間隔を0 にする場合の懸念点や注意点などがあればご教授頂けますとと幸いです。(広告切れが発生しやすい?など)

0にした場合、AMoAdViewを生成するたびに広告の取得を行います。 懸念としてはご推察通り通常より広告切れが発生しやすくはなると思いますが、これはその時々の案件状況にもよります。

arusu0629 commented 4 years ago

@tko3 理解しました!ありがとうございます! そして1件だけ追加でご質問が...(申し訳ないです)

0にした場合、AMoAdViewを生成するたびに広告の取得を行います。

とありますが、こちらも「2回目にAMoAdView を生成した時には1回目の広告が表示されっぱなし」という認識で合っておりますでしょうか?

tko3 commented 4 years ago

はい、2回目の生成段階では1回目の広告が表示されています

arusu0629 commented 4 years ago

@tko3

はい、2回目の生成段階では1回目の広告が表示されています

なるほどです。 1つ実装でご相談があるのですが...

今は広告が表示されるまでインジケーターを表示しております。インジケーターを消すタイミングとしては amoadViewDidReceiveAd のコールバックで消しております。 今の実装だと2回目以降だと広告が既に表示されている(=1回目の広告が)にも関わらず、インジケーターが表示されてしまい、不自然に見えてしまいます。このケースに対して何か解決策などはありませんでしょうか?

tko3 commented 4 years ago

SDK側ではアプリ上での実装状況やViewに干渉すべきではないので、インジケータの状態などはアプリ側でどうにかするものだと思います。

arusu0629 commented 4 years ago

@tko3 承知致しました。 色々ご対応頂きありがとうございました!mm