जब आपका ऐप खुला और अग्रभूमि में स्टॉक iOS सूचना बैनर प्रदर्शित हो?


123

जब Apple का आधिकारिक iOS संदेश ऐप खुला होता है और अग्रभूमि में, अन्य संपर्कों के नए संदेश एक स्टॉक को ट्रिगर करते हैं, तो मूल iOS सूचना चेतावनी बैनर। नीचे देखें इमेज

क्या ऐप स्टोर पर 3 पार्टी ऐप्स में यह संभव है? जब आपका ऐप खुला हो और अग्रभूमि में आपके ऐप के लिए स्थानीय और / या पुश सूचनाएं हों ?

मेरे ऐप का परीक्षण करते समय , सूचनाएं प्राप्त की जाती हैं, लेकिन कोई आईओएस अलर्ट यूआई नहीं दिखाया गया है

लेकिन इस व्यवहार कर रहा है एप्पल के आधिकारिक संदेश अनुप्रयोग में देखी गई:

संदेश खुले और अग्रभूमि में हैं।  फिर भी एक सूचना चेतावनी दिखाता है।

स्थानीय और दूरस्थ अधिसूचना प्रोग्रामिंग गाइड का कहना है:

जब ऑपरेटिंग सिस्टम एक स्थानीय अधिसूचना या दूरस्थ सूचना देता है और लक्ष्य ऐप अग्रभूमि में नहीं चल रहा है , तो यह उपयोगकर्ता को एक अलर्ट , आइकन बैज नंबर, या ध्वनि के माध्यम से सूचना प्रस्तुत कर सकता है ।

यदि नोटिफिकेशन डिलीवर होने पर ऐप अग्रभूमि में चल रहा है, तो ऐप डेलीगेट को लोकल या रिमोट नोटिफिकेशन मिलता है।

हां, हम अग्रभूमि में रहते हुए सूचना डेटा प्राप्त कर सकते हैं । लेकिन मुझे देशी आईओएस नोटिफिकेशन यूआई को पेश करने का कोई तरीका नहीं दिख रहा है

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{
    // I know we still receive the notification `userInfo` payload in the foreground.
    // This question is about displaying the stock iOS notification alert UI.

    // Yes, one *could* use a 3rd party toast alert framework. 
    [self use3rdPartyToastAlertFrameworkFromGithub]
}

क्या संदेश तब अग्रभूमि में रहते हुए अलर्ट प्रदर्शित करने के लिए एक निजी एपीआई का उपयोग कर रहा है?

इस सवाल के प्रयोजन के लिए, किसी भी 3 पार्टी "टोस्ट" पॉप-अप अलर्ट का सुझाव नहीं करते कृपया कर रहा हूँ केवल रुचि रखने वाला उपयोग किया जा सकता है, तो GitHub या आदि मैं पर शेयर, मूल iOS स्थानीय या पुश यूआई अलर्ट अधिसूचना हुए अपने आवेदन खुला है और अग्रभूमि में है

जवाबों:


152

iOS 10UNUserNotificationCenterDelegate सूचनाओं को संभालने के लिए प्रोटोकॉल जोड़ता है जबकि आपका ऐप अग्रभूमि में है।

UNUserNotificationCenterDelegateप्रोटोकॉल सूचनाएं प्राप्त करने के लिए और कार्यों से निपटने के लिए तरीकों को परिभाषित करता है। जब आपका ऐप अग्रभूमि में होता है, तो सिस्टम इंटरफेस का उपयोग करके स्वचालित रूप से प्रदर्शित होने के बजाय आगमन सूचनाएं आपके प्रतिनिधि ऑब्जेक्ट तक पहुंचाई जाती हैं।

स्विफ्ट:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                     willPresent notification: UNNotification, 
      withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)

उद्देश्य सी:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
       willPresentNotification:(UNNotification *)notification 
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler;

UNNotificationPresentationOptions झंडे आप निर्दिष्ट कर सकते UNNotificationPresentationOptionAlertअलर्ट सूचना द्वारा प्रदान की पाठ का उपयोग कर प्रदर्शित करने के लिए।

