第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

iphone-背靠背為事件進行投票

iphone-背靠背為事件進行投票

iOS
翻翻過去那場雪 2019-07-25 14:14:51
iphone-背靠背為事件進行投票很長一段時間以來,我一直在研究一種在我的iPhone應用程序中每隔X分鐘輪詢一次數據計數器的方法。在閱讀了大量的后臺執(zhí)行文檔和一些試用應用程序之后,我認為在不濫用后臺API的情況下,這是不可能的。上周,我發(fā)現這個應用程序就是這么做的。http:/itunes.apple.com/us/app/DataMan-實時-數據-使用/id3932873?mt=8它在后臺運行,并跟蹤您所使用的蜂窩/WiFi數據的計數。我懷疑開發(fā)人員正在注冊他的應用程序以跟蹤位置變化,但是在應用程序運行時,位置服務圖標是不可見的,我認為這是必需的。有沒有人知道如何做到這一點?
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

我也見過這種行為。經過多次嘗試,我發(fā)現了兩件事情,這可能會有所幫助。但我仍不清楚這會如何影響檢討過程。

如果您使用其中一個后臺功能,應用程序將由iOS在后臺再次啟動,一旦退出(由系統)。我們稍后會濫用這個。

在我的例子中,我使用了在我的plist中啟用的VoIP回退。這里的所有代碼都是在AppDelegate中完成的:

// if the iOS device allows background execution,// this Handler will be called- (void)backgroundHandler {

    NSLog(@"### -->VOIP backgrounding callback");
    // try to do sth. According to Apple we have ONLY 30 seconds to perform this Task!
    // Else the Application will be terminated!
    UIApplication* app = [UIApplication sharedApplication];
    NSArray*    oldNotifications = [app scheduledLocalNotifications];

     // Clear out the old notification before scheduling a new one.
    if ([oldNotifications count] > 0) [app cancelAllLocalNotifications];

    // Create a new notification
    UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease];
    if (alarm)
    {
        alarm.fireDate = [NSDate date];
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.soundName = @"alarmsound.caf";
        alarm.alertBody = @"Don't Panic! This is just a Push-Notification Test.";

        [app scheduleLocalNotification:alarm];
    }}

注冊是在

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

    // This is where you can do your X Minutes, if >= 10Minutes is okay.
    BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
    if (backgroundAccepted)
    {
        NSLog(@"VOIP backgrounding accepted");
    }}

現在神奇的事情發(fā)生了:我甚至不使用VoIP-Socket。但是這10分鐘的回調提供了一個很好的副作用:在10分鐘(有時更早)之后,我發(fā)現我的計時器和以前的運行記錄被執(zhí)行了一段時間。你可以看到這個,如果你放置一些NSlog(.)進入你的密碼。這意味著,這個簡短的“喚醒”會執(zhí)行一段時間的代碼。根據蘋果的說法,我們還有30秒的執(zhí)行時間。我想,類似線程的背景代碼正在執(zhí)行將近30秒。這是有用的代碼,如果你必須“有時”檢查一些東西。

醫(yī)生說,所有的背景任務(VoIP,音頻,位置更新)將在后臺自動重新啟動,如果應用程序被終止。VoIP應用程序將在啟動后在后臺自動啟動!

通過濫用這種行為,您可以使您的應用程序看起來像運行“永遠”。為一個背景進程(即VoIP)注冊。這將導致您的應用程序在終止后重新啟動。

現在編寫一些“任務必須完成”的代碼。根據蘋果的說法,你有一些時間(5秒?)左轉完成任務。我發(fā)現,這一定是CPU時間。這意味著:如果你什么也不做,你的應用程序還在被執(zhí)行!蘋果建議,如果你的工作完成了,就打電話給一個呼氣處理程序。在下面的代碼中,您可以看到,我在期滿處理程序上有一個注釋。這將導致您的應用程序運行,只要系統允許您的應用程序運行。所有計時器和線程都在運行,直到iOS終止應用程序為止。

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

    UIApplication*    app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];


    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // you can do sth. here, or simply do nothing!
    // All your background treads and timers are still being executed
    while (background) 
       [self doSomething];
       // This is where you can do your "X minutes" in seconds (here 10)
       sleep(10);
    }

    // And never call the expirationHandler, so your App runs
    // until the system terminates our process
    //[app endBackgroundTask:bgTask];
    //bgTask = UIBackgroundTaskInvalid;

    }); }

在這里非常空閑的CPU時間,你的應用程序運行時間更長!但有一點是肯定的:你的應用程序會在一段時間后被終止。但是因為你注冊了你的應用程序為VoIP或其他的一個,系統在后臺重新啟動應用程序,這將重新啟動你的后臺進程;-)用這個乒乓,我可以做很多回植。但請記住,與CPU的時間是非??臻e的。并保存所有數據,以恢復您的視圖-您的應用程序將在一段時間后終止。為了使它看起來仍在運行,您必須在醒來后跳回最后的“狀態(tài)”。

