2012-06-04 21 views
9

के बिना रिमोट कंट्रोल ईवेंट प्राप्त करें यहां कुछ पृष्ठभूमि जानकारी दी गई है, अन्यथा बोल्ड में प्रश्न के आगे आगे बढ़ें। मैं एक ऐप बना रहा हूं और मैं इसे रिमोट कंट्रोल/लॉक स्क्रीन इवेंट्स तक पहुंच बनाना चाहता हूं। मुश्किल हिस्सा यह है कि यह ऐप ऑडियो नहीं चलाता है, यह आस-पास के किसी अन्य डिवाइस के ऑडियो को नियंत्रित करता है। डिवाइस के बीच संचार एक समस्या नहीं है जब ऐप अग्रभूमि में है। जैसा कि मैंने अभी पाया है, एक ऐप रिमोट कंट्रोल के नियंत्रण को तब तक नहीं मानता जब तक कि उसने प्लेबैक ऑडियो सत्र के साथ ऑडियो नहीं खेला है, और आखिरी ऐसा था। यह एक समस्या प्रस्तुत करता है क्योंकि मैंने कहा, ऐप किसी अन्य डिवाइस के ऑडियो को नियंत्रित करता है और उसे स्वयं चलाने की आवश्यकता नहीं है।ऑडियो

मेरा पहला झुकाव है कि रिमोट कंट्रोल के नियंत्रण को मानने के लिए ऐप हर बार खोले जाने पर एक मूक क्लिप चलाए। तथ्य यह है कि मुझे ऐसा करना है, मुझे आश्चर्य है कि अगर मुझे ऐप्पल द्वारा ऐसा करने की इजाजत दी जा रही है या नकली ऑडियो क्लिप के साथ सिस्टम को मूर्ख बनाये बिना इसे हासिल करने का दूसरा तरीका है।

प्रश्न (एस): क्या एप्पल एक ऐप को स्वीकृति देगा जो किसी अन्य डिवाइस के ऑडियो को नियंत्रित करने के उद्देश्य से रिमोट/लॉक स्क्रीन नियंत्रणों के नियंत्रण को मानने के लिए एक मूक ऑडियो क्लिप चलाता है? ऑडियो सत्र के बिना रिमोट कंट्रोल के नियंत्रण को संभालने का कोई तरीका है?

पीएस मैं आईओएस 4.0 और ऊपर इस कार्यक्षमता को पसंद करना पसंद करूंगा।

पी.पी.एस. मैंने this similar question देखा है और यह मुझे दिमागी तूफान प्राप्त कर चुका है लेकिन प्रदान किया गया उत्तर मुझे जो जानने की आवश्यकता है, उसके लिए विशिष्ट नहीं है।

उत्तर

25

नोट: आईओएस 7.1 के रूप में, आप नीचे दिए गए जवाब के बजाय MPRemoteCommandCenter का उपयोग करना चाहिए।

आप MPRemoteCommand के विभिन्न सिस्टम-प्रदत्त उप-वर्ग बनाते हैं और उन्हें [MPRemoteCommandCenter sharedCommandCenter] के गुणों को असाइन करते हैं।

मैं बाकी के ऐतिहासिक संदर्भ के लिए इसे बाकी रख रहा हूं, लेकिन निम्नलिखित आईओएस संस्करणों पर काम करने की गारंटी नहीं है। वास्तव में, यह शायद नहीं हो सकता है।


आप निश्चित रूप से एक ऑडियो खिलाड़ी लेकिन जरूरी नहीं कि एक स्पष्ट सत्र जरूरत रिमोट कंट्रोल की घटनाओं का नियंत्रण लेने के है। (AVAudioSession ऑडियो चलाने वाले किसी ऐप के लिए निहित है।) मैंने इसकी पुष्टि करने के लिए इसके साथ एक सभ्य समय बिताया।

मैंने इंटरनेट पर बहुत भ्रम देखा है कि removeControlEventRecievedWithEvent: विधि और प्रतिक्रियाकर्ता श्रृंखला के विभिन्न दृष्टिकोण कहां स्थापित करें। मुझे पता है कि यह विधि आईओएस 6 और आईओएस 7 पर काम करती है। अन्य विधियों में नहीं है। ऐप प्रतिनिधि (जहां वे काम करते थे) में रिमोट कंट्रोल इवेंट्स को संभालने में अपना समय बर्बाद न करें या एक व्यू कंट्रोलर में जो आपके ऐप के जीवन चक्र के दौरान दूर जा सके।

