2014-09-06 136 views
9

我正在開發一個祈禱應用程序,使用戶能夠爲禱告時間設置鬧鐘(本地通知),即用戶設置應用程序以便每天通知Fajr禱告,問題在於每個禱告的時間每天都在變化,所以在星期四應用程序將通知用戶公平的時間將與星期五的時間不同,我需要每天重複本地通知,但根據每日禱告時間,請,誰能給我一個想法?如何在不同的時間每天重複本地通知

+0

你有沒有想出解決辦法?我最終計算了未來10天的祈禱,並以這種方式安排通知。唯一的情況是有大約50個通知限制,所以我必須爲用戶設置另一個通知來打開我的應用程序,以便從那裏開始下一個10天。不喜歡它,但只有我能想到的方式。 – TruMan1 2016-03-06 17:17:55

+0

http://stackoverflow.com/questions/9862261/local-notification-repetation-at-different-times – TruMan1 2016-03-06 17:24:23

+0

@ TruMan1:你想讓用戶設置時間,還是你想讓應用程序設置時間用戶?而且,這個時間應該增加多少時間?我很想提供一些實現,但我需要更多信息。 :) – Sheamus 2016-03-07 07:33:46

回答

2

所以出現的問題是你需要不時設置本地通知,但不能成爲可重複的通知。我假設用戶設置祈禱時間,並希望得到通知。我建議你設置一些,因爲你從列表中知道。然後爲每5個小時設置一次背景獲取,並在應用程序後臺啓動時,檢查仍設置的本地通知,並根據當前日期相應地更新列表。在這種情況下,後臺抓取並不會每5小時精確地喚醒您的應用,但會盡力而爲。我相信你的應用一天至少會醒來兩次。您可以根據您的需求調整時間。

抓取需要檢查是否有新的內容內容的少量投機 應用週期性可以要求系統喚醒他們,讓他們可以發起獲取操作的內容。要支持此模式,請在Xcode項目的Capabilities選項卡的Background模式部分中啓用Background fetch選項。 (您也可以通過在應用程序的Info.plist文件中包含具有獲取值的UIBackgroundModes項來啓用此支持。)啓用此模式並不能保證系統會隨時爲您的應用程序提供後臺提取。系統必須平衡您的應用程序的需求,以獲取其他應用程序和系統本身的需求。在評估這些信息後,系統會在有很好機會的情況下爲應用程序提供時間。當出現好機會時,系統會喚醒或啓動您的應用程序並調用應用程序委託的應用程序:performFetchWithCompletionHandler:方法。如果內容可用,請使用該方法檢查新內容並啓動下載操作。一旦完成下載新內容,您必須執行提供的完成處理程序塊,並傳遞一個結果,指示內容是否可用。執行此塊會告訴系統它可以將您的應用程序移回掛起狀態並評估其用電量。快速下載少量內容並準確反映他們何時可以下載內容的應用程序比將需要很長時間下載內容的應用程序或聲明內容可用但後來可以執行的應用程序更有可能在未來獲得執行時間不下載任何東西。

欲瞭解更多信息,指的是蘋果公司在後臺執行文件:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

有趣的,關於註冊後臺獲取的好主意只是爲了計算和安排將來的通知。 – TruMan1 2016-03-06 17:42:25

6

這有幾個可能的解決方案。因爲iOS只保留64條最快的通知,所以使用一種方法可能會更安全一些,因爲iOS只保留64條最快的通知:

應用程序只能有有限數量的計劃通知;系統保持最快的64個通知(自動重新安排的通知作爲單個通知計數)並丟棄剩餘的通知。

來源:UILocalNotification類參考

它也不是靠使用傳入application:didFinishLaunchingWithOptions:UILocalNotification一個好主意,因爲它是當用戶刷卡的通知只有通過:

查看啓動選項字典以確定您的應用程序啓動的原因。應用程序:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:方法提供一個字典,其中包含指示您的應用程序啓動的原因的鍵。

,用於響應發射到本地通知的密鑰值是: UIApplicationLaunchOptionsLocalNotificationKey

來源:UIApplicationDelegate類參考

選項1:日程一天一時間(碼本在下面提供)

處理通知調度的一種方式是向用戶呈現時間表,whe當天的通知安排在應用程序初次啓用時。

使用CustomNotificationManager類來處理時間可變的通知(下面提供的代碼)。在你的AppDelegate中,你可以委託這個類處理本地通知,它可以安排當天的通知加上第二天的固定時間通知,或者響應禱告通知。

如果用戶打開應用程序以響應禱告通知,應用程序可以將用戶引導至應用程序的適當部分。如果用戶打開應用程序以響應固定時間通知,則應用程序將根據用戶的日期和位置安排當天的本地通知。

選項2(略更薄的方法,但其對用戶提供更小)

另一種方法是簡單地用一個祈禱通知的應用程序啓動來調度緊隨一個。但是,這不太可靠,並且不能提供預覽通知時間表的功能。

通知管理器頭文件

@interface CustomNotificationManager : NSObject 

- (void) handleLocalNotification:(UILocalNotification *localNotification); 

@end 

通知管理器實現文件

#import "CustomNotificationManager.h" 

#define CustomNotificationManager_FirstNotification @"firstNotification" 

@implementation CustomNotificationManager 

- (instancetype) init 
{ 
    self = [super init]; 

    if (self) { 

    } 

    return self; 
} 

