簡體   English   中英

在iOS應用程序處於后台時顯示警報

[英]Show an alert when iOS app is in the background

當我的iOS應用程序在后台 (並且正在使用位置) 時,我顯示一個警報視圖

例如,即使在以下情況下, Uber合作伙伴(駕駛員)應用程序也會顯示警報並播放聲音:

  • 我已關閉通知!
  • 我的iPhone處於靜音模式!

我知道本地通知方法,如果用戶關閉/更改“設置”中的通知,則此方法不起作用。 我正在尋找不同的東西。

在此處輸入圖片說明
為達到上述狀態而執行的操作:

  • 在Uber合作伙伴應用程序上在線(您是驅動程序!)
  • 在設置中禁用該應用的通知
  • 將應用程序移至后台並等待乘車請求
  • 一段時間后,會以“警報”視圖的形式彈出一個“乘車請求”,並在后台播放聲音

當然,即使用戶在“設置”中禁用了“通知”,應用也可以使用didReceiveRemoteNotification: fetchCompletionHandler: API來獲取無提示的遠程通知。 但是,如何彈出警報,這就是我試圖找出的。

我可以想象,Uber具有某些特殊權限或使用了一些私有API,這些特權使他們無需使用本地通知即可實現此行為。 雖然我不知道Uber如何在其合作伙伴應用程序中實現此功能,但我可以談談警報在主屏幕上的工作方式。

SpringBoard是用於管理SpringBoard應用程序(SpringBoard.app)(用於iPhone的應用程序啟動器)的單例類。 SpringBoard不使用標准的UIAlertView / UIAlertController類,因為它們不參與整個SpringBoard警報系統。 iOS 5引入了SBAlertItem ,用於在SpringBoard上顯示UIAlertViews(電池通知警報,Sim Unlock警報等)。 蘋果將SBAlertItem用於鎖定和主屏幕警報,我將假設Uber對此答案使用SBAlertItem

SBAlertItem具有受保護的ivar UIAlertView *_alertSheet 假設它充當普通的UIAlertView ,您應該能夠更改此警報上的屬性以適合您的需求。 我也將通過Saurik公司的蘋果蠹基板項目中讀取,具體MobileSafety.mm看到一些用例。 我還發現了noweibogoodsleep ,它提供了在SpringBoard上使用SBAlertItem的示例。

我還找到了SBUserNotificationAlert ,它是SBAlertItem的子類。 與標准SBAlertItem相比,這似乎有更多的方法可以促進警報自定義,這些方法可能更適合您的需求。

我意識到,掛接到私有API可能不是您在問這個問題時所期望的。 由於我不知道Uber的工作原理,因此我只能根據我在運行時和越獄設備方面的經驗提供答案。

對二進制文件進行一些靜態分析后,很明顯它們沒有使用PKPushRegistry(VOIP),未記錄的NSNotificationCenter調用或SBAlertItem。

花了一點時間找到它,但是他們實際上正在使用CFUserNotification來發出警報。 該類文件的Mac,但私人的iOS。

我這樣做是找到了用法:

nm -u ~/Downloads/Payload/UberDriver.app/UberDriver | grep CFUserNotification

輸出為:

_CFUserNotificationCancel
_CFUserNotificationCreate
_CFUserNotificationCreateRunLoopSource
_kCFUserNotificationAlertHeaderKey
_kCFUserNotificationAlertMessageKey
_kCFUserNotificationAlertTopMostKey
_kCFUserNotificationAlternateButtonTitleKey
_kCFUserNotificationDefaultButtonTitleKey
_kCFUserNotificationSoundURLKey

如果我為PKPushRegistry或SBAlertItem使用grep,則兩者均不返回結果。

可以通過將該文件導入到項目中來使用該類。

更新

我有“工作中”的代碼,但是它立即調用回調函數(將responseFlags設置為kCFUserNotificationCancelResponse )而不顯示警報。

我正在使用與Uber應用程序相同的鍵和調用(比較下面的代碼以在上面列出),因此必須有一些額外的東西。 將繼續尋找。

#import "CFUserNotification.h"

@interface AppDelegate ()
@property (nonatomic) CFRunLoopSourceRef runLoopSource;
@property (nonatomic) CFUserNotificationRef notification;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    SInt32 error;
    NSDictionary *keys = @{(__bridge NSString*)kCFUserNotificationAlertHeaderKey: @"Hello",
                           (__bridge NSString*)kCFUserNotificationAlertMessageKey: @"World",
                           (__bridge NSString*)kCFUserNotificationAlertTopMostKey: @YES,
                           (__bridge NSString*)kCFUserNotificationDefaultButtonTitleKey: @"asdf",
                           (__bridge NSString*)kCFUserNotificationAlternateButtonTitleKey: @"asdf",
                           };

    self.notification = CFUserNotificationCreate(NULL, 10, kCFUserNotificationPlainAlertLevel, &error, (__bridge CFDictionaryRef)keys);
    self.runLoopSource = CFUserNotificationCreateRunLoopSource(NULL, self.notification, NotificationCallback, 0);
    CFRunLoopAddSource(CFRunLoopGetMain(), self.runLoopSource, kCFRunLoopCommonModes);

    return YES;
}

void NotificationCallback(CFUserNotificationRef userNotification, CFOptionFlags responseFlags) {
    NSLog(@"got response: %lu", responseFlags);
}

您的問題沒有涉及“ Uber合作伙伴”應用程序中最重要的部分,這將使事情變得更加清晰。 “ Uber合作伙伴”應用程序是企業應用程序,不限於Appstore指南。

它沒有像建議的其他答案一樣獲得任何特殊權限。

無論Sound \\ Notification設置如何,都可以使用SBAlertItem顯示警報視圖,但是不幸的是,如果您的最終目標是進入應用商店,則您的應用將因為使用私有API而被拒絕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM