CloudKit CKShare userDidAcceptCloudKitПоделиться с приложением Never Fires on Mac - PullRequest
0 голосов
/ 13 июня 2018

Я работаю над тем, чтобы принять CKShare в приложении macOS в Swift 4. Я уже сделал все следующее:

  • Создайте CKShare и сохраните его с rootRecord в CloudKit
  • Добавить участника (CKShare.Participant)
  • Я подтвердил, что CKShare находится на сервере CloudKit и что приглашенный мной человек имеет к нему доступ.Вот снимок экрана: https://d.pr/i/0sMFQq

Когда я нажимаю ссылку общего доступа, связанную с CKShare, он открывает мое приложение, но ничего не происходит и userDidAcceptCloudKitShareWith не срабатывает.

func application(_ application: NSApplication, userDidAcceptCloudKitShareWith metadata: CKShareMetadata) {
  print("Made it!") //<-- This never gets logged :(
  let shareOperation = CKAcceptSharesOperation(shareMetadatas: [metadata])
  shareOperation.qualityOfService = .userInteractive

  shareOperation.perShareCompletionBlock = {meta, share, error in
    print("meta \(meta)\nshare \(share)\nerror \(error)")
  }
  shareOperation.acceptSharesCompletionBlock = { error in
    if let error = error{
      print("error in accept share completion \(error)")
    }else{
      //Send your user to where they need to go in your app
      print("successful share:\n\(metadata)")
    }
  }

  CKContainer.default().add(shareOperation)
}

Есть ли какая-то схема URL, которую я должен включить в мой info.plist?Или, возможно, протокол, которому я должен соответствовать в своем NSApplicationDelegate делегате?Я не могу при всей жизни понять, что делать.Заранее спасибо!

Обновление

Я попробовал еще несколько вещей по этому поводу.Когда я открываю ссылку общего доступа в веб-браузере, я вижу это:

enter image description here

Нажатие OK заставляет экран исчезать доэто:

Nothing

Не особенно полезно.:) После этого статус участника в CloudKit по-прежнему Приглашен , поэтому доля по-прежнему не принята.

Когда я нажимаю на ссылку общего доступа в сообщениях, меня показываютвсплывающее окно, похожее на это: CloudKit Sharing Popup После того, как я нажму кнопку открыть, в доке появится новая копия моего приложения, а затем приложение внезапно закроется.Журнал сбоев гласит:

Завершение работы приложения из-за необработанного исключения «CKException», причина: «В приложении отсутствуют необходимые права com.apple.developer.icloud-services»

Я пытался выключить и снова включить iCloud в разделе «Возможности» XCode, но ничего не изменилось.Я знаю, что это исключение не может быть правильным, потому что я могу нормально запускать свое приложение и использовать CloudKit весь день.Только CKShare вызывает этот сбой.

Это беспорядок.Спаси меня, Оби-Ван Кеноби, ты моя единственная надежда.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я наконец получил его на работу!Я сделал все следующее:

  1. Удалил мое приложение из ~/Library/Developer/Excode/DerivedData
  2. Убедитесь, что у меня нет других копий моего приложения, заархивированных где-либо на моей машине.
  3. Сказал молитву.
  4. перезагрузился.

Блин, это было грубо.:)

0 голосов
/ 13 июня 2018

Да,

Вам необходимо добавить это в ваш info.plist.

<key>CKSharingSupported</key>
<true/>

** РЕДАКТИРОВАННЫЙ ОТВЕТ **

Я использую этот код, чтобы поделиться,Я не делаю это вручную ... не уверен, что этот вариант под OS XI должен признаться.Я использую iOS.

let share = CKShare(rootRecord: record2S!)
share[CKShareTitleKey] = "My Next Share" as CKRecordValue
share.publicPermission = .none

let sharingController = UICloudSharingController(preparationHandler: {(UICloudSharingController, handler:
                    @escaping (CKShare?, CKContainer?, Error?) -> Void) in
let modifyOp = CKModifyRecordsOperation(recordsToSave:
                        [record2S!, share], recordIDsToDelete: nil)
modifyOp.savePolicy = .allKeys
modifyOp.modifyRecordsCompletionBlock = { (record, recordID,
                        error) in
                        handler(share, CKContainer.default(), error)
                    }
                    CKContainer.default().privateCloudDatabase.add(modifyOp)
                })
sharingController.availablePermissions = [.allowReadWrite,
                                                          .allowPrivate]
sharingController.delegate = self
                sharingController.popoverPresentationController?.sourceView = self.view
            DispatchQueue.main.async {
                self.present(sharingController, animated:true, completion:nil)
            }

Здесь представлен контроллер активности, в котором вы можете выбрать, скажем, электронную почту, а затем отправить ссылку.Возможно, вы также захотите посмотреть это видео, сосредоточившись на cloudKit JS в самом начале.

Смотрите также это видео WWDC https://developer.apple.com/videos/play/wwdc2015/710/ В нем рассказывается о API JSON CloudKit, используя его, вы можете запросить то, чтои то, что не было разделено в терминальном окне / простой скрипт, возможно.Я сделал то же самое при использовании Dropbox API несколько лет назад.Эй, вы даже можете использовать JSON API cloudkit в своем коде вместо собственных вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...