यह कुंजी है क्योंकि यह आपको अलर्ट प्रदर्शित करने की अनुमति देता है जबकि आपका ऐप खुला है और अग्रभूमि में है , जो iOS 10 के लिए नया है।


नमूना कोड:

class AppDelegate: UIResponder, UIApplicationDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // Set UNUserNotificationCenterDelegate
        UNUserNotificationCenter.current().delegate = self
        
        return true
    }
    
}

// Conform to UNUserNotificationCenterDelegate
extension AppDelegate: UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
           willPresent notification: UNNotification,
           withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        completionHandler(.alert)
    }
    
}

4
क्या आप एक वर्किंग कोड सैंपल प्रदान कर सकते हैं जहाँ सिस्टम द्वारा आने वाली अग्रभूमि की सूचना प्रदर्शित की जाती है जैसे कि अनुप्रयोग जहाँ पृष्ठभूमि?
अज़मुक

1
@azmeuk मेरा जवाब जांचें ...
चेंगसम

8
या विधि UNUserNotificationCenter.current().delegate = selfमें जोड़ने के लिए मत भूलनाapplication(_:willFinishLaunchingWithOptions:)application(_:didFinishLaunchingWithOptions:)
Deniss Fedotovs

3
यह भी सुनिश्चित करें कि आपके पास डू नॉट डिस्टर्ब मोड में आपका डिवाइस नहीं है अन्यथा सूचनाएं अधिसूचना केंद्र में दिखाई देंगी, लेकिन आपके आवेदन पर अग्रभूमि में प्रस्तुत नहीं की जाएगी
Jadent

2
मेरे 2 सेंट: याद नहीं है: UserNotifications आयात करें। !
ingconti

94

एप्लिकेशन अग्रभूमि में है, जबकि बैनर संदेश प्रदर्शित करने के लिए, निम्नलिखित विधि का उपयोग करें।

iOS 10+, स्विफ्ट 3+ :

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .badge, .sound])
}

1
वाह, हर जगह मैंने पढ़ा लोगों ने कहा कि यह संभव नहीं था। मुझे खुशी है कि मुझे यह उत्तर मिला, यह ठीक वैसा ही काम करता है जैसा मुझे उम्मीद थी! जब ऐप चल रहा होता है, तो पुश नोटिफिकेशन अब बिल्कुल वैसा ही दिखाते हैं, जैसे वे ऐप बैकग्राउंड में होते हैं। धन्यवाद!
टोरे लासले

1
यह स्निपेट कहां जाता है? AppDelegate में, या कहीं और?
योव आर।

@YoavR। AppDelegate
chengsam

मैंने एक ही कोड का उपयोग किया है। लेकिन मुझे नहीं पता कि जब ऐप अग्रभूमि में था तब अधिसूचना क्यों प्रदर्शित नहीं हो रही है।
बोम्मिनाद प्रकाश एम

2
चेंगम आप इसे सही करना चाह सकते हैं: इसमें डालने की जरूरत नहीं है AppDelegate। इसे उस वस्तु के लिए रखना होगा जो किसी वस्तु के अनुरूप हो UNUserNotificationCenterDelegate। कहा जाता है कि ज्यादातर डेवलपर्स अपने AppDelegateअनुरूप बनाते हैं UNUserNotificationCenterDelegate। @YoavR।
हनी

16

संपादित करें:

IOS 10 में अब फोरग्राउंड अलर्ट संभव हैं! कृपया इसका उत्तर देखें

IOS 9 और उससे नीचे के लिए:

जब आपका ऐप खुला और अग्रभूमि में हो तो स्टॉक iOS सूचना को अलर्ट दिखाना संभव नहीं लगता है। Message.app एक निजी एपीआई का उपयोग करना चाहिए।

सिस्टम किसी भी अलर्ट को प्रदर्शित नहीं करता है, ऐप के आइकन को खराब कर देता है, या ऐप के पहले से ही सामने आने पर किसी भी आवाज़ को बजाता है। - UILocalNotification डॉक्स

UIApplicationDelegateतरीकों होगा अभी भी, कहा जा स्थानीय या दूरदराज के अधिसूचना के लिए प्रतिक्रिया करने के लिए अपने एप्लिकेशन की इजाजत दी:

