ऐप्पल म्यूज़िक उपयोगकर्ता के डिवाइस पर स्थापित है या नहीं, इसकी जांच कैसे करें?


9

मैं स्विफ्ट के साथ एक म्यूजिक ऐप बना रहा हूं। ऐप उपयोगकर्ताओं को अपने ऐप्पल म्यूज़िक ऐप के माध्यम से ऐप्पल म्यूज़िक सब्सक्रिप्शन के माध्यम से संगीत चलाने की सुविधा देता है। मैं यह जांचने में सक्षम हूं कि क्या उपयोगकर्ता के पास Apple म्यूज़िक सदस्यता है:

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}

हालाँकि: ऐसे परिदृश्य हैं जहाँ किसी कारण से, किसी के पास Apple Music सदस्यता होगी, लेकिन उसके डिवाइस पर Apple Music ऐप डाउनलोड नहीं होगा। यदि उपयोगकर्ता के पास सदस्यता है, लेकिन डिवाइस नहीं है, तो मैं अनिवार्य रूप से उस मामले का इलाज करना चाहता हूं जैसे कि उनके पास सबस्क्रिप्शन नहीं है, अर्थात हम Apple Music के माध्यम से संगीत नहीं चला सकते हैं।

इसलिए, मैं यह जांचने के तरीके खोजता हूं कि क्या एप्पल म्यूजिक उपयोगकर्ता के डिवाइस पर है। मुझे यह उत्तर मिलता है: जांचें कि क्या ऐप्पल म्यूज़िक के url स्कीम को खोजने के लिए इस संसाधन के साथ संयुक्त रूप से स्विफ्ट का उपयोग करके एक ऐप इंस्टॉल किया गया है और मैं यह जांच सकता हूं कि क्या उपयोगकर्ता के पास Apple म्यूज़िक सब्सक्रिप्शन और ऐप्पल म्यूज़िक ऐप दोनों उनके डिवाइस पर इंस्टॉल हैं:

SKCloudServiceController()requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user has Apple Music subscription and has the apple music app installed")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) || !UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user does not have subscription or doesn't have apple music installed")
    }

}

मुद्दा यह है कि मेरे डिवाइस से Apple म्यूजिक को डिलीट करने के बाद भी, पहला केस यानी प्रिंट्स user has Apple Music subscription and has the apple music app installedअभी भी कहा जा रहा है। मेरा मानना है कि क्योंकि जब बदल रहा है तो सही url योजना है "music://"करने के लिए "musi://"यानी एक है कि प्रिंट, दूसरे मामले, user does not have subscription or doesn't have apple music installedबुलाया जा रहा है।

जब URL(string: "music://")Apple म्यूजिक के माध्यम से खोलने की कोशिश की जाती है UIApplication.shared.open(URL(string: "music://")!), तो मैं निम्नलिखित अलर्ट से प्रभावित होता हूं:

यहां छवि विवरण दर्ज करें

तो क्यों डिवाइस कह रहा है कि मैं URL(string: "music://")Apple म्यूजिक डिलीट होने के बाद भी खोल सकता हूं ? क्या URLखोलने में सक्षम है, लेकिन परिणाम केवल उपरोक्त चेतावनी की प्रस्तुति है? क्या यह पुष्टि करने का सही तरीका है कि उपयोगकर्ता ने Apple संगीत को अपने डिवाइस पर स्थापित किया है? क्या उपयोगकर्ता को यह पुष्टि करने का एक तरीका भी है कि ऐप्पल म्यूजिक ने अपने डिवाइस पर इंस्टॉल किया है? यदि ऐप्पल उपयोगकर्ताओं को ऐप्पल म्यूज़िक ऐप को हटाने का विकल्प देता है, तो उन्हें डेवलपर्स को ऐप इंस्टॉल करने की जाँच करने की क्षमता भी देनी चाहिए।


