Во время всплеска обнаружения я должен определить, возможно ли для приложения командной строки подписаться на 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 и делегата?