ユーザーが設定した時間にローカル通知をトリガーするタイマーを作成しようとしています。私が抱えている問題は、たとえば午後7時にローカル通知をオフに設定できる方法がわからないことです。この問題を調査するときに見つかったほとんどすべての方法には、現在の日付から一定の時間でローカル通知がオフになることが含まれていました。ユーザーが午後7時を選択し、その時点で通知をオフにすることを許可しようとしています。論理的には、これは最終時間(ユーザーが選択した値)を使用して達成できることは理にかなっています-現在の時間は時間差を与えます。ただし、これを行う方法は完全にはわかりません。
トピックに関するヘルプは非常に高く評価されます、ありがとう。以下は、ローカル通知をトリガーするために現在使用しているコードです。
let center = UNUserNotificationCenter.current()
content.title = storedMessage
content.body = "Drag down to reset or disable alarm"
content.categoryIdentifier = "alarm"
content.userInfo = ["customData": "fizzbuzz"]
content.sound = UNNotificationSound.init(named: "1.mp3")
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeAmount, repeats: false)
let request = UNNotificationRequest(identifier: "requestAlarm", content: content, trigger: trigger)
center.add(request)
center.delegate = self
IOS 10では、AppleはUILocalNotificationを廃止しました。つまり、新しい通知フレームワークに慣れるときです。
セットアップこれは長い投稿なので、新しい通知フレームワークをインポートして簡単に始めましょう。
// Swift
import UserNotifications
// Objective-C (with modules enabled)
@import UserNotifications;
共有UNUserNotificationCenterオブジェクトを介して通知を管理します。
// Swift
let center = UNUserNotificationCenter.current()
// Objective-C
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
承認古い通知フレームワークと同様に、アプリが使用する通知の種類に対するユーザーの許可が必要です。 application:didFinishLaunchingWithOptions:。などのアプリライフサイクルの早い段階でリクエストを行います。アプリが初めて承認をリクエストすると、システムはユーザーにアラートを表示します。その後、ユーザーは設定から権限を管理できます。
// Swift
let options: UNAuthorizationOptions = [.alert, .sound];
// Objective-C
UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound;
共有通知センターを使用して実際の承認リクエストを作成します。
// Swift
center.requestAuthorization(options: options) { (granted, error) in
if !granted {
print("Something went wrong")
}
}
// Objective-C
[center requestAuthorizationWithOptions:options
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
NSLog(@"Something went wrong");
}
}];
フレームワークは、アクセスが許可されたかどうかを示すブール値と、エラーが発生しなかった場合はnilになるエラーオブジェクトで完了ハンドラーを呼び出します。
注:ユーザーはいつでもアプリの通知設定を変更できます。 getNotificationSettingsで許可された設定を確認できます。これは、承認ステータスまたは個々の通知設定を確認するために使用できるUNNotificationSettingsオブジェクトを使用して、非同期に完了ブロックを呼び出します。
// Swift
center.getNotificationSettings { (settings) in
if settings.authorizationStatus != .authorized {
// Notifications not allowed
}
}
// Objective-C
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
// Notifications not allowed
}
}];
通知リクエストの作成UNNotificationRequest通知リクエストには、コンテンツとトリガー条件が含まれます。
通知内容
通知のコンテンツは、必要に応じて次のプロパティが設定されたUNMutableNotificationContentのインスタンスです。
title:アラートの主な理由を含む文字列。
subtitle:アラートサブタイトルを含む文字列(必要な場合)
body:アラートメッセージテキストを含む文字列
バッジ:アプリのアイコンに表示する番号。
サウンド:アラートが配信されたときに再生するサウンド。 UNNotificationSound.default()を使用するか、ファイルからカスタムサウンドを作成します。 launchImageName:通知に応答してアプリが起動された場合に使用する起動画像の名前。
userInfo:通知の添付ファイルに渡すカスタム情報の辞書:UNNotificationAttachmentオブジェクトの配列。音声、画像、または動画コンテンツを含めるために使用します。
タイトルなどのアラート文字列をローカライズするときは、localizedUserNotificationString(forKey:arguments :)を使用することをお勧めします。これにより、通知が配信されるまでローカライズのロードが遅延します。
簡単な例:
// Swift
let content = UNMutableNotificationContent()
content.title = "Don't forget"
content.body = "Buy some milk"
content.sound = UNNotificationSound.default()
// Objective-C
UNMutableNotificationContent *content = [UNMutableNotificationContent new];
content.title = @"Don't forget";
content.body = @"Buy some milk";
content.sound = [UNNotificationSound defaultSound];
通知トリガー
時間、カレンダー、または場所に基づいて通知をトリガーします。トリガーは繰り返すことができます:
時間間隔:通知を数秒後にスケジュールします。たとえば、5分でトリガーするには:
// Swift
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 300, repeats: false)
// Objective-C
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:300
repeats:NO];
カレンダー:特定の日時にトリガーします。トリガーは、特定の繰り返し間隔を簡単にする日付コンポーネントオブジェクトを使用して作成されます。日付を日付コンポーネントに変換するには、現在のカレンダーを使用します。例えば:
// Swift
let date = Date(timeIntervalSinceNow: 3600)
let triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
// Objective-C
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600];
NSDateComponents *triggerDate = [[NSCalendar currentCalendar]
components:NSCalendarUnitYear +
NSCalendarUnitMonth + NSCalendarUnitDay +
NSCalendarUnitHour + NSCalendarUnitMinute +
NSCalendarUnitSecond fromDate:date];
日付コンポーネントからトリガーを作成するには:
// Swift
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false)
// Objective-C
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate
repeats:NO];
特定の間隔で繰り返されるトリガーを作成するには、正しい日付コンポーネントのセットを使用します。たとえば、毎日同じ時間に通知を繰り返すには、時間、分、秒だけが必要です。
let triggerDaily = Calendar.current.dateComponents([hour, .minute, .second], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)
それを週に一度に繰り返すには、平日も必要です:
let triggerWeekly = Calendar.current.dateComponents([.weekday, .hour, .minute, .second], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true)
スケジューリング
コンテンツとトリガーの両方が準備できたら、新しい通知要求を作成して通知センターに追加します。各通知リクエストには、今後の参照のために文字列識別子が必要です。
// Swift
let identifier = "UYLLocalNotification"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
center.add(request, withCompletionHandler: { (error) in
if let error = error {
// Something went wrong
}
})
// Objective-C
NSString *identifier = @"UYLLocalNotification";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier
content:content trigger:trigger]
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Something went wrong: %@",error);
}
}];
特定の時間に通知を開始するには、以下のコードを使用します。
let content = UNMutableNotificationContent()
content.title = "Title"
content.body = "Body"
content.sound = UNNotificationSound.default()
let gregorian = Calendar(identifier: .gregorian)
let now = Date()
var components = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: now)
// Change the time to 7:00:00 in your locale
components.hour = 7
components.minute = 0
components.second = 0
let date = gregorian.date(from: components)!
let triggerDaily = Calendar.current.dateComponents([.hour,.minute,.second,], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)
let request = UNNotificationRequest(identifier: CommonViewController.Identifier, content: content, trigger: trigger)
print("INSIDE NOTIFICATION")
UNUserNotificationCenter.current().add(request, withCompletionHandler: {(error) in
if let error = error {
print("SOMETHING WENT WRONG")
}
})
また、特定の時間間隔で絶えず起動するには、たとえば2分ごとにトリガーの下の行を使用します。
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 120, repeats: true)
Swiftの場合、次のコードを使用できます。
let calendar = Calendar.current
let components = DateComponents(year: 2018, month: 05, day: 06, hour: 20, minute: 22) // Set the date here when you want Notification
let date = calendar.date(from: components)
let comp2 = calendar.dateComponents([.year,.month,.day,.hour,.minute], from: date!)
let trigger = UNCalendarNotificationTrigger(dateMatching: comp2, repeats: true)
let content = UNMutableNotificationContent()
content.title = "Notification Demo"
content.subtitle = "Demo"
content.body = "Notification on specific date!!"
let request = UNNotificationRequest(
identifier: "identifier",
content: content,
trigger: trigger
)
UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
if error != nil {
//handle error
} else {
//notification set up successfully
}
})
このヘルプを願っています。
これを試して
let dateformateer = NSDateFormatter()
dateformateer.timeStyle = .ShortStyle
let notification = UILocalNotification()
var datecomponent = NSDateComponents()
datecomponent = NSCalendar.currentCalendar().components([NSCalendarUnit.Day,NSCalendarUnit.Month,NSCalendarUnit.Hour,NSCalendarUnit.Year, NSCalendarUnit.Minute],fromDate: Datepicker.date)
var fixdate = NSDate()
fixdate = NSCalendar.currentCalendar().dateFromComponents(datecomponent)!
notification.fireDate = fixdate
notification.alertTitle = "Title"
notification.alertBody = "Body"
UIApplication.sharedApplication().scheduleLocalNotification(notification)`
これは、特定の時間に通知を追加する最も簡単な方法であり、Appleの開発者向けドキュメントに基づいています: https://developer.Apple.com/documentation/usernotifications
モジュラー関数での私の実装は次のとおりです。
public func simpleAddNotification(hour: Int, minute: Int, identifier: String, title: String, body: String) {
// Initialize User Notification Center Object
let center = UNUserNotificationCenter.current()
// The content of the Notification
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = .default
// The selected time to notify the user
var dateComponents = DateComponents()
dateComponents.calendar = Calendar.current
dateComponents.hour = hour
dateComponents.minute = minute
// The time/repeat trigger
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
// Initializing the Notification Request object to add to the Notification Center
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
// Adding the notification to the center
center.add(request) { (error) in
if (error) != nil {
print(error!.localizedDescription)
}
}
}