質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

4387閲覧

[swift/iOS]バックグランド状態からフォアグランド状態へ遷移させたい

entaro12345

総合スコア72

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/12/12 01:08

編集2019/12/12 02:59

前提・実現したいこと

※少々実現したいことを修正しました。

アプリ起動時に定期実行処理(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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/12/12 01:54

そういうアプリを見たことがありますか? ローカル通知をして、それをユーザーにタップさせてアプリを起動させることはできると思いますが、それ以外の方法で勝手にフォアグラウンドに来るアプリは私はみたことがありません。 むしろローカル通知をアラート代わりにするのがベストな気もします。
entaro12345

2019/12/12 02:51

ないですね。 定期的にAPI通信をして、APIのレスポンスでNGがあれば、フォアグラウンドにしてアラートしたかったのですが、やはり無理なのですかね?
guest

回答2

0

ベストアンサー

stackoverflowでも出来ないという回答がありましたので、リンクを張っておきます。

How to bring application to foreground in ios?
https://stackoverflow.com/questions/22930259/how-to-bring-application-to-foreground-in-ios

投稿2019/12/12 03:34

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

entaro12345

2019/12/12 05:18

ありがとうございます。 ユーザーアクションが必要ということがわかりました。
guest

0

ユーザーのインターアクションなしで、フォアグランド状態へ遷移するのは不可能です。

解決方法は:

投稿2019/12/12 02:55

vanderlvov

総合スコア685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

entaro12345

2019/12/12 05:17

ありがとうございます。 やはり何かしらユーザーアクションがないと不可なのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問