我不知道這是不是你之前提到的應用程序的方法,但它對我有用。

希望我能幫上忙

最新情況:

在測量了BG任務的時間之后,出現了一個驚喜。BG任務以600秒為限。這是VoIP最短時間的最小時間(setKeepAliveTimeout:600)。

因此,這段代碼在后臺導致“無限”執(zhí)行:

標題:

UIBackgroundTaskIdentifier bgTask;

代碼:

// if the iOS device allows background execution,// this Handler will be called- (void)backgroundHandler {

    NSLog(@"### -->VOIP backgrounding callback");

    UIApplication*    app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    while (1) {
        NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
           [self doSomething];
        sleep(1);
    }   });     - (void)applicationDidEnterBackground:(UIApplication *)application {

    BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
    if (backgroundAccepted)
    {
        NSLog(@"VOIP backgrounding accepted");
    }

    UIApplication*    app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];


    // Start the long-running task
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        while (1) {
            NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
           [self doSomething];
           sleep(1);
        }    
    }); }

在應用程序超時后,將調用VoIP期滿處理程序,您只需重新啟動一個長時間運行的任務。此任務將在600秒后終止。但是會再次調用過期處理程序,這將啟動另一個長時間運行的任務,等等?,F在您只需檢查應用程序是否返回到前臺。然后關閉bgTask,你就完成了。也許一個人能做某事。在長時間運行的任務中,呼氣處理程序就像這樣。試試看。用你的控制臺,看看會發(fā)生什么.玩得開心!

更新2:

有時候簡化一些事情會有幫助。我的新方法是:

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

    UIApplication*    app = [UIApplication sharedApplication];

    // it's better to move "dispatch_block_t expirationHandler"
    // into your headerfile and initialize the code somewhere else
    // i.e. 
    // - (void)applicationDidFinishLaunching:(UIApplication *)application {//// expirationHandler = ^{ ... } }
    // because your app may crash if you initialize expirationHandler twice.
    dispatch_block_t expirationHandler;
    expirationHandler = ^{

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;


        bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
    };

    bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];


    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // inform others to stop tasks, if you like
        [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

        // do your background work here     
    }); }

這起作用了網絡電話攻擊。根據文檔,如果執(zhí)行時間結束,過期處理程序(在本例中是我的“期滿處理程序”塊)將被執(zhí)行。通過將塊定義為塊變量,可以在過期處理程序中遞歸地再次啟動長時間運行的任務。這也導致了無止境的處決。

如果應用程序再次進入前臺,請注意終止任務。如果你不再需要的話就終止任務。

根據我自己的經驗,我測量了一些東西。使用位置回叫與有全球定位系統收音機是吸吮我的電池非常快。使用我在更新2幾乎不需要任何能量。根據“用戶體驗”,這是一種更好的方法。也許其他的應用程序就是這樣工作的,把它的行為隱藏在GPS功能后面.




查看完整回答
反對 回復 2019-07-26
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

什么起作用,什么不起作用

現在還不完全清楚這些答案中的哪一個有效&我浪費了大量的時間來嘗試它們。以下是我對每一種策略的經驗:

  1. 網絡電話攻擊-工作,但是

    將要

    如果你不是VOIP應用程序,就會被拒絕
  2. 遞歸

    beginBackgroundTask...

    -不起作用。10分鐘后它就會退出。即使您嘗試了注釋中的修補程序(至少是截至2012年11月30日的注釋)。
  3. 無聲的音頻作品,但是人們因為這個而被拒絕。
  4. 本地/推送通知-在您的應用程序被喚醒之前需要用戶交互
  5. 使用背景位置-作品

    ..詳情如下:

基本上,您使用“位置”后臺模式,以保持您的應用程序在后臺運行。它確實有效,即使用戶不允許位置更新。即使用戶按下HOME按鈕并啟動另一個應用程序,您的應用程序也將繼續(xù)運行。如果你的應用程序與位置無關的話,這也是一個電池消耗器&如果你的應用程序與位置無關的話,這可能是審批過程中的一個環(huán)節(jié),但據我所知,這是唯一一個很有可能獲得批準的解決方案。

下面是它的工作原理:

在你的褶皺里:

  • 應用程序不在后臺運行:否
  • 所需背景模式:地點

然后參考CoreLocation框架(在構建階段),并在應用程序中的某個地方添加這段代碼(在它進入后臺之前):

#import <CoreLocation/CoreLocation.h>CLLocationManager* locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

注:startMonitoringSignificantLocationChanges將要工作。

值得一提的是,如果你的應用程序崩潰,iOS就不會讓它復活。VOIP黑客是唯一能把它帶回來的黑客。





查看完整回答
反對 回復 2019-07-26
  • 3 回答
  • 0 關注
  • 421 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號