5

アプリがバックグラウンドでも次の機能を使いたいですか?

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
 {
        case NSStreamEventHasBytesAvailable:
        {  NSLog(@"Event:NSStreamEventHasBytesAvailable");
            if (theStream == _inputStream) {

                NSLog(@"NSStreamEventHasBytesAvailable: on Input Stream");
                uint8_t buffer[1024];
                int len;

                while ([_inputStream hasBytesAvailable]) {
                    len = [_inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0) {

                        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                        if (nil != output) {

                            NSLog(@"server said: %@", output);
                             // to get local notification I am calling below method.
 [self scheduleNotification];       
                        }
                    }
                }
            }
            break;
        }

上記のコードはforeGroundで実行されています。アップルのドキュメントに記載されているすべての変更を行って、アプリをバックグラウンドモードで実行しました-voip。AppDelegateメソッドで何を書く必要がありますか?

- (void)applicationDidEnterBackground:(UIApplication *)application
{
}

バックグラウンドで呼び出されるstream:handleEventを取得する方法は?

4

2 に答える 2

9

私はしばらく前に同様の問題を扱っていました。覚えておくべきいくつかの重要なこと:

  • バックグラウンドの「VoIP」機能はデバイスでのみ機能します。シミュレータを使用してテストしないでください。
  • アプリがVoIPアプリとして登録されていて、実際にはVoIPアプリではない場合、おそらく(テスト済み)拒否されます。

したがって、これがVoIPアプリでない場合は、ローカル通知を表示するのではなく、リモート通知を使用してユーザーに直接警告することをお勧めします。これが、アプリがAppStoreの検証に合格する唯一の方法だと思います。

とにかく、ここにあるSOの2つのリンクは、役立つと思われる場合に役立ちます。

iOSアプリは、バックグラウンドでTCP接続を無期限に維持するにはどうすればよいですか?

私は(あなたがそうするように)voipを使用し、ここで提案されているようにサイレントオーディオループを再生することになりました-それはうまくいきました。このサイレントオーディオループがまだ必要かどうかはわかりません。

iOSアプリケーションがバックグラウンドに入ったときにTCPおよびUDP(マルチキャストを使用)接続はどうなりますか

VoIPアプリを開発するためのヒントテクニカルノートTN2277:ネットワーキングとマルチタスクを必ずお読みください。

于 2012-06-14T13:17:47.563 に答える
0

このコードを使用して、iOSでアプリを存続させます

var backgroundUpdateTask: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier(rawValue: 0)

func endBackgroundUpdateTask() {
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskIdentifier.invalid
}
func applicationWillResignActive(_ application: UIApplication) {
    self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        self.endBackgroundUpdateTask()
    })
}
func applicationDidBecomeActive(_ application: UIApplication) {
    self.endBackgroundUpdateTask()

}

私はあなたがこの助けによって成功を収めることを願っています

于 2019-12-23T12:08:07.503 に答える