KlarnaHybridSDK - завалено сообщением «Уведомление о родном хуке» [ANDROID] - PullRequest
0 голосов
/ 27 апреля 2020

Описание проблемы

При отладке веб-части моего приложения в chrome: // inspect / # devices или непосредственно в android studio я вижу, что я ' Я завален сообщением «Уведомление родного крючка». При использовании устройств chrome: // inspect / # для проверки веб-страницы, используемой в приложении, я вижу, что сообщение имеет источник VM298: 5 (вполне уверен, что я видел его и с другим номером после VM). При нажатии на источник я нахожу следующую функцию:

 (function () {
     if (document.readyState === "complete") {
         var foundMessageBridge = false
         function notifyMessageBridge() {
            console.log("Notifying Native Hook")
             if (window.__KlarnaNativeHook != null) {
                 console.log("Klarna Native Hook was notified")
                 window.__KlarnaNativeHook.setNativeReady()
                 foundMessageBridge = true
             } else {
                 window.setTimeout(notifyMessageBridge, 500)
             }
         }
         notifyMessageBridge()
     }
     window.addEventListener('load', () => {
         let interval = null
         let notifyMessageBridge = () => {
             if (window.__KlarnaNativeHook != null) {
                 window.__KlarnaNativeHook.setNativeReady()
                 clearInterval(interval)
             }
         }
         interval = setInterval(notifyMessageBridge, 500)
     })
 }())

, которая в конечном итоге привела меня к тому, что это как-то связано с Кларной. Так как я завален этим, я предполагаю, что мое приложение не попадает в if (window .__ KlarnaNativeHook! = Null).

После некоторой отладки я заметил следующее:

  • Когда я запускаю взаимодействие с Klarna, мое приложение входит в if (window .__ KlarnaNativeHook! = Null). Но только один раз, и спам возобновляется.
  • Если я удаляю строку (activity as MainActivity).klarnaHybridSDK.addWebView(myWebView), сообщение прекращается. Что, я полагаю, не удивительно.
  • Помимо веб-страницы моего приложения создаются пустые веб-страницы без названия, которые выводят на консоль только «Notification Native Hook» и ничего больше, ни кода, ни ничего.
  • Помимо заболачивания, приложение прекрасно работает с Klarna.

Я не уверен, является ли это ошибкой в ​​SDK или моей ошибкой.

Есть предложения о том, как остановить рассылку спама "Уведомление о родном хуке"? (Я знаю, как его фильтровать, но 120 сообщений / мин * (веб-страница моего приложения + сгенерированные без названия) и делать это каждый раз становится утомительно)

Код

MainActivity

class MainActivity : AppCompatActivity(), KlarnaHybridSDKCallback {
...
    lateinit var klarnaHybridSDK : KlarnaHybridSDK
    override fun onCreate(savedInstanceState: Bundle?) {
        klarnaHybridSDK = KlarnaHybridSDK("myapp://", this)
        ...
    }
    override fun didHideFullscreenContent(webView: WebView, completion: OnCompletion) {
        Timber.i("Klarna didHideFullscreenContent called")
        completion.run()
    }

    override fun didShowFullscreenContent(webView: WebView, completion: OnCompletion) {
        Timber.i("Klarna didShowFullscreenContent called")
        completion.run()
    }

    override fun onErrorOccurred(webView: WebView, error: KlarnaMobileSDKError) {
        Timber.i("Klarna onErrorOccurred called")
        Timber.i("Klarna Error: $error")
    }

    override fun willHideFullscreenContent(webView: WebView, completion: OnCompletion) {
        Timber.i("Klarna willHideFullscreenContent called")
        completion.run()
    }

    override fun willShowFullscreenContent(webView: WebView, completion: OnCompletion) {
        Timber.i("Klarna willShowFullscreenContent called")
        completion.run()
    }
}

Класс фрагмента

class myFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        ...
        /*WEBVIEW*/
        myWebView.settings.javaScriptEnabled = true
        WebView.setWebContentsDebuggingEnabled(true)
        val context = this.activity?.applicationContext
        myWebView.addJavascriptInterface(
            WebAppInterface(
                myWebView, context
            ), "Android")
        myWebView.settings.loadWithOverviewMode = true
        myWebView.settings.useWideViewPort = true
        myWebView.settings.domStorageEnabled = true
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
            myWebView.settings.mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
        }
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
            myWebView.settings.cacheMode = WebSettings.LOAD_NO_CACHE
            if(this.activity?.applicationInfo?.flags != 0 && ApplicationInfo.FLAG_DEBUGGABLE != 0) {
                WebView.setWebContentsDebuggingEnabled(true)
                Timber.i("setWebContentsDebuggingEnabled")
            }
        }
        ticketWebView.webViewClient = object: WebViewClient(){
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                ...
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                ...
                if (view != null) {
                    (activity as MainActivity).klarnaHybridSDK.newPageLoad(view)
                }
                ...
            }

            override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) {
                ...
            }

            override fun onReceivedHttpError(view: WebView?, request: WebResourceRequest?, errorResponse: WebResourceResponse?) {
                super.onReceivedHttpError(view, request, errorResponse)
                ...
                    //Added to prevent Klarna's address search failing to cause the app to show the error screen.
                    if (request?.url.toString().contains("klarna.com/eu/address")) {
                        Timber.i("${receivedError}")
                        Timber.i("Ignoring error since it's simply Klarna's address search failing")
                    }
                ...
            }
            @TargetApi(21)
            override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                val url = request?.url
                ...
                return (activity as MainActivity).klarnaHybridSDK.shouldFollowNavigation(url.toString())
            }

            /*To handle cases where the target API < 21*/
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                return (activity as MainActivity).klarnaHybridSDK.shouldFollowNavigation(url.toString())
            }
        }
        val url = "myAppUrl.php"
        val postData = "data=" + URLEncoder.encode(data, "UTF-8").toString()
        myWebView.postUrl(url, postData.toByteArray())
         return root
    }
    ...
}

Шаги воспроизвести

  1. Запустил приложение

  2. Открыл chrome: // осмотреть / # устройства в Chrome.

  3. Находится на соответствующей веб-странице

  4. Нажата «Осмотреть»

Ожидаемое поведение

Не заполняется сообщением в моей консоли.

Устройство и версия:

  • Устройство: Samsung A10

  • Версия ОС: Android 9

  • Версия SDK Klarna In-App: com.klarna.mobile:sdk:2.0.16

...