我想构建一个应用程序,我可以接收推送通知并保存在客户端设备内以进行限制25通知。如果应用程序正在运行,可能无法运如何存储PushNotification警报消息?如果运行该时间的应用程序到达存储在UserDefault中的通知警报消息,但是当应用程序处于后台或处于非活动状态时,该时间未在UserDefault中存储通知警报消息。我想知道我需要使用UserDefault或CoreData在客户端应用程序中存储推送通知消息吗?如果不是,我应该使用什么?我真的需要一只手来接我。
请帮助。感谢。
答案 0 :(得分:1)
第1步:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
requestUserPermissions(application: application)
if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject]
{
let info : NSDictionary! = notification as NSDictionary
if info != nil
{
getDataFromNotification(userInfo: info as! [AnyHashable : Any])
Alert.showAlert((self.window?.rootViewController)!, message: "App is terminated", strtitle: "Notification")
}
}
return true
}
第2步:
func requestUserPermissions(application: UIApplication)
{
if #available(iOS 10.0, *)
{
let center = UNUserNotificationCenter.current()
center.delegate = self
center.requestAuthorization(options:[.badge, .alert, .sound])
{
(granted, error) in
if( !(error != nil) )
{
application.registerForRemoteNotifications()
}
// Enable or disable features based on authorization.
}
}
else {
// Fallback on earlier versions
if (!application.isRegisteredForRemoteNotifications)
{
application.applicationIconBadgeNumber = 0
application.registerForRemoteNotifications()
}
}
第3步:
@objc(userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:) @available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
print("Userinfo1 \(response.notification.request.content.userInfo)")
getDataFromNotification(userInfo: response.notification.request.content.userInfo)
Alert.showAlert((self.window?.rootViewController)!, message: "I am in Background", strtitle: "Notification")
}
@objc(userNotificationCenter:willPresentNotification:withCompletionHandler:) @available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
print("Userinfo2 \(notification.request.content.userInfo)")
getDataFromNotification(userInfo: notification.request.content.userInfo)
Alert.showAlert((self.window?.rootViewController)!, message: "I am in forground", strtitle: "Notification")
}
第4步:
func getDataFromNotification(userInfo: [AnyHashable : Any])
{
let info : NSDictionary! = userInfo as NSDictionary
if info != nil
{
if let aps = info["aps"] as? NSDictionary
{
if let resultsDict = aps as? [String:AnyObject]
{
for _ in resultsDict
{
let str = dictCleanData.value(forKey: "alert")!
let time = dictCleanData.value(forKey: "day")!
let dict = ["msg" : str, "time": time]
UserDefaults.standard.set(dict, forKey: "dict")
UserDefaults.standard.synchronize()
}
}
}
}
}
步骤5:检查其他视图控制器上保存的数据
override func viewDidLoad()
{
super.viewDidLoad()
if UserDefaults.standard.value(forKey: "dict") != nil
{
let dict : NSDictionary = UserDefaults.standard.value(forKey: "dict") as! NSDictionary
arr_Veges.add(dict)
if UserDefaults.standard.value(forKey: "arr_Veges") != nil
{
let arr = UserDefaults.standard.value(forKey: "arr_Veges") as! NSArray
for oldObj in arr
{
arr_Veges.add(oldObj)
}
}
UserDefaults.standard.set(arr_Veges, forKey: "arr_Veges")
UserDefaults.standard.synchronize()
}
}
答案 1 :(得分:1)
在我看来,您可以使用NSUserDefaults
存储用户相关信息。在您的情况下推送通知。但是,只需考虑一下,您可以简单地将通知附加到本地存储或用户设备上的txt
文件,并在用户访问该元素时删除该元素。
但这只适用于用户使用该应用的情况。如果您想要在应用程序不工作时使其工作,您需要制作后端并将这些数据存储在某种云数据库中。您可以从数据中提取记录,并在再次启用应用时再次推送到NSUserDefaults
或本地txt
文件。