首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI:在macOS上共享NSSharingService未接收共享

SwiftUI:在macOS上共享NSSharingService未接收共享
EN

Stack Overflow用户
提问于 2022-05-08 09:33:09
回答 1查看 195关注 0票数 0

我有一个简单的测试应用程序,试图使用CoreData与另一个用户共享NSSharingService记录。我可以创造我的那份,

但是当我尝试接收共享时,它打开了应用程序,但什么也不做。

我已经将CKSharingSupported添加到我的plist中了。

我还跟踪了这个链接,但没有结果:CloudKit CKShare userDidAcceptCloudKitShareWith Never Fires on Mac App

这是我的代码:

SharingServiceApp:

代码语言:javascript
复制
final class AppDelegate: NSObject, NSApplicationDelegate
{
    func application(_ application: NSApplication, userDidAcceptCloudKitShareWith metadata: CKShare.Metadata)
    {
        print ("userDidAcceptCloudKitShareWith")
        let shareStore = persistenceController.sharedPersistentStore!
        persistenceController.container.acceptShareInvitations(from: [metadata], into: shareStore)
        { _, error in
            if let error = error
            {
                print("acceptShareInvitation error :\(error)")
            }
        }
    }
}

ContentView:

代码语言:javascript
复制
import SwiftUI
import CoreData
import CloudKit

let persistenceController = PersistenceController()

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    var body: some View {
        NavigationView {
            List {
                ForEach(items) { item in
                    NavigationLink {
                        VStack
                        {
                            Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                            Button("Share")
                            {
                                shareRecord(item: item)
                            }
                        }
                        
                    } label: {
                        Text(item.timestamp!, formatter: itemFormatter)
                    }
                }
            }
            .toolbar {
                ToolbarItem {
                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
            }
            Text("Select an item")
        }
    }

    private func addItem() {
        withAnimation {
            let newItem = Item(context: viewContext)
            newItem.timestamp = Date()

            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

private let itemFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .medium
    return formatter
}()

func shareRecord(item: Item)
{
    Task
    {
        if let share = await createShare(item: item)
        {
            let container = CKContainer(identifier: "iCloud.com.xxxxxxxx.sharingservice")
            
            let item = NSItemProvider()
            item.registerCloudKitShare(share, container: container)
            
            DispatchQueue.main.async
            {
                let sharingService = NSSharingService(named: .cloudSharing)
                sharingService!.perform(withItems: [item])
            }
        }
    }
}

private func createShare(item: Item) async -> CKShare?
{
    do
    {
        let (_, share, _) = try await persistenceController.container.share([item], to: nil)
        share[CKShare.SystemFieldKey.title] = "MyApp"
        return share
    }
    catch
    {
        print("Failed to create share")
        return nil
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-21 10:55:15

好的,我终于成功地让userDidAcceptCloudKitShareWith被调用了。

您需要使用@NSApplicationDelegateAdaptor为SwiftUI应用程序创建应用程序委托:

代码语言:javascript
复制
@main
struct Sharing_ServiceApp: App
{
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene
    {
        WindowGroup
        {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

我输入了这一行,我的代码立即开始接收共享请求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72159708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档