- (void) handleLocalNotification:(UILocalNotification *)localNotification 
{ 
    //Determine if this is the notification received at a fixed time, 
    // used to trigger the scheculing of today's notifications 
    NSDictionary *notificationDict = [localNotification userInfo]; 
    if (notificationDict[CustomNotificationManager_FirstNotification]) { 
     //TODO: use custom algorithm to create notification times, using today's date and location 
     //Replace this line with use of algorithm 
     NSArray *notificationTimes = [NSArray new]; 

     [self scheduleLocalNotifications:notificationTimes]; 
    } else { 
     //Handle a prayer notification 
    } 

} 

/** 
* Schedule local notifications for each time in the notificationTimes array. 
* 
* notificationTimes must be an array of NSTimeInterval values, set as intervalas 
* since 1970. 
*/ 
- (void) scheduleLocalNotifications:(NSArray *)notificationTimes 
{ 
    for (NSNumber *notificationTime in notificationTimes) { 
     //Optional: create the user info for this notification 
     NSDictionary *userInfo = @{}; 

     //Create the local notification 
     UILocalNotification *localNotification = [self createLocalNotificationWithFireTimeInterval:notificationTime 
                         alertAction:@"View" 
                         alertBody:@"It is time for your next prayer." 
                          userInfo:userInfo]; 

     //Schedule the notification on the device 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
    } 

    /* Schedule a notification for the following day, to come before all other notifications. 
    * 
    * This notification will trigger the app to schedule notifications, when 
    * the app is opened. 
    */ 

    //Set a flag in the user info, to set a flag to let the app know that it needs to schedule notifications 
    NSDictionary *userInfo = @{ CustomNotificationManager_FirstNotification : @1 }; 

    NSNumber *firstNotificationTimeInterval = [self firstNotificationTimeInterval]; 

    UILocalNotification *firstNotification = [self createLocalNotificationWithFireTimeInterval:firstNotificationTimeInterval 
                        alertAction:@"View" 
                        alertBody:@"View your prayer times for today." 
                         userInfo:userInfo]; 

    //Schedule the notification on the device 
    [[UIApplication sharedApplication] scheduleLocalNotification:firstNotification]; 
} 

- (UILocalNotification *) createLocalNotificationWithFireTimeInterval:(NSNumber *)fireTimeInterval 
                alertAction:(NSString *)alertAction 
                alertBody:(NSString *)alertBody 
                userInfo:(NSDictionary *)userInfo 

{ 
    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    if (!localNotification) { 
     NSLog(@"Could not create a local notification."); 
     return nil; 
    } 

    //Set the delivery date and time of the notification 
    long long notificationTime = [fireTimeInterval longLongValue]; 
    NSDate *notificationDate = [NSDate dateWithTimeIntervalSince1970:notificationTime]; 
    localNotification.fireDate = notificationDate; 

    //Set the slider button text 
    localNotification.alertAction = alertAction; 

    //Set the alert body of the notification 
    localNotification.alertBody = alertBody; 

    //Set any userInfo, e.g. userID etc. (Useful for app with multi-user signin) 
    //The userInfo is read in the AppDelegate, via application:didReceiveLocalNotification: 
    localNotification.userInfo = userInfo; 

    //Set the timezone, to allow for adjustment for when the user is traveling 
    localNotification.timeZone = [NSTimeZone localTimeZone]; 

    return localNotification; 
} 

/** 
* Calculate and return a number with an NSTimeInterval for the fixed daily 
* notification time. 
*/ 
- (NSNumber *) firstNotificationTimeInterval 
{ 
    //Create a Gregorian calendar 
    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    //Date components for next day 
    NSDateComponents *dateComps = [[NSDateComponents alloc] init]; 
    dateComps.day = 1; 

    //Get a date for tomorrow, same time 
    NSDate *today = [NSDate date]; 
    NSDate *tomorrow = [cal dateByAddingComponents:dateComps toDate:today options:0]; 

    //Date components for the date elements to be preserved, when we change the hour 
    NSDateComponents *preservedComps = [cal components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:tomorrow]; 
    preservedComps.hour = 5; 
    tomorrow = [cal dateFromComponents:preservedComps]; 

    NSTimeInterval notificationTimeInterval = [tomorrow timeIntervalSince1970]; 

    NSNumber *notificationTimeIntervalNum = [NSNumber numberWithLongLong:notificationTimeInterval]; 

    return notificationTimeIntervalNum; 
} 

@end 

的AppDelegate didReceiveLocalNotification實施

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    CustomNotificationManager *notificationManager = [[CustomNotificationManager alloc] init]; 
    [notificationManager handleLocalNotification:notification]; 
} 

對可能的修改的建議:如果CustomNotificationManager需要保持狀態,則可以將其轉換爲Singleton。

2

有三種方法可以做到這一點:

  1. 使用推送通知,而不是本地通知和移動邏輯服務器。問題 - 用戶在脫機時不會收到通知。

  2. 繼續使用本地通知。你將不得不爲每個祈禱時間計劃一個新的通知。當然,本地通知的數量是有限的(最多預定通知爲64),但它應該足夠一週的通知。通知不是警報,用戶應該在接收到通知後打開應用程序。這樣,當應用程序重新打開時,您可以隨時重新安排所有通知。另外,最後的通知可能類似於「你有一段時間沒有打開應用程序,你將不會收到更多通知」。

  3. 而是創建本地通知,創建設備日曆鬧鐘/提醒(Event Kit

相關問題