application:didReceiveLocalNotification:
application:didReceiveRemoteNotification:

हालाँकि, स्टॉक मूल iOS अधिसूचना चेतावनी बैनर UI को नहीं दिखाया जाएगा क्योंकि यह Apple के Message.app में है, जिसे निजी API का उपयोग करना चाहिए।

आप जो सबसे अच्छा कर सकते हैं वह है अपने स्वयं के अलर्ट बैनर को रोल करना या मौजूदा ढांचे का उपयोग करना:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{    
    // Use a 3rd party toast alert framework to display a banner 
    [self toastAlertFromGithub]
}

मैंने इस व्यवहार के लिए यहां एक राडार खोला है: rdar://22313177


3
व्हाट्सएप और अन्य प्रसिद्ध एप्स कैसे करते हैं, फिर?
मचाडो

@tardoandre का स्क्रीनशॉट है? मुझे लगता है कि यह अपने स्वयं के विचारों में स्टॉक आईओएस अलर्ट की नकल करके है।
pkamb

2
toastAlertFromGithubयदि आप इस तीसरे पक्ष के पुस्तकालय का उपयोग करने का सुझाव दे रहे हैं तो आपको इसके लिए लिंक शामिल करना चाहिए !
केतन परमार

14

ऐप के खुलने के समय सूचनाएं दिखाने के लिए, हमें इसे मैन्युअल रूप से संभालना होगा। इसलिए मैं नीचे जो कर रहा हूं वह एक बार प्राप्त अधिसूचना को संभालना है।

AppDelegate.m में सभी नीचे जोड़ें

  1. सूचना देने के लिए कॉल करें
  2. एक दृश्य बनाएं, AppIcon, अधिसूचना संदेश जोड़ें और इसे एक एनीमेशन के रूप में दिखाएं
  3. यदि स्पर्श किया गया है या एनीमेशन के साथ 5 सेकंड में हटाने के लिए टच पहचानकर्ता जोड़ें।

मुझे पता है अगर यह एक ठीक समाधान है। मेरे लिए अच्छा काम किया है लेकिन अगर यह सही तरीका है तो मैं अनिश्चित हूं।

- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {


NSString *notifMessage = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

//Define notifView as UIView in the header file
[_notifView removeFromSuperview]; //If already existing

_notifView = [[UIView alloc] initWithFrame:CGRectMake(0, -70, self.window.frame.size.width, 80)];
[_notifView setBackgroundColor:[UIColor blackColor]];

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10,15,30,30)];
imageView.image = [UIImage imageNamed:@"AppLogo.png"];

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 15, self.window.frame.size.width - 100 , 30)];
myLabel.font = [UIFont fontWithName:@"Helvetica" size:10.0];
myLabel.text = notifMessage;

[myLabel setTextColor:[UIColor whiteColor]];
[myLabel setNumberOfLines:0];

[_notifView setAlpha:0.95];

//The Icon
[_notifView addSubview:imageView];

//The Text
[_notifView addSubview:myLabel];

//The View
[self.window addSubview:_notifView];

UITapGestureRecognizer *tapToDismissNotif = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                    action:@selector(dismissNotifFromScreen)];
tapToDismissNotif.numberOfTapsRequired = 1;
tapToDismissNotif.numberOfTouchesRequired = 1;

[_notifView addGestureRecognizer:tapToDismissNotif];


[UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{

    [_notifView setFrame:CGRectMake(0, 0, self.window.frame.size.width, 60)];

} completion:^(BOOL finished) {


}];


//Remove from top view after 5 seconds
[self performSelector:@selector(dismissNotifFromScreen) withObject:nil afterDelay:5.0];


return;


}

//If the user touches the view or to remove from view after 5 seconds
- (void)dismissNotifFromScreen{

[UIView animateWithDuration:1.0 delay:.1 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseIn animations:^{

    [_notifView setFrame:CGRectMake(0, -70, self.window.frame.size.width, 60)];

} completion:^(BOOL finished) {


}];


}

