我后来了解到,您必须为CloudKit容器指定一个回退URL。如果应用程序没有安装(或者无法识别,就像我在Xcode中进行开发构建时一样),CloudKit会将共享URL转发到您指定的位置。它们将唯一的共享ID附加到URL,以便您可以在自己的网页上处理它。
你会看到这个弹出窗口:
我把它重定向到
https://myapp.com/share/?id=
$_GET['id']
抓住
id
. 然后使用
自定义URL方案
myapp://abc123
哪里
abc123
是共享ID)。
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