Saat mencoba mendaftar untuk pemberitahuan push di iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Saya mendapatkan kesalahan berikut:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Adakah ide apa cara baru melakukannya? Itu berfungsi ketika saya menjalankan aplikasi Swift ini di iOS 7.x.
EDIT
Di iOS 7.x ketika saya memasukkan kode kondisional yang saya dapatkan (baik SystemVersion bersyarat atau #jika __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
sumber
sumber
Jawaban:
Seperti yang sudah Anda jelaskan, Anda harus menggunakan metode berbeda berdasarkan versi iOS yang berbeda. Jika tim Anda menggunakan Xcode 5 (yang tidak tahu tentang penyeleksi iOS 8) dan Xcode 6, maka Anda harus menggunakan kompilasi bersyarat sebagai berikut:
Jika Anda hanya menggunakan Xcode 6, Anda dapat menggunakan ini:
Alasannya di sini adalah cara Anda mendapatkan izin pemberitahuan telah berubah di iOS 8. A
UserNotification
adalah pesan yang ditampilkan kepada pengguna, baik dari jarak jauh atau dari lokal. Anda perlu mendapatkan izin untuk menunjukkannya. Ini dijelaskan dalam video WWDC 2014 "Apa yang Baru di Pemberitahuan iOS"sumber
__IPHONE_OS_VERSION_MAX_ALLOWED
untuk memeriksa ini karena ini adalah waktu kompilasi.registerUserNotificationSettings:
didokumentasikan di siniUntuk iOS <10
Untuk iOS10
sumber
systemVersion
, Anda harus memeriksa[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
tidak akan pergi keapplication:didRegisterForRemoteNotificationsWithDeviceToken:
atauapplication:didFailToRegisterForRemoteNotificationsWithError:
jika pengguna menonaktifkan "Izinkan Pemberitahuan" di Pengaturan -> Pemberitahuan -> <Aplikasi Saya>.Membangun jawaban @ Prasath. Ini adalah bagaimana Anda melakukannya di Swift :
sumber
iOS 8 telah mengubah pendaftaran notifikasi dengan cara yang tidak kompatibel mundur. Meskipun Anda perlu mendukung iOS 7 dan 8 (dan sementara aplikasi yang dibangun dengan 8 SDK tidak diterima), Anda dapat memeriksa penyeleksi yang Anda butuhkan dan memanggil mereka dengan benar untuk versi yang sedang berjalan.
Berikut adalah kategori pada aplikasi UIA yang akan menyembunyikan logika ini di belakang antarmuka yang bersih untuk Anda yang akan bekerja di Xcode 5 dan Xcode 6.
Tajuk:
Penerapan:
sumber
Settings
dan menonaktifkan notifikasi,isRegisteredForRemoteNotifications
masih kembaliYES
Saya pikir ini adalah cara yang lebih baik untuk menjaga kompatibilitas jika kita menggunakan pendekatan ini, ini berfungsi untuk kasus saya dan harapan akan bekerja untuk Anda. Cukup mudah dimengerti.
sumber
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
seperti yang ditunjukkan di siniUntuk Swift-inclined:
sumber
Saya tidak tahu apa yang harus ditetapkan oleh variabel "kategori" NSSet, jadi jika seseorang dapat mengisi saya dengan senang hati saya akan mengedit posting ini. Namun, yang berikut ini memunculkan dialog pemberitahuan push.
Sunting: Saya mendapat pemberitahuan push untuk mengirim ke ponsel saya dengan kode ini, jadi saya tidak yakin parameter kategori diperlukan.
sumber
categories
digunakan untuk mengatur Tindakan Pemberitahuan di iOS 8. Anda dapat melihat video WWDC 2014 "Apa yang Baru di Pemberitahuan iOS" untuk detail lebih lanjutJadi ternyata karena AnyObject adalah penerus spiritual untuk id, Anda dapat memanggil pesan apa pun yang Anda inginkan di AnyObject. Itu sama dengan mengirim pesan ke id. OK cukup adil. Tetapi sekarang kita menambahkan dalam konsep bahwa semua metode adalah opsional pada AnyObject , dan kami memiliki sesuatu yang dapat kami kerjakan.
Mengingat hal di atas, saya berharap saya bisa melemparkan UIApplication.sharedApplication () ke AnyObject, lalu membuat variabel yang sama dengan metode signature, mengatur variabel itu ke metode opsional, kemudian menguji variabel tersebut. Ini sepertinya tidak berhasil. Dugaan saya adalah bahwa ketika dikompilasi dengan iOS 8.0 SDK, kompiler tahu di mana ia berpikir metode itu seharusnya , jadi ini mengoptimalkan semua ke pencarian memori. Semuanya berfungsi dengan baik sampai saya mencoba menguji variabel, pada titik mana saya mendapatkan EXC_BAD_ACCESS.
Namun, dalam pembicaraan WWDC yang sama di mana saya menemukan permata tentang semua metode menjadi opsional, mereka menggunakan Chaining Opsional untuk memanggil metode opsional - dan ini tampaknya berhasil. Bagian lumpuh adalah bahwa Anda harus benar-benar mencoba memanggil metode untuk mengetahui apakah itu ada, yang dalam kasus mendaftar untuk pemberitahuan adalah masalah karena Anda mencoba mencari tahu apakah metode ini ada sebelum Anda membuat sebuah Objek UIUserNotificationSettings. Sepertinya memanggil metode itu dengan nihil tidak apa-apa, jadi solusi yang tampaknya bekerja untuk saya adalah:
Setelah banyak pencarian terkait dengan ini, info kunci datang dari ceramah WWDC ini https://developer.apple.com/videos/wwdc/2014/#407 tepat di tengah pada bagian tentang "Metode Opsional dalam Protokol"
Dalam Xcode 6.1 beta kode di atas tidak berfungsi lagi, kode di bawah ini berfungsi:
sumber
Jika Anda ingin menambahkan dukungan ke IOS7 IOS8 Anda dapat menerapkan kode ini ke proyek Anda.
sumber
Setelah Xcode 6.1 Beta kode di bawah ini berfungsi, sedikit edit pada kode Tom S yang berhenti bekerja dengan 6.1 beta (bekerja dengan beta sebelumnya):
sumber
Anda bisa menggunakan ini
sumber
Swift 2.0
sumber
Jika yang Anda butuhkan adalah kode ios 8, ini harus dilakukan.
sumber
Ini adalah cara yang lebih bersih yang saya lakukan dan itu bekerja dengan baik
sumber
untuk iOS 8 ke atas
sumber