3
यह अपना अलर्ट बनाने के लिए एक अच्छा जवाब हो सकता है, लेकिन यह स्टॉक आईओएस अलर्ट नहीं दिखा रहा है जैसा कि स्क्रीनशॉट में दिखाया गया है।
पक्कम

नमस्ते, अपनी तरह के शब्दों के लिए धन्यवाद। हां, ऐसा नहीं लगेगा (यदि आप उपस्थिति के बारे में बात कर रहे हैं) जैसा कि छवि में ऊपर दिखाया गया है, आईओएस अधिसूचना है और कोड के माध्यम से कस्टम है। हम शायद दृश्य में दिखावट को दोहरा सकते हैं। मुझे लगता है कि व्हाट्सएप में बैकग्राउंड ब्लर आदि के साथ एक साफ-सुथरा दिखने वाला व्यक्ति है
हाफिज

1
किसी ने वोट दिया :(। यह सुनकर अच्छा लगेगा क्यों?! धन्यवाद!
हाफ़िज़

2
मैंने किया, इस उत्तर में कोड के रूप में (अच्छा हालांकि यह हो सकता है) वास्तव में पूछे गए सवाल का जवाब नहीं देता है: ऐप के अंदर एक स्टॉक आईओएस टोस्ट बैनर दिखा रहा है । एसओ पर अन्य प्रश्न हैं जहां यह उत्तर बहुत अच्छा होगा।
प्कम्ब

1
स्पष्ट करने के लिए धन्यवाद pkamb, समझ में आता है। मुझे लगता है कि मुझे "स्टॉक" शब्द याद नहीं है।
हाफिज

10

यहाँ एप्लिकेशन को पुश सूचना प्राप्त करने के लिए जब अग्रभूमि में या खुले चरण में, iOS 10 और स्विफ्ट 2.3 है

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
     completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}

यदि आपको अधिसूचना उपयोग कोड के userInfo तक पहुंचने की आवश्यकता है: notification.request.content.userInfo

userNotificationCenter(_:willPresent:withCompletionHandler:)यदि आप विशेषता को पेलोड करने के लिए जोड़ते हैं तो विधि को केवल तभी कहा जाता है content-available:1। अंतिम पेलोड कुछ इस तरह होना चाहिए:

{
     "aps":{
          "alert":"Testing.. (7)",
          "badge":1,"sound":"default"
     },
     "content-available":1
}

1
userNotificationCenter(_:willPresent:withCompletionHandler:)तब बुलाया जाएगा जब आपका ऐप अग्रभूमि में चल रहा हो। तो यह " सामग्री-उपलब्ध " के साथ कोई फर्क नहीं पड़ता है , जो " पृष्ठभूमि लाने " से संबंधित है ।
डॉनसॉन्ग

9
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.body = body;
content.userInfo = userInfo;
content.sound = [UNNotificationSound defaultSound];
[content setValue:@(YES) forKeyPath:@"shouldAlwaysAlertWhileAppIsForeground"];

UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"Notif" content:content trigger:nil];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    DLog(@"Error:%@", error);
}];

आईओएस 10 के लिए ऐप सक्रिय होने पर मैं पुश नोटिफिकेशन दिखा सकता हूं

  1. सर्वर से धक्का सूचना चुप होना चाहिए ।

  2. जब सर्वर से दूरस्थ सूचना प्राप्त होती है, तो आप एक स्थानीय अधिसूचना भेजते हैं और keyPath के लिए मान सेट करते हैं: shouldAlwaysAlertWhileAppIsForeground = True


स्विफ्ट 2 में - यह content.setValue("YES", forKeyPath: "shouldAlwaysAlertWhileAppIsForeground")सही है? ("हाँ" और सच नहीं)
योव आर।

सावधानी: यह आपके ऐप को iOS 12 के तहत क्रैश कर देगा। यहां चर्चा देखें: stackoverflow.com/questions/41373321/…
मैट बेयर्सन

5

आप अधिसूचना को स्वयं संभाल सकते हैं और कस्टम अलर्ट दिखा सकते हैं। Viber, Whatsapp और BisPhone जैसे ऐप इस दृष्टिकोण का उपयोग करते हैं।

