Maintain a Multipeer Connectivity session in Background via BackgroundTask?

前端 未结 2 1913
孤街浪徒
孤街浪徒 2021-02-04 18:11

I am trying to maintain a MultipeerConnectivity \"session\" when the application enters temporarily in the background, so I thought about using a background task as I\'ve seen f

2条回答
  •  余生分开走
    2021-02-04 18:51

    As per apple documentation "If the app moves into the background, the framework stops advertising and browsing and disconnects any open sessions. Upon returning to the foreground, the framework automatically resumes advertising and browsing, but the developer must reestablish any closed sessions" Refer: Apple doc

    One way of extending the connection is as follows

    Answering my own question, hoping it would help people in the same situation. For people new to iOS development, "using a background service" simple means turning on the "Background Modes" option in the "Capabilities" tab of your target. That alone should give your app around 10 minutes life in the background before it gets killed.

    But, when the app goes to background, I use the "backgroundTimeRemaining" to know how much time I have left, it just starts at 180 (in sec, so 3 minutes), yet, the printing loop did continue to work passed three minutes, which means there is a need to manually code what should happen when the time is reached.

    For Multipeer Connectivity, this is enough to maintain the connection alive when the app enters background, and it will still receive all messages/streams without a problem.

    For the sake of stability, I do some cleaning as follow:

    In the appDelegate.h

    @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; //declaring a background task
    

    In the appDelegate.m

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^
                               {
                                   //This is called 3 seconds before the time expires
                                   //Here: Kill the session, advertisers, nil its delegates,
                                   //      which should correctly send a disconnect signal to other peers
                                   //      it's important if we want to be able to reconnect later,
                                   //      as the MC framework is still buggy
                                   [application endBackgroundTask:self.backgroundTask];
                                   self.backgroundTask = UIBackgroundTaskInvalid; //Invalidate the background task
                               }];
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        // Here: We should init back the session, start the advertising and set the delegates from scratch
        // This should allow the app to reconnect to the same session with more often than not
        self.backgroundTask = UIBackgroundTaskInvalid; //Here we invalidate the background task if the timer didn't end already
    }
    

提交回复
热议问题