मैंने कभी भी Apple म्यूजिक के साथ काम नहीं किया, लेकिन मेरा मानना ​​है कि Apple इस url स्कीम को एक खास तरीके से मानता है, क्योंकि यह उनका अपना प्रोडक्ट है, इस प्रकार जब भी आप उस url स्कीम को हिट करते हैं, तो वे उपयोगकर्ता को एप डाउनलोड करने का प्रस्ताव देते हैं, बजाय लौटने के असत्य। क्या आपने एक मान्य url योजना की पहचान करने की कोशिश की है जो वास्तव में Apple Music में एक वास्तविक एल्बम खोलेगी या वास्तविक गीत चलाएगी? पूर्व .: URL(string: "music://trackID=3214534")। हो सकता है कि यह स्पष्ट url योजना सामान्य तरीके से व्यवहार की जाएगी, लेकिन एक app restoreचेतावनी ट्रिगर नहीं ।
स्टार्स्की

मैं वैध एप्पल संगीत ट्रैक और कलाकार आईडी का उपयोग URL हैं, जो के साथ एप्पल संगीत डीप लिंक नहीं है के एक नंबर की कोशिश की है: URL(string: "music://trackId=1377813289")!, URL(string: "music://track=1377813289"), URL(string: "music://artist=562555")!, URL(string: "music://artistId=562555")!। जिस तरह से मैं गहरी लिंक करने में सक्षम हूं, वह कुछ URL(string: "https://music.apple.com/us/artist/562555")!इस तरह से है , लेकिन यह स्पष्ट रूप से मदद नहीं करता है क्योंकि यह HTTP है।
डेविड चोपिन

क्या आपने "संगीत: //" को सफेद कर दिया है। LSApplicationQueriesSchemes के साथ जानकारी प्राप्त करें। यदि नहीं, canOpenUrl को गलत माना जाता है।
कार्तिक रमेश

1
दुर्भाग्य से, मेरी जानकारी में इस योजना को श्वेतसूची में डालना व्यवहार को बिल्कुल भी नहीं बदलता है। मेरी समस्या यह है कि UIApplication.shared.canOpenURL(URL(string: "music://")!)हर समय लौट रहा है true, भले ही ऐप्पल म्यूज़िक ऐप हटा दिया गया हो। falseऐप के डिलीट होने पर मुझे इसे वापस करना होगा । यूआरएल योजना को श्वेतसूची में रखने से यह समस्या ठीक नहीं होगी (मैंने इसे आजमाया)।
डेविड चोपिन

क्या आपको इसके लिए एक बेहतर समाधान मिला?
मार्टिन मैलोस्टेक

जवाबों:


3

सबसे अच्छा समाधान मुझे मिल गया है, हालांकि मुझे उम्मीद है कि वहाँ कुछ बेहतर है, यह MPMusicPlayer.prepareToPlay(completionHandler:)देखने के लिए उपयोग करना है कि क्या कोई ट्रैक चलाने की कोशिश करते समय कोई त्रुटि है:

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
        MPMusicPlayerController.systemMusicPlayer.setQueue(with: ["1108845248"])
        systemMusicPlayer.prepareToPlay { (error) in
            if error != nil && error!.localizedDescription == "The operation couldn’t be completed. (MPCPlayerRequestErrorDomain error 1.)" {
                //It would appear that the user does not have the Apple Music App installed
            }
        }
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}

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

फिर भी, कुछ पूर्ण हैंडलर के बिना जांच करने में सक्षम होना बहुत अच्छा होगा क्योंकि यह बूलियन चेक को सशर्त बयानों (के माध्यम से if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }) में एकीकृत करने की अनुमति देगा ।


ठीक है, यह समाधान त्रुटियों के लिए जाँच करके काम करता है, लेकिन यह थोड़ा हैकरी है और एक पूर्ण हैंडलर में निम्नलिखित कोड को निष्पादित करने की आवश्यकता है। सरल जांच का एक तरीका होना बेहतर है, चाहे वह MusicKit ढांचे का हिस्सा हो या न हो, चाहे ऐप खुद ही स्थापित हो।
डेविड चोपिन

लेकिन हाँ यह जवाब एक वर्कअराउंड है जो ट्रैक खेलने की तैयारी करते समय त्रुटियों का उपयोग करता है। एक डेवलपर को यह जानने की आवश्यकता हो सकती है कि क्या ऐप्पल म्यूज़िक को बिना ट्रैक प्ले किए इंस्टॉल किया गया है।
डेविड चोपिन

