Saya membuat aplikasi di mana saya ingin menerapkan layanan pemberitahuan push apple. Saya mengikuti petunjuk langkah demi langkah yang diberikan dalam tutorial ini .
Tapi tetap saja, metodenya tidak dipanggil. Saya tidak tahu apa yang menyebabkan masalah. Ada yang bisa bantu saya?
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//NSString * token = [[NSString alloc] initWithData:deviceTokenencoding:NSUTF8StringEncoding];
NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
NSLog(@"Device Token:%@",str);
//NSLog(@"Device token is called");
//const void *devTokenBytes = [deviceToken bytes];
//NSLog(@"Device Token");
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
NSLog(@"Error:%@",str);
}
objective-c
apple-push-notifications
Muzammil
sumber
sumber
Jawaban:
Saya memiliki masalah yang sama: panggilan
registerForRemoteNotificationTypes:
tidak dipanggilapplication:didRegisterForRemoteNotificationsWithDeviceToken:
maupunapplication:didFailToRegisterForRemoteNotificationsWithError:
Saya akhirnya menyelesaikan masalah ini dengan bantuan catatan teknis Apple TN2265 .
Inilah yang saya lakukan:
Pertama, saya memeriksa ulang bahwa saya memang mendaftar dengan benar untuk Push Notifications , termasuk memverifikasi profil penyediaan saya untuk kunci "aps-environment" dan penandatanganan kode dari file .app itu sendiri. Saya sudah menyiapkan semuanya dengan benar.
Saya kemudian harus men-debug pesan status Pemberitahuan Push di konsol (Anda perlu menginstal profil penyediaan PersistentConnectionLogging.mobileconfig di perangkat Anda dan mem-boot ulangnya . Lihat TN2265 di bawah "Mengamati Pesan Status Push"). Saya perhatikan bahwa proses apns memulai pengatur waktu dan menghitung tanggal kebakaran minimum, yang membuat saya curiga bahwa pesan konfirmasi pendaftaran Push-Notification, yang biasanya disajikan pada saat ini, ditekan oleh APNS, seperti yang ditunjukkan di TN2265:
Jadi, saya menghapus aplikasi dari perangkat, lalu secara manual mengubah tanggal iPhone di Pengaturan, memulai ulang perangkat, dan menginstal ulang aplikasi.
Kali berikutnya kode saya dipanggil
registerForRemoteNotificationTypes
, ia menerima panggilan balik seperti yang diharapkan.Ini menyelesaikan masalah saya. Semoga membantu.
sumber
Di iOS 8, beberapa metode tidak digunakan lagi. Ikuti langkah-langkah di bawah ini untuk kompatibilitas iOS 8
1. Daftarkan pemberitahuan
if([[UIDevice currentDevice] systemVersion].floatValue >= 8.0) { UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge)]; }
2. Tambahkan 2 metode baru
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { //register to receive notifications [application registerForRemoteNotifications]; } //For interactive notification only - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { //handle the actions if ([identifier isEqualToString:@"declineAction"]){ } else if ([identifier isEqualToString:@"answerAction"]){ } }
Catatan: di atas dua metode baru diperlukan di iOS 8 selain
didRegisterForRemoteNotificationsWithDeviceToken
dandidReceiveRemoteNotification
..Jika tidak, metode delegasi tidak akan dipanggil.Lihat: Notifikasi Jarak Jauh iOS 8
sumber
[application registerForRemoteNotifications];
Di iOS 8 , selain meminta akses notifikasi push secara berbeda, Anda juga perlu mendaftar secara berbeda.
Minta Akses:
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { // iOS 8 UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; } else { // iOS 7 or iOS 6 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; }
Tangani perangkat terdaftar:
// New in iOS 8 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [application registerForRemoteNotifications]; } // iOS 7 or iOS 6 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; // Send token to server }
sumber
application:didRegisterForRemoteNotificationsWithDeviceToken:
Ingatlah bahwa notifikasi jarak jauh tidak didukung di simulator. Oleh karena itu, jika Anda menjalankan aplikasi Anda di simulator,
didRegisterForRemoteNotificationsWithDeviceToken
tidak akan dipanggil.sumber
Pastikan Anda memanggil kode Anda (perbarui sesuai dengan jenis pemberitahuan yang didukung)
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
dan profil penyediaan APNS diaktifkan. Anda mungkin perlu mengunduh ulang profil penyediaan setelah mengaktifkan APNS. Jika Anda mengalami masalah dan mendapatkan error, mungkin Anda harus membuat Entitlements.plist dan menambahkan kunci "aps-environment" dengan nilai "development" atau "production" bergantung pada jenis build (biasanya pasangan nilai kunci ini adalah terdapat dalam profil penyediaan, tetapi terkadang Xcode mengacaukannya).
sumber
Jika profil penyediaan digunakan sebelumnya untuk Mengaktifkan dan Mengonfigurasi layanan Pemberitahuan Push Apple, Anda perlu mengunduh ulang profil penyediaan lagi.
Hapus profil penyediaan dari Xcode Organizer dan dari iPhone / iPad. Pergi ke
Settings -> General -> Profiles -> [Your provisioning] -> Remove
.Instal profil penyediaan yang baru diunduh. Kemudian bersihkan dan jalankan proyek dari XCode. Sekarang
didRegisterForRemoteNotificationsWithDeviceToken
harus dipanggil.sumber
Saya membuat kesalahan dan mengabaikan detail implementasi yang membawa saya ke sini. Saya mencoba untuk menjadi mewah dan meminta pengguna untuk Push Notifications nanti dalam proses onboarding aplikasi, jadi saya memiliki UIView saya
registerForRemoteNotificationTypes
,didRegisterForRemoteNotificationsWithDeviceToken
dandidFailToRegisterForRemoteNotificationsWithError
semuanya dalam custom UIView.MEMPERBAIKI:
didRegisterForRemoteNotificationsWithDeviceToken
dandidFailToRegisterForRemoteNotificationsWithError
perlu diUIApplicationDelegate
(YourAppDelegate.m
) untuk dipicu.tampak jelas sekarang, heh.
sumber
AppDelegate
. Tidak percaya saya menyia-nyiakan beberapa jam terakhir saya untuk jawaban sederhana iniPastikan koneksi internet Anda aktif. Saya butuh waktu berjam-jam untuk mendapatkan pemberitahuan pekerjaan karena koneksi internet.
sumber
Jika Anda telah menambahkan push ke App ID yang ada, pastikan Anda membuat kembali profil penyediaan Anda. Jika tidak, profil tidak akan tahu tentang pengaktifan push pada App ID Anda.
sumber
Coba ini berhasil untuk saya,
Langkah pertama
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Dalam metode di atas tambahkan kode di bawah ini
UIApplication *application = [UIApplication sharedApplication]; if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil]; [application registerUserNotificationSettings:settings]; } else { UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; [application registerForRemoteNotificationTypes:myTypes]; }
Tahap kedua
Tambahkan Fungsi kode di bawah ini
#ifdef __IPHONE_8_0 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { //register to receive notifications [application registerForRemoteNotifications]; } - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { //handle the actions if ([identifier isEqualToString:@"declineAction"]){ } else if ([identifier isEqualToString:@"answerAction"]){ } } #endif
Anda akan mendapatkan Token perangkat di bawah fungsi
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
untuk detail jawaban silakan lihat ini
Semoga ini bisa membantu seseorang.
sumber
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions{ //Overridepointforcustomizationafterapplicationlaunch. //Addtheviewcontroller’sviewtothewindowanddisplay. [windowaddSubview:viewController.view]; [windowmakeKeyAndVisible]; NSLog(@”Registering for push notifications...”); [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; returnYES; } - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { } NSString *str = [NSString stringWithFormat:@”Device Token=%@”,deviceToken]; NSLog(@”%@”, str); - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSString *str = [NSString stringWithFormat: @”Error: %@”, err]; NSLog(@”%@”, str); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { } for (id key in userInfo) { NSLog(@”key: %@, value: %@”, key, [userInfo objectForKey:key]); }
sumber
Persyaratan Minimal untuk Mendapatkan Token Perangkat:
Tidak perlu mengonfigurasi id aplikasi, penyediaan, atau sertifikat, dll. Sehingga tidak ada penandatanganan kode yang disetel untuk mendapatkan metode delegasi yang dipanggil didRegisterForRemoteNotificationsWithDeviceToken .
Saya baru saja membuat proyek iOS baru di Xcode 7 untuk tampilan tunggal dengan pengaturan default dan memberikan id bundel acak seperti com.mycompany.pushtest yang tidak dikonfigurasi di portal dev apel.
Dengan kode berikut, saya mendapatkan token perangkat saya dalam metode didRegisterForRemoteNotificationsWithDeviceToken di iPad saya dengan akses internet ke WIFI. Perangkat saya terpasang dan saya hanya menjalankan aplikasi langsung dari xcode dan melihat nilai di konsol xcode.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; } else { // Register for Push Notifications, if running iOS version < 8 [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)]; } return YES; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Error: %@", error.description); } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken: %@", deviceToken); } - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { NSLog(@"NotificationSettings: %@", notificationSettings); }
sumber
Saya ada benarnya ini, baru-baru ini saya juga menghadapi masalah ini, saya telah melakukan semuanya sesuai dengan dokumentasi tetapi metode delegasi tidak menelepon Akhirnya saya melihat satu posting mengatakan masalah itu dengan jaringan, kemudian saya telah mengubah jaringan dan berfungsi dengan baik. Jadi berhati-hatilah dengan jaringan juga karena hanya sedikit jaringan yang dapat memblokir APNS.
sumber
Setelah membuang waktu 3 jam yang paling menjengkelkan, berikut adalah langkah-langkah untuk memperbaiki masalah tersebut:
Hapus aplikasi
Setel ulang perangkat
Berlari lagi
Itu berhasil
sumber
Ini terjadi pada saya, karena saya mengatur ulang & menghapus semua data di telepon (ingin menggunakan telepon pengembang). Ini mencegah APN untuk terhubung sama sekali setelah mengatur telepon lagi.
Saya mencoba segala macam hal, tetapi satu-satunya hal yang memperbaikinya adalah mengatur telepon agar berfungsi dengan operator di bawah kartu SIM baru.
Tautan ini menawarkan lebih banyak petunjuk tentang apa yang mungkin terjadi: https://developer.apple.com/library/ios/technotes/tn2265/_index.html
Dikatakan bahwa APN mencoba untuk terhubung secara istimewa melalui operator / menara daripada wifi. Mungkin masalahnya juga ada sesuatu yang terjadi dengan router memblokir port 5223 di jaringan wifi, tetapi saya ragu karena ini berfungsi dengan baik pada hari sebelumnya sebelum reset global terjadi.
sumber
Bagi saya yang menyelesaikannya adalah dengan membangun pengaturan dan di bawah bagian penandatanganan kode, secara manual memilih identitas penandatanganan kode dan profil penyediaan. Rupanya pengaturan otomatis tidak mengambil yang benar dan oleh karena itu aplikasi tidak diotorisasi dengan benar.
sumber
jika matikan pesan push dari aplikasi,
appdidRegisterForRemoteNotificationsWithDeviceToken tidak akan pernah dipanggil
sumber
Juga, jangan lupa untuk memeriksa status sistem di Apple https://developer.apple.com/system-status/ .
Saya telah mencoba semua solusi yang diposting di atas tetapi pada akhirnya kesalahan itu karena layanan APNS turun! Keesokan harinya semua sudah berfungsi seperti yang diharapkan.
Selain itu, Anda memiliki kesalahan ketik dalam metode panggilan balik Anda:
- (void)application:(UIApplication *)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
Seperti yang Rupesh tunjukkan, nama metode yang benar adalah:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
Itu mungkin mengapa Anda tidak pernah menerima token dalam kasus Anda!
sumber
Anda perlu memanggil metode registerForNotifications dari didFinishLaunchingWithOptions.
func registerForNotifications(){ if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options:[.alert,.sound,.badge]) { (granted, error) in if granted{ UIApplication.shared.registerForRemoteNotifications() }else{ print("Notification permission denied.") } } } else { // For iOS 9 and Below let type: UIUserNotificationType = [.alert,.sound,.badge]; let setting = UIUserNotificationSettings(types: type, categories: nil); UIApplication.shared.registerUserNotificationSettings(setting); UIApplication.shared.registerForRemoteNotifications() } } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = String(format: "%@", deviceToken as CVarArg).trimmingCharacters(in: CharacterSet(charactersIn: "<>")).replacingOccurrences(of: " ", with: "") print(token) } extension AppDelegate : UNUserNotificationCenterDelegate{ @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { print("Handle push from foreground”) let info = ((notification.request.content.userInfo as NSDictionary).value(forKey: "aps") as! NSDictionary) if let type = info.value(forKey: "type") as? Int{ if type == 0 { // notification received ,Handle your notification here } } } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { print("Handle push from background or closed") let info = ((response.notification.request.content.userInfo as NSDictionary).value(forKey: "aps") as! NSDictionary) if let type = info.value(forKey: "type") as? Int{ if type == 0 { // notification received ,Handle your notification here } } } }
sumber
Saya memiliki masalah lain di mana callback pemberitahuan push saya dibajak oleh perpustakaan pihak ketiga, yang telah saya sertakan, yaitu Firebase. Library ini mengelabui metode callback notifikasi push untuk mendapatkan callback.
Semoga ini bisa membantu seseorang.
sumber