3

こんにちは、Swift と IOS プログラミングは初めてです。時間帯に応じて 1 日 6 回ユーザーに警告することになっている 6 つの通知を設定しました。アラートは機能していますが、何らかの理由でアプリを最初に起動すると、通知センターに 6 つのアラートすべてが同時に表示されます。どんな助けでも大歓迎です。

これは AppDelegate.swift のコードです

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.



        let notificationTypes : UIUserNotificationType = UIUserNotificationType.Alert | UIUserNotificationType.Badge
        let notificationSetting : UIUserNotificationSettings = UIUserNotificationSettings(forTypes: notificationTypes, categories: nil)
        UIApplication.sharedApplication().registerUserNotificationSettings(notificationSetting)

        return true
    }

これは、6 つの異なる通知に対する私の関数です。

func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {


        dateComp.year = Int(currentDate.year)
        dateComp.month = Int(currentDate.month)
        dateComp.day = Int(currentDate.day)
        dateComp.hour = prayHour
        dateComp.minute = prayMinute
        dateComp.timeZone = NSTimeZone.systemTimeZone()

        var calender : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)!
        var date : NSDate = calender.dateFromComponents(dateComp)!

        var notification : UILocalNotification = UILocalNotification()
        notification.alertBody = prayerName
        notification.fireDate = date



        UIApplication.sharedApplication().scheduleLocalNotification(notification)
    }

これは、ViewDidLoad で関数を呼び出している場所です

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        pray.setTimeFormat(0)


        self.locationManager.requestAlwaysAuthorization()
        self.locationManager.requestWhenInUseAuthorization()


        if CLLocationManager.locationServicesEnabled() {
            self.locationManager.delegate = self
            self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            self.locationManager.startUpdatingLocation()

        }



        var timesArray = pray.getDatePrayerTimes(currentDate.year, andMonth: currentDate.month, andDay: currentDate.day, andLatitude: locationManager.location.coordinate.latitude, andLongitude: locationManager.location.coordinate.longitude, andtimeZone: pray.timeZone)


            var convertedTime = convertPrayArray(timesArray as NSMutableArray)

            prayerAlert("Time for Fajr", prayHour: convertedTime.hourArray[0], prayMinute: convertedTime.minuteArray[0])
            prayerAlert("Time for SunRise", prayHour: convertedTime.hourArray[1], prayMinute: convertedTime.minuteArray[1])
            prayerAlert("Time for Dhuhr", prayHour: convertedTime.hourArray[2], prayMinute: convertedTime.minuteArray[2])
            prayerAlert("Time for Asr", prayHour: convertedTime.hourArray[3], prayMinute: convertedTime.minuteArray[3])
            prayerAlert("Time for Maghrib", prayHour: convertedTime.hourArray[5], prayMinute: convertedTime.minuteArray[5])
            prayerAlert("Time for Isha", prayHour: convertedTime.hourArray[6], prayMinute: convertedTime.minuteArray[6])


    }
4

1 に答える 1

4

更新: Xcode 7.1 • Swift 2.1

問題は、日付コンポーネントを通知ではなく localTime ゾーンに設定していることです。

この拡張 NSDate を追加して、NSDate() から目的のコンポーネントを返します

extension NSDate {
    var minute: Int { return NSCalendar.currentCalendar().component(.Minute, fromDate: self)}
    var hour:   Int { return NSCalendar.currentCalendar().component(.Hour,   fromDate: self)}
    var day:    Int { return NSCalendar.currentCalendar().component(.Day,    fromDate: self)}
    var month:  Int { return NSCalendar.currentCalendar().component(.Month,  fromDate: self)}
    var year:   Int { return NSCalendar.currentCalendar().component(.Year,   fromDate: self)}
    func fireDateAt(hr: Int, min: Int) -> NSDate {
        let date = NSDate()
        return NSCalendar.currentCalendar().dateWithEra(1,
            year: year,
            month: month,
            day: { hr > date.hour || (hr == date.hour && min > date.minute) ? day : day + 1 }(),
            hour: hr,
            minute: min,
            second: 0,
            nanosecond: 0
        )!
    }
}

timeZone プロパティ

通知の発火日のタイムゾーン。

fireDate で指定された日付は、このプロパティの値に従って解釈されます。nil (デフォルト) を指定すると、起動日は絶対 GMT 時間として解釈され、カウントダウン タイマーなどの場合に適しています。有効な NSTimeZone オブジェクトをこのプロパティに割り当てた場合、開始日は実時間として解釈され、タイム ゾーンが変更されたときに自動的に調整されます。この場合に適した例は、目覚まし時計です。

func prayerAlert (prayerName : String, prayHour : Int, prayMinute : Int) {
    var notification = UILocalNotification()
    notification.timeZone  = NSTimeZone.localTimeZone()
    notification.alertBody = prayerName
    notification.fireDate  = NSDate().fireDateAt(prayHour, min: prayMinute)
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
于 2015-01-13T01:46:36.473 に答える