Swift:如何使用动态内容安排本地通知

6
我有一个iOS天气应用程序,我想允许用户在每天选择的时间接收通知,获取当天的天气预报并显示通知。我想避免使用推送通知,我认为我可以使用本地通知,但我看不到从服务器获取要显示的内容的方法。看起来内容必须在安排时间时设置。是这样吗?这让我想到可能可以注册我的应用程序以使用后台执行定期获取天气并安排具有最新内容的通知,但这似乎很浪费。简而言之,我想告诉iOS在特定时间运行特定函数。我是否缺少某些好的选择?推送通知是实现这种事情的唯一/最佳方式吗?

您可以使用您的内容安排本地通知。 - KKRocks
@KKRocks也许我没有清楚地表达我的问题。 我看到的问题是,我想在显示通知时获取要显示的内容。 因此,在我的情况下,用户可能会安排一个早上7点的通知,并且我希望在那个时间获取通知的内容。 - Trevor Turk
2
如果您想显示天气预报,那么推送通知是最好的选择。 - KKRocks
鉴于我的需求,@Truth Potatoe,推送通知是推荐的解决方案吗? - Trevor Turk
请查看此链接:http://stackoverflow.com/a/41901767/3901620 - KKRocks
1
是的,这很有帮助,谢谢。听起来推送通知确实是这种情况下唯一可行的选择。 - Trevor Turk
3个回答

2
您可以为特定时间安排本地通知,当用户看到它并且希望打开您的应用程序时,可以通过点击该通知来打开它。此时,您将能够知道用户已经点击了通知,从而打开了应用程序,您可以进行网络调用以获取数据并在应用程序内显示它。这不需要任何后台调用,只需通过用户操作进行一次网络调用。 另一个选择:您可以创建一个应用程序小部件(例如天气小部件)。每当用户进入小部件区域时,您将获得委托调用并进行网络调用以获取最新的天气数据。如果用户想要更多信息,他可以简单地点击它,您的应用程序将打开。然后,一切都在您的掌握中。
您的选择:您始终可以在用户打开应用程序以获取特定日期的动态内容并为其设置通知。但是,这不建议使用,因为用户可能无法获得更新的数据。
推送通知:对于您的情况可能不需要,但是,如果您想将动态数据发送到您的服务器并传递给您的应用程序,则始终是最佳选择。

2

1
我已经创建了一个函数。这个函数可以在你想要的特定时间调用你的函数。我正在创建一个闹钟应用程序,所以每当用户创建闹钟时,我需要触发本地通知。在通知中心委托方法中,您可以处理响应并调用任何您想要的方法。
class LocalNotificationMethod : NSObject {

static let notificationInstance = LocalNotificationMethod()

let requestIdentifier = "SampleRequest" //identifier is to cancel the notification request

 internal func scheduleLocalNotification(titleOfNotification:String, subtitleOfNotification:String, messageOfNotification:String, soundOfNotification:String, dateOfNotification:String) {

    if #available(iOS 10.0, *) {

        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd hh:mm a"
        let date3 = formatter.date(from: dateOfNotification)

        let content = UNMutableNotificationContent()
        content.body = NSString.localizedUserNotificationString(forKey: titleOfNotification, arguments: nil)
        content.sound = soundOfNotification.characters.count > 0 ? UNNotificationSound.init(named: soundOfNotification + ".mp3") : UNNotificationSound.default()

        let trigger = UNCalendarNotificationTrigger.init(dateMatching: NSCalendar.current.dateComponents([.day, .month, .year, .hour, .minute], from: date3!), repeats: false)

        let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request){(error) in

            if (error != nil){

                print(error?.localizedDescription)
            } else {
                print("Successfully Done")
            }
        }
    } else {
        // Fallback on earlier versions
    }

}
}

在AppDelegate方法中:- 您可以处理用户何时单击您的通知或者您的通知何时出现。你可以自己决定要做什么。
//MARK:- 通知委托
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    print("Tapped in notification")
}

//This is key callback to present notification while the app is in foreground
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {


    print("Notification being triggered")
    //You can either present alert ,sound or increase badge while the app is in foreground too with ios 10
    //to distinguish between notifications
    if notification.request.identifier == "SampleRequest" {

        completionHandler( [.alert,.sound,.badge])

    }
}

谢谢,但我没有看到这个如何满足我的需求。我想要做的是(a)在每天早上7点安排发送通知,以及(b)能够在早上7点从我的服务器获取通知文本。在willPresent函数中,您能否从服务器获取json等数据? - Trevor Turk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接