1
क्या यह अभी भी सबसे अच्छा समाधान है जो आपने पाया है?
मार्टिन मैलोस्टेक

दुर्भाग्य से, हाँ
डेविड चोपिन

0

सौभाग्य से Apple आपको एक ऐसी विधि प्रदान करता है जो URL की योजना को संभालने के लिए डिवाइस पर कोई ऐप पंजीकृत नहीं होने पर, या यदि आपने अपनी Info.plist फ़ाइल में URL की योजना घोषित नहीं की है, तो यह गलत है; अन्यथा, सच है।

func canOpenURL(_ url: URL) -> Bool

मैं url योजनाओं को पोस्ट कर रहा हूं

Open = music://
Open = musics://
Open = audio-player-event://

उन लोगों को जोड़ें जिन्हें आप अपनी info.plist फ़ाइल में आगे उपयोग करेंगे।

अधिक जानकारी के लिए जाँच करने के लिए 'canOpenURL' का उपयोग करने के बाद Apple डॉक्स की जाँच करें

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl


Apple म्यूजिक की url स्कीम हमेशा trueसे गुजर रही है canOpenUrl। इस मुद्दे को मैं इस सवाल के साथ संबोधित करना चाहता हूं।
डेविड चोपिन

क्या आपने LSApplicationQueriesSchemes में 'संगीत ऐप' निर्दिष्ट किया है?
जीशान अहमद

उत्तर को फिर से जांचें मैंने इसे अपडेट किया है।
जीशान अहमद

कार्तिक रमेश की टिप्पणी के अनुसार, मैंने पहले व्यवहार में बदलाव के बिना URL योजनाओं को श्वेत-सूची में लाने की कोशिश की थी
डेविड चोपिन

0

एक संभावित समाधान निम्नलिखित कर रहा है: ऐप्पल म्यूज़िक एपीआई के माध्यम से एक डेवलपर टोकन सेट करें (जैसे कि आप ऐप्पल म्यूज़िक रीस्ट पॉइंट को क्वेरी कर सकते हैं)। निम्नलिखित StoreKit फ़ंक्शन ( प्रलेखन ) के लिए एक अनुरोध भेजें :

requestUserToken(forDeveloperToken:completionHandler:)

यदि आपका डेवलपर टोकन वैध है और लौटाया गया टोकन मूल्य अभी भी शून्य / शून्य है, तो डिवाइस उपयोगकर्ता Apple Music सेवा का ग्राहक नहीं है। HTTP स्थिति कोड के साथ उत्पन्न एक त्रुटि 401 (अनधिकृत) है। इसके बाद भी आपको एक त्रुटि की जाँच करने की आवश्यकता होती है, लेकिन किसी विशिष्ट ट्रैक को आज़माने और खेलने की आवश्यकता नहीं होती है (विशेष रूप से किसी कारण से अगर सामग्री ट्रैक के विरुद्ध आपकी जाँच अमान्य या परिवर्तित हो जाती है)।

डिवाइस में साइन इन किए गए खाते के मुद्दे के लिए और उसकी सदस्यता है, लेकिन डाउनलोड किया गया संगीत ऐप नहीं है: विशिष्ट सामग्री को चलाने का प्रयास करने पर त्रुटि को हैंडल करें और या तो उपयोगकर्ता को जानकारी प्रदान करें या ऐसी सामग्री का उपयोग करें जिसे विकल्प के रूप में Apple Music सदस्यता की आवश्यकता नहीं है जब कोई त्रुटि होती है।


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

0

हां, हम इन चरणों का पालन करके अधिकांश एप्लिकेशन की जांच कर सकते हैं:

  1. आप जिस विशेष एप्लिकेशन को खोलना चाहते हैं, उसके लिए डीप URL या URL स्कीम का उपयोग करें , उसे info.plist में जोड़ें
  2. उसी URL का उपयोग करें और इस विधि को कॉल करें
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

    UIApplication.shared.open(url!) { (result) in
       if result {
          // The URL was delivered successfully!
       }
    }

यह मुद्दा नहीं है, सवाल है कि UIApplication.shared.canOpenUrl(URL(string: “music://”)!)हमेशा वापस आ रहा है true, भले ही एप्लिकेशन इंस्टॉल नहीं है।
डेविड चोपिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.