Android, Apple войти - PullRequest
       44

Android, Apple войти

7 голосов
/ 19 марта 2020

Я пытаюсь добавить функцию входа Apple в мое приложение Android. Я следую за всплывающими окнами. Я не могу заставить его работать.

class AppleLoginWebViewActivity : BaseActivity(), AppleLoginContract.View {

   private val TAG = AppleLoginWebViewActivity::class.java.simpleName

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_apple_login)

       prepareWebView()
   }

   private fun prepareWebView() {

       if (BuildConfig.DEBUG) {
           WebView.setWebContentsDebuggingEnabled(true)
       }

       webView.addJavascriptInterface(
           AppleLoginJavaScriptInterface(),
           "AndroidInterface"
       )

       val webSettings: WebSettings = webView.settings
       webSettings.javaScriptEnabled = true
       webView.webViewClient = MyWebViewClient()
       webView.webChromeClient = MyWebChromeClient()
       webView.settings.loadWithOverviewMode = true
       webView.settings.domStorageEnabled = true
       webView.settings.useWideViewPort = true
   }

   private inner class MyWebViewClient : WebViewClient() {

       override fun onPageFinished(
           view: WebView,
           url: String
       ) { //Calling a javascript function in html page
           Logger.info(TAG, "page started: $url")
           // view.loadUrl("javascript:alert(clickAppleSignInButton())")
           view.loadUrl("javascript:AndroidInterface.showHTML" +
               "('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
       }

       override fun shouldOverrideUrlLoading(
           view: WebView?,
           request: WebResourceRequest?
       ): Boolean {
           return false
       }
   }

   private class MyWebChromeClient : WebChromeClient() {
       override fun onJsAlert(
           view: WebView,
           url: String,
           message: String,
           result: JsResult
       ): Boolean {
           result.confirm()
           return true
       }
   }

   override fun loadUrl(appleLoginLocalUrl: String) {
       webView.loadUrl(appleLoginLocalUrl)
   }
}

и вот файл html, который я загружаю

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Apple Sign in</title>
</head>
<body>
<script type="text/javascript" src="https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"></script>
<div id="appleid-signin" data-color="black" data-border="true" data-type="sign in"></div>
<script type="text/javascript">

     const options = {
       clientId: 'MY_CLIENT_ID',
       scope: 'email name',
       redirectURI: 'MY_REDIRECT_URL',
       state: '',
       usePopup : true
     };
     AppleID.auth.init(options);
 </script>

 <script type="text/javascript">
   function clickAppleSignInButton() {
     document.getElementById("appleid-signin").click();
   }
 </script>

 <script type="text/javascript">
   //Listen for authorization success
   document.addEventListener('AppleIDSignInOnSuccess', successFunction);
   //Listen for authorization failures
   document.addEventListener('AppleIDSignInOnFailure', failureFunction);

   function successFunction(data) {
     //handle successful response
     console.log("success")
     AndroidInterface.onLoginSuccess(data);
   }

   function failureFunction(error) {
     //handle error
     console.log("failure")
     AndroidInterface.onLoginFailed(error);
   }
 </script>
</body>
</html>

ТАК, на последнем шаге, когда я проверяю В веб-представлении я вижу данные аутентификации, отправляемые (запрос POST) на другой URL-адрес внутри веб-панели. Но слушатель события с AppleIDSignInOnSuccess никогда не вызывается. есть ошибка, которая говорит "Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('MY_REDIRECT_URL') does not match the recipient window's origin ('https://appleid.apple.com').", source: (0).

Итак, у меня есть пара вопросов:

  1. Как исправить эту ошибку?
  2. Почему слушатель события не вызывается?
  3. Есть ли способ, которым я могу перехватить и проанализировать POST-ответ непосредственно из веб-представления?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020
<script type="text/javascript">

     const options = {
       clientId: 'MY_CLIENT_ID',
       scope: 'email name',
       redirectURI: 'MY_REDIRECT_URL',
       state: '',
       usePopup : true
     };
     AppleID.auth.init(options);
     AppleID.auth.signIn(); //<-- there :)
 </script>
  • Apple хочет, чтобы этот URL-адрес перенаправления был действительно полным, например: https://some.domain.tld/path/to/redirect, который поддерживает POST
  • Также не все браузеры поддерживают usePopup, например iOS 10.3 блокируют это для я :) 1006
0 голосов
/ 24 марта 2020

Возможно, проблема в том, что страница еще не загружена. Попробуйте изменить

document.getElementById("appleid-signin").click();

на

window.addEventListener('load', function() {
    document.getElementById("appleid-signin").click();
});

. Вы можете настроить удаленную отладку с помощью Chrome, что позволит вам использовать Chrome Dev Tools для отладки веб-просмотра с подключенным устройством. , Документы здесь: https://developers.google.com/web/tools/chrome-devtools/remote-debugging

...