Получать push-уведомления в приложении командной строки под macOS - PullRequest
0 голосов
/ 11 января 2019

Во время всплеска обнаружения я должен определить, возможно ли для приложения командной строки подписаться на push-уведомления.

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

// main.swift
import Foundation
import UserNotifications
import AppKit

class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        print(#function)
    }

    func application(_ application: NSApplication, didReceiveRemoteNotification userInfo: [String : Any]) {
        print(#function)
    }

    func application(_ application: NSApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print(#function)
    }

    func application(_ application: NSApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print(#function)
    }
}

let appDelegate = AppDelegate()

let app = NSApplication()
app.delegate = appDelegate
NSApp.registerForRemoteNotifications()
app.run()

Но происходит сбой со следующими ошибками:

2019-01-11 12:52:58.871187+0300 apns[55174:3496184] [push] Cannot register for push. Failed to find proper bundle identifier for process.
2019-01-11 12:52:58.871436+0300 apns[55174:3496184] *** Assertion failure in -[NSApplication init], /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1671.20.108/AppKit.subproj/NSApplication.m:1640
2019-01-11 12:52:58.875404+0300 apns[55174:3496184] [General] An uncaught exception was raised
2019-01-11 12:52:58.875426+0300 apns[55174:3496184] [General] Creating more than one Application
2019-01-11 12:52:58.875504+0300 apns[55174:3496184] [General] (
    0   CoreFoundation                      0x00007fff500a9ecd __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff7c165720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff500c4b2a +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00007fff52468e0d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4   AppKit                              0x00007fff4d52d3ee -[NSApplication init] + 1954
    5   AppKit                              0x00007fff4d52ca59 +[NSApplication sharedApplication] + 138
    6   AppKit                              0x00007fff4d53d724 +[NSApplication _accessibilityInitialize] + 17
    7   AppKit                              0x00007fff4d53c39d -[NSApplication finishLaunching] + 132
    8   AppKit                              0x00007fff4d53bfa7 -[NSApplication run] + 253
    9   apns                                0x0000000100001c0f main + 383
    10  libdyld.dylib                       0x00007fff7d233ed9 start + 1
    11  ???                                 0x0000000000000001 0x0 + 1
)
2019-01-11 12:52:58.876112+0300 apns[55174:3496184] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Creating more than one Application'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff500a9ecd __exceptionPreprocess + 256
    1   libobjc.A.dylib                     0x00007fff7c165720 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff500c4b2a +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00007fff52468e0d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4   AppKit                              0x00007fff4d52d3ee -[NSApplication init] + 1954
    5   AppKit                              0x00007fff4d52ca59 +[NSApplication sharedApplication] + 138
    6   AppKit                              0x00007fff4d53d724 +[NSApplication _accessibilityInitialize] + 17
    7   AppKit                              0x00007fff4d53c39d -[NSApplication finishLaunching] + 132
    8   AppKit                              0x00007fff4d53bfa7 -[NSApplication run] + 253
    9   apns                                0x0000000100001c0f main + 383
    10  libdyld.dylib                       0x00007fff7d233ed9 start + 1
    11  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Program ended with exit code: 9

У меня есть идентификатор пакета и файл * .plist, прикрепленный к проекту, поэтому я немного удивлен, что не видит его. Более того, кажется, что даже для приложения командной строки есть неявный экземпляр NSApplication, что странно, как я и предполагал, что не должно быть ничего, кроме простой главной функции. То же самое относится и к коду Obj-C, хотя нет ничего, кроме основной функции. Есть ли какие-либо системные API, которые я мог бы использовать, чтобы обойти необходимость создания NSApp и делегата?

...