前提・実現したいこと
※少々実現したいことを修正しました。
アプリ起動時に定期実行処理(API呼び出し)を処理させて、
バックグラウンド時に遷移しても処理を続ける実装をしようとしています。
バックグラウンドに遷移後に、APIのレスポンスでNGが返ってきた場合に
フォアグラウンドに遷移させてアラートを表示したいのですが、
フォアグラウンドへの遷移の方法がわからないので教えていただきたいです。
※調べ方が悪くて欲しい情報にたどり着けていない可能性もありますが、教えて下さい。
該当のソースコード
AppDelegate
1import UIKit 2import Firebase 3//import FireBaseMessaging 4import UserNotifications 5 6@UIApplicationMain 7class AppDelegate: UIResponder, UIApplicationDelegate { 8 9 var window: UIWindow? 10 var viewController: ViewController! 11 var backgroundTaskID : UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 100) 12 13 var sDeviceToken : String! 14 var bPost = false 15 16 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 FirebaseApp.configure() 18 19 //Messaging.messaging().delegate = self as MessagingDelegate 20 21 if #available(iOS 10.0, *) { 22 UNUserNotificationCenter.current().delegate = self as! UNUserNotificationCenterDelegate 23 24 UNUserNotificationCenter.current().requestAuthorization(options: [.sound, .alert, .badge], completionHandler: {_, _ in }) 25 // プッシュ通知の登録 26 application.registerForRemoteNotifications() 27 } else { 28 // iOS10未満のためプッシュ通知しない 29 } 30 return true 31 } 32 33 // プッシュ通知受信時、プッシュ通知タップ時 34 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 35 36 switch application.applicationState { 37 case .inactive: // バックグラウンド状態でプッシュ通知から起動したとき 38 if (userInfo[AnyHashable("URL")] != nil) { 39 // 画面遷移 40 let sUrl = userInfo["URL"] 41 //viewController.ReqesutURL(sUrl) 42 } 43 break 44 case .active: // アプリ起動時にプッシュ通知を受信したとき 45 // バッジデクリメント 46 DispatchQueue.main.async { 47 UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1 48 } 49 break 50 case .background: // バックグラウンド状態でプッシュ通知を受信したとき 51 break 52 default: 53 break 54 } 55 // バッジデクリメント 56 DispatchQueue.main.async { 57 UIApplication.shared.applicationIconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber - 1 58 } 59 completionHandler(UIBackgroundFetchResult.newData) 60 } 61 62 // デバイストークン取得時イベント 63 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 64 65 InstanceID.instanceID().instanceID { (result, error) in 66 if let error = error { 67 print("Error fetching remote instance ID: (error)") 68 } else if let result = result { 69 // 変更があれば、APIを使用して送信 70 if (self.sDeviceToken != nil && self.sDeviceToken != result.token) { 71 self.sDeviceToken = result.token 72 //self.viewController.postAsync() 73 self.bPost = true 74 } else { 75 self.sDeviceToken = result.token 76 } 77 print("DeviceToken: (result.token)") 78 } 79 } 80 } 81 82 // バックグラウンド遷移直前に呼ばれる 83 func applicationWillResignActive(_ application: UIApplication) { 84 self.backgroundTaskID = application.beginBackgroundTask(){ 85 [weak self] in 86 application.endBackgroundTask((self?.backgroundTaskID)!) 87 self?.backgroundTaskID = UIBackgroundTaskIdentifier.invalid 88 } 89 } 90 91 func applicationDidEnterBackground(_ application: UIApplication) { 92 // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 93 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 94 } 95 96 func applicationWillEnterForeground(_ application: UIApplication) { 97 // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 98 } 99 100 // アプリがアクティブになるたびに呼ばれる 101 func applicationDidBecomeActive(_ application: UIApplication) { 102 application.endBackgroundTask(self.backgroundTaskID) 103 } 104 105 // アプリ終了時イベント 106 func applicationWillTerminate(_ application: UIApplication) { 107 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 108 } 109}
ViewController
1import UIKit 2 3class ViewController: UIViewController { 4 5 var timer = Timer() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 dispAlert() 11 } 12 13 @objc func dispAlert() { 14 if self.timer.isValid { 15 self.timer.invalidate() 16 } 17 self.timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(updating), userInfo: nil, repeats: true) 18 19 let alert = UIAlertController(title: "テスト", message: "バックグラウンド", preferredStyle: .alert) 20 let confirmAction: UIAlertAction = UIAlertAction(title: "アラート", style: .default, handler:nil) 21 alert.addAction(confirmAction) 22 self.present(alert, animated: true, completion: nil) 23 } 24}
補足情報(FW/ツールのバージョンなど)
MacOS HighSierra
Swift 3
Xcode 10.1
回答2件
あなたの回答
tips
プレビュー