2017-05-08 22 views
3

私はiOSの天気予報アプリを持っています。毎朝、自分の選択時に通知を受け取って、通知を表示します。Swift:動的コンテンツでローカル通知をスケジュールする方法

私はプッシュ通知の使用を避けたいと思います。サーバーから表示されるコンテンツをフェッチする方法がわからないことを除いて、ローカルの通知を使用できる可能性があります。スケジューリング時にコンテンツを設定する必要があるようです。そうですか?

私はアプリケーションを登録して、バックグラウンドで実行して定期的に天気を取得し、最新の内容の通知をスケジュールすることができるかもしれないと思うが、これは無駄だ。

つまり、特定の時間に特定の機能を実行するようiOSに指示したいと思います。これには良い選択肢がありますか?プッシュ通知は、このようなことを達成するための唯一の/最良の方法ですか?

+0

あなたはあなたのコンテンツにローカル通知をスケジュールすることができます。 – KKRocks

+0

@KKRocksおそらく私は私の質問で十分に明確ではなかった。私が見ている問題は、通知を表示しているときに現地の通知に表示されるコンテンツを取得したいということです。したがって、私の場合、ユーザーは午前7時の通知をスケジュールするかもしれません。その時の通知の内容を取得したいのですが。 –

+1

はい、プッシュ通知は、天気予報を表示する場合に最適です。 – KKRocks

答えて

1

特定の時間にローカル通知をスケジュールすることができます。ユーザーが通知を受け取ったときに、その通知をタップしてアプリケーションを開くことができます。その時点で、ユーザーが通知をタップしてアプリが開いていることを知ることができます。データを取得してアプリケーション内に表示するネットワークコールを行うことができます。 これはバックグラウンドコールを必要とせず、ユーザによるアクションへのネットワークコールのみを行います。

別のオプション:天気ウィジェットなどのアプリのウィジェットを作成できます。ユーザーがウィジェットエリアに入ると、デリゲートコールがあり、最新の気象データを取得するためのネットワークコールが行われます。ユーザーがもっと情報を必要としている場合、ユーザーは単にそれをタップするだけでアプリケーションが開きます。それから、すべてがあなたの手に入ります。

オプション:ユーザーが特定の日付にアプリを開いて通知を設定すると常に動的コンテンツが表示されます。しかし、ユーザーが更新されたデータを取得しない可能性があるため、これは示唆的ではありません。

プッシュ通知:ただし、サーバー上の動的データをアプリに送信する場合は、このオプションは必須ではありません。これは常に最適なオプションです。

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方法で: - ユーザーがあなたの通知やたびに通知があなたが行ってまで何をしたいあなた次第present.Isになりますをクリックするたびに、処理することができます。

// 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]) 

    } 
} 
+0

ありがとうございますが、私はこれがどうやって必要なのか分かりません。私が探しているのは、(a)毎日午前7時に送信される通知をスケジュールし、(b)午前7時にサーバーからの通知のテキストを取得できるようにすることです。 'willPresent'関数で、サーバーからjsonなどを取得できますか? –

関連する問題