3rd पार्टी कस्टम अलर्ट का एक उदाहरण CRToast है

जब आपका ऐप अग्रभूमि में हो, तो एक स्थानीय सूचना को शेड्यूल करने का प्रयास करें, और आप देखेंगे कि कोई आईओएस अलर्ट नहीं दिखाया गया है:

if (application.applicationState == UIApplicationStateActive ) {
     UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.userInfo = userInfo;
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.alertBody = message;
    localNotification.fireDate = [NSDate date];
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

धन्यवाद, लेकिन सिर्फ स्टॉक आईओएस अधिसूचना अलर्ट का उपयोग करके उत्तर की तलाश में।
pkamb

1
ठीक है, लेकिन मुझे लगता है कि आप इसे नहीं कर सकते, इस लिंक को भी देखें: stackoverflow.com/questions/14872088/…
Mo Farhand

6
@ मैं इस प्रश्न को विषय पर रखने का प्रयास कर रहा हूं: अग्रभूमि में स्टॉक आईओएस अलर्ट दिखाना। अन्य "सर्वश्रेष्ठ टोस्ट अलर्ट फ्रेमवर्क" के बहुत सारे प्रश्न। "नहीं, आप आईओएस अलर्ट को अग्रभूमि में नहीं दिखा सकते" का एक उत्तर पूरी तरह से स्वीकार्य होगा, और मैं उस उत्तर को तब तक स्वीकार करूंगा जब तक कि आईओएस के भविष्य के संस्करण में यह संभव न हो।
पक्कम

4

स्विफ्ट 3 संस्करण

जब एप्लिकेशन अग्रभूमि में होता है, तो यह एक अलर्ट दिखाता है।

if #available(iOS 10.0, *)
{
    // need to setup the global notification delegate somewhere when your app starts
    //
    UNUserNotificationCenter.current().delegate = applicationDelegate

    // to show a message
    //
    let content = UNMutableNotificationContent()
    content.body = "MESSAGE"

    let request = UNNotificationRequest(identifier: "fred", content: content, trigger: nil)
    UNUserNotificationCenter.current().add(request)
    {
       error in // called when message has been sent

       debugPrint("Error: \(error)")
    }
}

ApplicationDelegate का कार्यान्वयन UNUserNotificationCenterDelegate

@available(iOS 10.0, *)
public func userNotificationCenter(_ center : UNUserNotificationCenter, willPresent notification : UNNotification, withCompletionHandler completionHandler : @escaping (UNNotificationPresentationOptions) -> Void)
{
    completionHandler([.alert]) // only-always show the alert
}

सिर्फ यकीन करने के लिए ... क्या आपका मतलब है कि iOS 10 के बाद अब आप अग्रभूमि में अलर्ट / बैनर / साउंड भी दिखा सकते हैं जैसे आप पृष्ठभूमि में करते हैं?
हनी

मैं उपरोक्त कोडिंग भाग कहां रख सकता हूं? प्राप्त किया गया
user1960169

@ लेस्ली गॉडविन आईओएस 8.0 के लिए फोरग्राउंड में सूचनाएं दिखाने के लिए काम करेगा
दिलीप तिवारी

2

स्थानीय अधिसूचना दिखाने के लिए यह सबसे अच्छा विकल्प है। "BRYXBanner" https://cocoapods.org/pods/BRYXBwner राइट करने के लिए कम कोड की आवश्यकता है

let banner = Banner(title: "title", subtitle: "subtitle", image: UIImage(named: "addContact"), backgroundColor: UIColor(red:137.0/255.0, green:172.0/255.0, blue:2.0/255.0, alpha:1.000))
    banner.dismissesOnTap = true
    banner.show(duration: 1.0)

यह BRYXBannerढांचा स्टॉक आईओएस अधिसूचना बैनर का उपयोग नहीं करता है ।
pkamb

1

यदि आपका परिनियोजन लक्ष्य> = iOS10, नीचे की तरह UNUserNotification का उपयोग करें-

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    {
        // Change this to your preferred presentation option
        completionHandler([.alert, .sound])
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.