CloudKit CKShare URL никуда не денется

Я успешно сохранил CKShare URL-адрес CloudKit, и я вижу, что пользователь INVITED в инструментальной панели CloudKit. Мое приложение Mac отправило URL этого человека по электронной почте, но когда они щелкают по нему, все они видят его на этом экране на icloud.com:

Общий

Нажатие ОК делает все исчезает, поэтому все, что вы видите, это фон на веб-странице.

Насколько я понимаю, URL-адрес должен открыть мое приложение Mac, где он будет запускаться userDidAcceptCloudKitShareWith в моем приложении делегат. Но это ничего не делает.

Может ли это быть потому, что мое приложение находится в разработке, а не в Mac App Store? Нужна ли мне индивидуальная схема URL, чтобы заставить ее открывать мое приложение?

Документация по этому материалу довольно скудна. Я хотел бы любую помощь, которую кто-то может предоставить.

1 ответ

С тех пор я узнал, что вы должны указать запасной URL для вашего контейнера CloudKit. В тех случаях, когда приложение не установлено (или не распознается, что, по-видимому, имеет место при сборке dev в Xcode, как я), CloudKit перенаправит URL-адрес общего доступа куда-либо, куда вы укажете. Они добавляют уникальный идентификатор общего ресурса к URL, чтобы вы могли обработать его на своей собственной веб-странице.

На инструментальной панели CloudKit перейдите в Параметры среды... и вы увидите это всплывающее окно:

Настройки среды разработки

У меня есть перенаправление на https://myapp.com/share/?id= и на моей веб-странице, куда он перенаправляет, я делаю $_GET['id'] схватить id, Затем я делаю еще одно перенаправление на свое приложение, используя собственную схему URL, и передаю идентификатор общего ресурса (например, myapp://abc123 где abc123 это идентификатор акции).

В моем делегате приложения я получаю URL-адрес примерно так:

func application(_ application: NSApplication, open urls: [URL]) {
  if let url = urls.first, let shareId = url.host{
    fetchShare(shareId) //<-- sharedId = abc123
  }
}

Я тогда использую CKFetchShareMetadataOperation найти URL-адрес общего ресурса и CKAcceptSharesOperation принять это так:

func fetchShare(shareId: String){
  if let url = URL(string: "https://www.icloud.com/share/\(shareId)"){
    let operation = CKFetchShareMetadataOperation(shareURLs: [url])

    operation.perShareMetadataBlock = { url, metadata, error in
      if let metadata = metadata{
        //:::
        acceptShare(metadata: metadata)
      }
    }
    operation.fetchShareMetadataCompletionBlock = { error in
      if let error = error{
        print("fetch Share error: \(error)")
      }
    }
    CKContainer.default().add(operation)
  }
}

func acceptShare(metadata: CKShareMetadata){
  let operation = CKAcceptSharesOperation(shareMetadatas: [metadata])

  operation.acceptSharesCompletionBlock = { error in
    if let error = error{
      print("accept share error: \(error)")
    }else{
      //Share accepted!
    }
  }
  CKContainer.default().add(operation)
}

Я думаю, что есть более простые способы работать через это NSItemProvider а также NSSharingService, но я делаю много пользовательских интерфейсов и хотел иметь полный контроль над рабочим процессом обмена.

Я надеюсь, что это помогает кому-то.:)

Другие вопросы по тегам