मैंने यह दिखाने के लिए a demo project बनाया है।

  1. आप UIApplication का एक उपवर्ग बनाने की जरूरत:

    यहाँ क्या हो गया है की एक त्वरित प्रक्रिया इस प्रकार हैः। जब प्रलेखन UIResponder कहता है, तो इसका मतलब UIApplication है, क्योंकि आपकी एप्लिकेशन क्लास UIResponder का उप-वर्ग है। इस सबक्लास में, आप remoteControlReceivedWithEvent: और canBecomeFirstResponder विधियों को लागू करने जा रहे हैं। आप canBecomeFirstResponder से वापस लौटना चाहते हैं। रिमोट कंट्रोल विधि में, आप शायद अपने ऑडियो प्लेयर को सूचित करना चाहते हैं कि कुछ बदल गया है।

  2. आपको डिफ़ॉल्ट UIApplication की बजाय ऐप चलाने के लिए अपनी कस्टम क्लास का उपयोग करने के लिए आईओएस बताना होगा। हां, तो खुला main.m करते हैं और इसे बदलने के लिए:

    return UIApplicationMain(argc, argv, nil, NSStringFromClass([RCAppDel`egate class])); 
    

    इस तरह देखने के लिए:

    return UIApplicationMain(argc, argv, NSStringFromClass([RCApplication class]), NSStringFromClass([RCAppDelegate class])); 
    

    मेरे मामले RCApplication में अपने कस्टम क्लास का नाम है। इसके बजाय अपने उपclass के नाम का प्रयोग करें। उचित शीर्षलेख #import को न भूलें।

  3. वैकल्पिक: आपको एक ऑडियो सत्र कॉन्फ़िगर करना चाहिए। यह आवश्यक नहीं है, लेकिन यदि आप नहीं करते हैं, तो फोन म्यूट होने पर ऑडियो नहीं चलाएगा। मैं इसे डेमो ऐप के प्रतिनिधि में करता हूं, लेकिन जहां उचित हो, ऐसा करें।

  4. कुछ खेलें। जब तक आप नहीं करते हैं, रिमोट कंट्रोल आपके ऐप को अनदेखा कर देगा। मैंने अभी AVPlayer लिया है और इसे स्ट्रीमिंग साइट का यूआरएल दिया है जिसे मैं उठाने की उम्मीद करता हूं। यदि आपको लगता है कि यह विफल हो जाता है, तो अपना स्वयं का यूआरएल वहां रखें और अपने दिल की सामग्री पर इसके साथ खेलें।

इस उदाहरण में दूरस्थ घटनाओं को लॉग आउट करने के लिए वहां थोड़ा और कोड है, लेकिन यह सब जटिल नहीं है। मैं सिर्फ कुछ स्ट्रिंग स्थिरांक को परिभाषित करता हूं और पास करता हूं।

मुझे लगता है कि एक मूक लूपिंग एमपी 3 फ़ाइल आपके लक्ष्य की दिशा में काम करने में मदद करेगी।

+0

वाह, धन्यवाद! जब मैं घर जाता हूं तो मैं डेमो की जांच करूंगा। अब आप कहते हैं कि आईओएस 6 & 7; में कार्यप्रणाली यहां काम करती है क्या आप अपने सिर के शीर्ष से जानते हैं यदि यह 5.1 तक वापस जायेगा? – Squatch

+0

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि ब्रेकिंग परिवर्तन आईओएस 6 और 7 के बीच थे, इसलिए मुझे लगता है कि यह आईओएस 5 पर काम करता है। – Moshe

+1

मैंने अभी अपना आईपैड आईओएस 5 चलाया और डेमो चलाने की कोशिश की यह। सबसे पहले यह काम नहीं करेगा, लेकिन अगर आप ऑटोलायआउट और आईओएस 6+ स्थानीयकरण सुविधा बंद कर देते हैं (और अनलॉकलाइज्ड निब को वापस कॉपी करें) तो यह ज्यादातर काम करता है। मैं ज्यादातर कहता हूं क्योंकि प्ले/पॉज़ बटन के साथ कुछ गलत है। (मुझे लगता है कि यह सिर्फ एक घटना प्रकार है जिसे मैंने सही तरीके से नहीं लिया है। इसे चलाएं और आप देखेंगे कि मेरा क्या मतलब है।) – Moshe

1

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

NSDictionary *mediaInfo = @{MPMediaItemPropertyTitle: @"My Title", 
           MPMediaItemPropertyAlbumTitle: @"My Album Name", 
           MPMediaItemPropertyPlaybackDuration: [NSNumber numberWithFloat:0.30f]}; 
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo];