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
, но я делаю много пользовательских интерфейсов и хотел иметь полный контроль над рабочим процессом обмена.
Я надеюсь, что это помогает кому-то.:)