จะตรวจสอบว่ามีการติดตั้ง Apple Music บนอุปกรณ์ของผู้ใช้ได้อย่างไร?


9

ฉันกำลังสร้างแอปเพลงด้วยความรวดเร็ว แอพช่วยให้ผู้ใช้เล่นเพลงผ่านการสมัครรับข้อมูล Apple Music ผ่านแอป Apple Music ของพวกเขา ฉันสามารถตรวจสอบว่าผู้ใช้มีการสมัครรับข้อมูล Apple Music ผ่านทาง:

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 ได้

ดังนั้นฉันไปค้นหาวิธีเพิ่มการตรวจสอบว่า Apple Music อยู่ในอุปกรณ์ของผู้ใช้หรือไม่ ผมพบคำตอบนี้: ตรวจสอบว่าแอปมีการติดตั้งโดยใช้สวิฟท์รวมกับทรัพยากรนี้สำหรับการหารูปแบบ URL แอปเปิ้ลเพลงและสรุปผมสามารถตรวจสอบว่าผู้ใช้มีทั้งการสมัครใช้บริการแอปเปิ้ลเพลงและแอปแอปเปิ้ลเพลงที่ติดตั้งบนอุปกรณ์ของพวกเขาผ่าน:

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 Music จากอุปกรณ์ของฉันกรณีแรกคือกรณีที่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 Music ที่ถูกลบผ่านUIApplication.shared.open(URL(string: "music://")!)ฉันถูกโจมตีด้วยการแจ้งเตือนต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

เหตุใดอุปกรณ์จึงบอกว่าฉันสามารถเปิดURL(string: "music://")ได้แม้หลังจาก Apple Music ถูกลบไปแล้ว? คือURLความสามารถในการเปิด แต่ผลที่ได้ก็คือการนำเสนอของการแจ้งเตือนดังกล่าวข้างต้นหรือไม่ นี่เป็นวิธีที่ถูกต้องในการยืนยันว่าผู้ใช้ติดตั้ง Apple Music บนอุปกรณ์หรือไม่ มีวิธียืนยันว่าผู้ใช้ติดตั้ง Apple Music บนอุปกรณ์ของพวกเขาหรือไม่? หาก Apple ให้ตัวเลือกแก่ผู้ใช้ในการลบแอพ Apple Music พวกเขาควรให้ความสามารถแก่นักพัฒนาในการตรวจสอบว่ามีการติดตั้งแอพหรือไม่


ฉันไม่เคยทำงานกับ Apple เพลงด้วยตัวเอง แต่ฉันเชื่อว่า Apple ปฏิบัติกับรูปแบบ URL นี้ในลักษณะพิเศษเนื่องจากเป็นผลิตภัณฑ์ของตัวเองดังนั้นเมื่อใดก็ตามที่คุณกดปุ่ม URL นั้นพวกเขาเสนอให้ผู้ใช้ดาวน์โหลดแอปแทนที่จะส่งคืน เท็จ คุณพยายามระบุรูปแบบ URL ที่ถูกต้องซึ่งจะเปิดอัลบั้มจริงใน Apple Music หรือเล่นเพลงจริงหรือไม่? อดีตURL(string: "music://trackID=3214534").: บางทีรูปแบบ URL ที่ชัดเจนนี้อาจได้รับการจัดการในลักษณะปกติ แต่จะไม่เปิดการapp restoreแจ้งเตือน
Starsky

ฉันได้พยายามจำนวนของ 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
David Chopin

มี whiteListed "music: //" ใน info.plist กับ LSApplicationQueriesSchemes ไหม ถ้าไม่สามารถ canOpenUrl ควรจะใช้ผิด
Karthick Ramesh

1
น่าเสียดายที่รายการที่อนุญาตพิเศษใน info.plist ของฉันไม่เปลี่ยนพฤติกรรมเลย ปัญหาของฉันคือสิ่งที่UIApplication.shared.canOpenURL(URL(string: "music://")!)ส่งคืนtrueตลอดเวลาแม้ว่าแอป Apple Music จะถูกลบ ฉันต้องการให้ส่งคืนfalseเมื่อลบแอพ การอนุญาต URL แบบแผนไม่สามารถแก้ไขปัญหานี้ได้ (ฉันลองใช้แล้ว)
David Chopin

คุณพบทางออกที่ดีกว่าสำหรับสิ่งนั้นหรือไม่?
Martin Mlostek

คำตอบ:


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 Music ภายในแอพของพวกเขาสำหรับสิ่งอื่น ๆ นอกเหนือจากการเล่นแทร็ก เมื่อใดก็ตามที่ฉันพบข้อผิดพลาดฉันจะสร้างการแจ้งเตือนบอกบุคคลที่มีการสมัครรับข้อมูล Apple Music แต่ไม่มีแอปที่ติดตั้ง

ยังคงเป็นการดีที่จะสามารถตรวจสอบได้โดยไม่ต้องใช้ตัวจัดการที่เสร็จสมบูรณ์เพราะจะอนุญาตให้การตรวจสอบบูลีนรวมเข้ากับคำสั่งแบบมีเงื่อนไข (ผ่านif capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something })


