Ios 当我断开设备与Xcode的连接时,推送通知不起作用
我正在使用swift语言开发一个IOS应用程序。我已将基于Firebase的推送通知添加到我的项目中。当我的设备连接到xcode或在我的设备上调试我的应用程序时,它们可以正常工作。但当我从xcode上断开设备连接,或者在没有调试推送通知的情况下使用应用程序时,推送通知都不起作用。我正在寻找解决办法 应用程序代理文件中的我的代码 在didFinishLaunchingWithOptions函数中Ios 当我断开设备与Xcode的连接时,推送通知不起作用,ios,iphone,push-notification,apple-push-notifications,swift4,Ios,Iphone,Push Notification,Apple Push Notifications,Swift4,我正在使用swift语言开发一个IOS应用程序。我已将基于Firebase的推送通知添加到我的项目中。当我的设备连接到xcode或在我的设备上调试我的应用程序时,它们可以正常工作。但当我从xcode上断开设备连接,或者在没有调试推送通知的情况下使用应用程序时,推送通知都不起作用。我正在寻找解决办法 应用程序代理文件中的我的代码 在didFinishLaunchingWithOptions函数中 if #available(iOS 10.0, *) { // For iOS 10
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(options: authOptions,
completionHandler: { (bool, err) in
})
} else {
let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
UIApplication.shared.applicationIconBadgeNumber = 0
在didregisterdevicewithtoken函数中
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print("APNs token retrieved: \(deviceToken)")
// With swizzling disabled you must set the APNs token here.
if let refreshedToken = InstanceID.instanceID().token() {
print("InstanceID token: \(refreshedToken)")
}
let tokenT = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(tokenT)
guard let token = InstanceID.instanceID().token() else {return}
AppDelegate.DEVICEID = token
print(token)
UserDefaults.standard.set(token, forKey: "token")
connectToFCM()
}
以及生成通知
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// If you are receiving a notification message while your app is in the background,
// this callback will not be fired till the user taps on the notification launching the application.
// TODO: Handle data of notification
// With swizzling disabled you must let Messaging know about the message, for Analytics
// Messaging.messaging().appDidReceiveMessage(userInfo)
// Print message ID.
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: \(messageID)")
}
if let msg = userInfo["desc"] as? String
{
let title = userInfo["noti_title"] as? String
createNotification(message: msg, title: title ?? "" )
}
// Print full message.
print(userInfo)
completionHandler(UIBackgroundFetchResult.newData)
}
func createNotification(message: String, title: String) {
let content = UNMutableNotificationContent()
content.title = title
content.body = message
let triger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false )
let request = UNNotificationRequest(identifier: "TextMessage", content: content, trigger: triger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
UNUserNotificationCenterDelegate
extension AppDelegate : UNUserNotificationCenterDelegate {
// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let userInfo = notification.request.content.userInfo
if let messageID = userInfo[gcmMessageIDKey] {
print("Message ID: \(messageID)")
}
print(userInfo)
// Change this to your preferred presentation option
completionHandler([.alert,.badge,.sound])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let application = UIApplication.shared
if(application.applicationState == .active){
print("user tapped the notification bar when the app is in foreground")
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
// let layout = UICollectionViewFlowLayout()
window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())
}
if(application.applicationState == .inactive)
{
print("user tapped the notification bar when the app is in background")
window = UIWindow(frame: UIScreen.main.bounds)
window?.makeKeyAndVisible()
// let layout = UICollectionViewFlowLayout()
window?.rootViewController = UINavigationController(rootViewController: NotificationViewController())
}
/* Change root view controller to a specific viewcontroller */
// let storyboard = UIStoryboard(name: "Main", bundle: nil)
// let vc = storyboard.instantiateViewController(withIdentifier: "ViewControllerStoryboardID") as? ViewController
// self.window?.rootViewController = vc
completionHandler()
}
func connectToFCM()
{
Messaging.messaging().shouldEstablishDirectChannel = true
}
func initializeNotificationServices() -> Void {
let settings = UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)
UIApplication.shared.registerUserNotificationSettings(settings)
// This is an asynchronous method to retrieve a Device Token
// Callbacks are in AppDelegate.swift
// Success = didRegisterForRemoteNotificationsWithDeviceToken
// Fail = didFailToRegisterForRemoteNotificationsWithError
UIApplication.shared.registerForRemoteNotifications()
我已经解决了这个问题。现在,我在firebase控制台中添加了生产Apn证书,并从firebase控制台中删除了开发Apn证书。对于有相同问题的用户,请从apple.developers生成您的生产apn,并在build选项卡中将您的项目方案从debug更改为release。显示一些代码以更好地理解您的问题。您尚未实现UnuseNotificationCenterDelegate方法,因此不会收到推送通知。有关完整信息,请参阅此博客。抱歉,我忘了向您显示我已再次更新了问题。请选中“将该代码添加到问题中”。您是否已将该代码放入FIRApp.configure()中??如果是这样,那么你的代码就完全正确了。那么问题就出在别的地方了。