CloudKit JS Hello World Пример: метод аутентификации не найден - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю на примере каталога Apple *1001* от Apple и просто пытаюсь заставить аутентификацию работать. Я хочу запустить этот код JS в окне браузера (не Node JS). Я взял их код с их сайта следующим образом:

<!DOCTYPE html>
<html lang="en">
  <head></head>
  <body>
  <script>
  window.addEventListener('cloudkitloaded', function() {

  CloudKit.configure({
    containers: [{
      containerIdentifier: 'iCloud.com.example.CloudKitCatalog',
      apiToken: 'b86f0b5db29f04f45badba0366f39b7130a505f07765b5ba3a2ceb0cb3d96c0c',
      persist: true,
      environment: 'production',
      signInButton: { id: 'sign-in-button', theme: 'black' },
      signOutButton: { id: 'sign-out-button', theme: 'black' }
    }]
  })

  var container = CloudKit.getDefaultContainer()

  //-----
  function gotoAuthenticatedState(userIdentity) {
    var name = userIdentity.nameComponents
    if(name) {
      displayUserName(name.givenName + ' ' + name.familyName)
    } else {
      displayUserName('User record name: ' + userIdentity.userRecordName)
    }
    container
      .whenUserSignsOut()
      .then(gotoUnauthenticatedState)
  }

  //-----
  function gotoUnauthenticatedState(error) {
    if(error && error.ckErrorCode === 'AUTH_PERSIST_ERROR') {
      showDialogForPersistError()
    }
    displayUserName('Unauthenticated User')
    container
      .whenUserSignsIn()
      .then(gotoAuthenticatedState)
      .catch(gotoUnauthenticatedState)
  }

  // Check a user is signed in and render the appropriate button.
  return container.setUpAuth()
    .then(function(userIdentity) {
      // Either a sign-in or a sign-out button was added to the DOM.
      // userIdentity is the signed-in user or null.
      if(userIdentity) {
        gotoAuthenticatedState(userIdentity)
      } else {
        gotoUnauthenticatedState()
      }
    })

  })

  </script>

  <script src="https://cdn.apple-cloudkit.com/ck/2/cloudkit.js" async></script>

  <div id="sign-in-button"></div>
  <div id="sign-out-button"></div>
</body>
</html>

Но я продолжаю получать эти две ошибки:

cloudkit.js:14 GET https://api.apple-cloudkit.com/database/1/iCloud.com.example.CloudKitCatalog/production/public/users/caller?ckjsBuildVersion=2005ProjectDev34&ckjsVersion=2.6.1&clientId=735f8b19-3218-4493-80e4-7ab0b39041ac 401 (Unauthorized)
(anonymous) @ cloudkit.js:14

И сразу после этого ...

cloudkit.js:14 Uncaught (in promise) t {
  _ckErrorCode: "AUTHENTICATION_FAILED", 
  _uuid: "3b5cf33d-d56d-414f-83a4-6f320cd915b2", 
  _reason: "no auth method found", 
  _serverErrorCode: "AUTHENTICATION_FAILED", 
  _extensionErrorCode: undefined, …
}

Я чувствую, что это должно быть легко, но я даже не могу заставить работать первую функцию setUpAuth(). Я также попробовал свой собственный CloudKit containerIdentifier и apiToken, но я получаю ту же ошибку.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

0 голосов
/ 10 апреля 2020

Кажется, что в мире всего лишь 5 человек, которые понимают API CloudKit JS, и все они переназначены для работы над ARKit и игнорируют переполнение стека. ;)

Ради потомков я узнал, что у меня были две неправильные вещи.

== 1 ==

Вы должны игнорировать предупреждение об устаревании и использование файла версии 1 JS (ck/1/cloudkit.js):

https://cdn.apple-cloudkit.com/ck/1/cloudkit.js

== 2 ==

Несмотря на то, что говорится в документации, вы на самом деле не можете указать кнопку аутентификации <div id=""> в конфигурации вашего контейнера. Кнопка Вход в систему начала появляться для меня, когда я изменил свои HTML на стандартные идентификаторы Apple <div> по умолчанию:

<div id="apple-sign-in-button"></div>
<div id="apple-sign-out-button"></div>

Надеюсь, это поможет кому-то еще. :)

...