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

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

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

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

Q&A

解決済

2回答

4765閲覧

iosにてアプリがバックグラウンドに移行したらある処理をさせたいが、電話応答は除外したい

hakase

総合スコア107

iOS

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

1グッド

2クリップ

投稿2016/03/25 12:37

こんにちは!
iosにてホームボタンを押してアプリを閉じるときにある処理をさせたいです。
たぶんアプリがバックグラウンドに移行したらある処理をさせるようにコーディングしないといけないと思っているのですが、
電話がかかってきて電話に出たとき、バックグラウンドに移行してしまいますが、そのときは
ある処理というのをさせたくありません。
何か良い方法はありませんでしょうか。

izkn👍を押しています

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

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

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

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

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

guest

回答2

0

たぶんアプリがバックグラウンドに移行したらある処理をさせるようにコーディングしないといけないと思っているのですが、

という事ですがアプリがバックグラウンドに入る際に処理をさせることは必須ではありません。

自分でバックグラウンドに入る際に処理を行いたい場合は、AppDelegateのapplicationWillResignActiveapplicationDidEnterBackgroundメソッドが呼ばれるのでそちらで処理を記述する方法があります。

電話がかかってきて電話に出たとき、バックグラウンドに移行してしまいますが、そのときは

ある処理というのをさせたくありません。

こちらですが、電話によりバックグラウンドへ遷移したことを判定するのは無理だと思います。
上記は..iilllii..さんの回答によりできました。m(_ _)m


..iilllii..さんのアドバイスより出来ましたのでそのコード

電話がかかってきた場合はなぜだかapplicationDidEnterBackground が呼ばれませんでした、なのでapplicationWillResignActive でのフラグ制御にしました。

AppDelegateでの判定パターン

swift

1import UIKit 2import CoreTelephony 3 4@UIApplicationMain 5class AppDelegate: UIResponder, UIApplicationDelegate { 6 7 var window: UIWindow? 8 9 let callCenter = CTCallCenter() 10 var isCallBackgroud: Bool = false 11 12 13 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 14 15 callCenter.callEventHandler = { (call) -> () in 16 17 if call.callState == CTCallStateIncoming { 18 // 電話がかかってきた場合に呼ばれるハンドラ(フラグを変更しています。) 19 self.isCallBackgroud = true 20 } 21 print(call.callState) 22 } 23 24 return true 25 } 26 27 func applicationWillResignActive(application: UIApplication) { 28 print("willResignActive") 29 30 if isCallBackgroud { 31 // 電話がかかってきてバックグラウンドへ遷移した場合処理をしない 32 isCallBackgroud = false 33 return 34 } 35 36 // バックグラウンド処理を記述 37 } 38 39 func applicationDidEnterBackground(application: UIApplication) { 40 print("didEnterBackground") 41 } 42}

Flow ①
callEventHandler (CTCallStateIncoming)

applicationWillResignActive
↓ 電話を切った
callEventHandler (CTCallStateDisconnected)

Flow ②
callEventHandler (CTCallStateIncoming)

applicationWillResignActive
↓ 電話に出た
callEventHandler (CTCallStateConnected)
↓ 電話を切った
callEventHandler (CTCallStateDisconnected)

投稿2016/03/26 12:51

編集2016/03/27 00:09
_Kentarou

総合スコア8490

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

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

hakase

2016/03/27 01:48

ありがとうございますー。ベストアンサーは..iilllii..さんにしますが、ご了承くださいませ。
..iilllii..

2016/03/27 02:52

すごい!検証ありがとう!今後存分に役立たせてもらうよ!
_Kentarou

2016/03/27 03:11

自分も勉強になったのでそれで良いです!m(_ _)m
guest

0

ベストアンサー

Core Telephony Frameworkというのでなんとかできないか?
CTCallCenterのcallEventHandlerというので電話関連のイベント通知されるみたいだから、そこで「電話に出ているとき」ならCTCallStateConnectedが通知されかつその後CTCallStateDisconnectedされてない状態ってわけだからハンドラ内で状態フラグでも管理しとく。そしてapplicationDidEnterBackgroundとかいうのの中で判断できないか?
でもCTCallStateConnected時もCTCallStateDisconnected時もアプリがバックグラウンドにいるわけだから通知されないのかな?状態管理むずそうだ。CTCallStateIncomingなら通知されるのかな?「ユーザーが電話に出ようとして操作したことにより自分がバックグラウンドにいった」と確実には判断できないとは思うが電話かかってきて数秒以内ならそうだろう、と推測ぐらいはできるんじゃ?
どういうイベントフローになるかもわからんし、ほんとに通知されるのかも知らんが興味あるからやってみてくれ!俺も試したいがiOSアプリ開発は素人だし今Macもってないから無理だ!

投稿2016/03/26 16:12

..iilllii..

総合スコア48

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

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

_Kentarou

2016/03/26 23:35 編集

Core Telephonyは使用した事がなかったので全くの無知でした、..iilllii..のアドバイスを確認して実現できましたので、回答に追記させてもらいました。私が勉強になりました。m(_ _)m
hakase

2016/03/27 01:47

ありがとうございましたー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問