ดีวิธีนี้ทำงานโดยการตรวจสอบข้อผิดพลาด แต่มันเป็นบิตแฮ็คและต้องใช้รหัสต่อไปนี้ในการจัดการที่สมบูรณ์ มันจะดีกว่าถ้ามีวิธีตรวจสอบง่ายๆว่าเป็นส่วนหนึ่งของกรอบงาน MusicKit หรือไม่
David Chopin

แต่ใช่คำตอบนี้เป็นวิธีแก้ปัญหาที่ใช้ข้อผิดพลาดเมื่อเตรียมเล่นแทร็ก ผู้พัฒนาอาจจำเป็นต้องทราบว่ามีการติดตั้ง Apple Music โดยไม่เล่นเพลงหรือไม่
David Chopin

1
ยังคงเป็นทางออกที่ดีที่สุดที่คุณพบ?
Martin Mlostek

น่าเสียดายใช่แล้ว
David Chopin

0

โชคดีที่ Apple ให้วิธีการที่คืนค่าเท็จหากไม่มีแอปที่ติดตั้งบนอุปกรณ์ลงทะเบียนเพื่อจัดการกับรูปแบบของ URL หรือหากคุณไม่ได้ประกาศรูปแบบของ URL ในไฟล์ Info.plist ของคุณ มิฉะนั้นจริง

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


โครงการ URL แอปเปิ้ลเพลงอยู่เสมอกลับมาเมื่อผ่านมันผ่านtrue canOpenUrlนั่นเป็นปัญหาหลักที่ฉันต้องการตอบคำถามนี้
David Chopin

คุณระบุ 'แอพเพลง' ใน LSApplicationQueriesSchemes แล้วหรือยัง
Zeeshan Ahmed

ตรวจสอบคำตอบอีกครั้งฉันได้อัปเดตแล้ว
Zeeshan Ahmed

ตามความคิดเห็นของ Karthick Ramesh ฉันได้ลองใช้รายการ URL ที่อนุญาตพิเศษโดยไม่เปลี่ยนแปลงพฤติกรรม
David Chopin

0

วิธีแก้ปัญหาที่เป็นไปได้คือทำสิ่งต่อไปนี้: ตั้งค่าโทเค็นนักพัฒนาผ่าน Apple Music API (ใช้แล้วเพื่อให้คุณสามารถสอบถามปลายทาง Apple Music REST) ส่งคำขอไปยังฟังก์ชั่น StoreKit ( เอกสาร ) ต่อไปนี้:

requestUserToken(forDeveloperToken:completionHandler:)

หากโทเค็นนักพัฒนาของคุณถูกต้องและค่าโทเค็นผู้ใช้ที่ส่งคืนยังคงเป็นศูนย์ / null แสดงว่าผู้ใช้อุปกรณ์นั้นไม่ใช่สมาชิกของบริการ Apple Music ข้อผิดพลาดที่สร้างขึ้นด้วยรหัสสถานะ HTTP คือ 401 (ไม่ได้รับอนุญาต) สิ่งนี้ยังต้องการให้คุณตรวจสอบข้อผิดพลาด แต่ไม่จำเป็นต้องลองเล่นแทร็กที่เฉพาะเจาะจง (โดยเฉพาะอย่างยิ่งด้วยเหตุผลบางอย่างถ้ารหัสแทร็กเนื้อหาที่การตรวจสอบของคุณเทียบกับไม่ถูกต้องหรือเปลี่ยนแปลง)

สำหรับปัญหาของบัญชีที่ลงชื่อเข้าใช้อุปกรณ์และมีการสมัครสมาชิก แต่ไม่ใช่แอป Music ที่ดาวน์โหลด: จัดการข้อผิดพลาดเมื่อพยายามเล่นเนื้อหาที่เฉพาะเจาะจงและให้ข้อมูลกับผู้ใช้หรือใช้เนื้อหาที่ไม่ต้องการการสมัครสมาชิก Apple Music เป็นทางเลือก เมื่อเกิดข้อผิดพลาด


1
ใช่ฉันรู้วิธีตรวจสอบแล้วว่าผู้ใช้มีการสมัครรับข้อมูลหรือไม่ คำตอบของฉันให้ไว้ข้างต้นจัดการข้อผิดพลาดที่เกิดขึ้นจริง วิธีแก้ปัญหาที่ฉันกำลังมองหาคืออย่างเคร่งครัดว่าคุณสามารถบอกได้หรือไม่ว่าผู้ใช้มีแอพ Apple Music ติดตั้งไว้ในอุปกรณ์โดยไม่ต้องพยายามเล่นแทร็ก
David Chopin

0

ใช่เราสามารถตรวจสอบแอปพลิเคชันส่วนใหญ่ได้โดยทำตามขั้นตอนเหล่านี้:

  1. ใช้Deep URLหรือURL Schemeสำหรับแอปพลิเคชันเฉพาะที่คุณต้องการเปิดเพิ่มเข้าไปใน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แม้ว่าจะไม่ได้ติดตั้งแอป
David Chopin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.