Làm cách nào để kiểm tra xem Apple Music có được cài đặt trên thiết bị của người dùng không?


9

Tôi đang làm một ứng dụng âm nhạc với swift. Ứng dụng cho phép người dùng phát nhạc thông qua thuê bao Apple Music thông qua ứng dụng Apple Music của họ. Tôi có thể kiểm tra xem người dùng có đăng ký Apple Music qua:

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")
    }

}

Tuy nhiên: có những trường hợp ai đó sẽ, vì một số lý do, có đăng ký Apple Music nhưng không tải xuống ứng dụng Apple Music trên thiết bị của họ. Nếu người dùng có đăng ký nhưng không phải thiết bị, về cơ bản tôi muốn xử lý trường hợp đó như thể họ hoàn toàn không có đăng ký, tức là chúng tôi không thể phát nhạc qua Apple Music.

Vì vậy, tôi đi tìm cách để thêm một kiểm tra xem Apple Music có trên thiết bị của người dùng không. Tôi tìm thấy câu trả lời này: Kiểm tra xem một ứng dụng được cài đặt bằng Swift kết hợp với tài nguyên này cho việc tìm kiếm chương trình url của Apple Music và kết luận tôi có thể kiểm tra nếu người dùng có cả một thuê bao của Apple Âm nhạc các ứng dụng của Apple Âm nhạc được cài đặt trên thiết bị của họ thông qua:

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")
    }

}

Vấn đề là, ngay cả sau khi xóa Apple Music khỏi thiết bị của tôi, trường hợp đầu tiên, tức là trường hợp in user has Apple Music subscription and has the apple music app installedvẫn đang được gọi. Tôi tin rằng tôi có sơ đồ url chính xác bởi vì khi thay đổi "music://"thành "musi://"trường hợp thứ hai, tức là trường hợp in user does not have subscription or doesn't have apple music installedđang được gọi.

Khi cố gắng mở URL(string: "music://")bằng Apple Music đã bị xóa qua UIApplication.shared.open(URL(string: "music://")!), tôi gặp phải cảnh báo sau:

nhập mô tả hình ảnh ở đây

Vậy tại sao thiết bị nói rằng tôi có thể mở URL(string: "music://")ngay cả sau khi Apple Music bị xóa? Là URLkhả năng được mở, nhưng kết quả chỉ đơn giản là sự trình bày của cảnh báo trên? Đây có phải là cách chính xác để xác nhận rằng người dùng đã cài đặt Apple Music trên thiết bị của họ không? Thậm chí có cách nào để xác nhận người dùng đã cài đặt Apple Music trên thiết bị của họ không? Nếu Apple cung cấp cho người dùng tùy chọn xóa ứng dụng Apple Music, họ cũng nên cung cấp cho nhà phát triển khả năng kiểm tra xem ứng dụng đã được cài đặt chưa.


Tôi chưa bao giờ làm việc với âm nhạc Apple, nhưng tôi tin rằng Apple xử lý lược đồ url này theo cách đặc biệt, vì đó là sản phẩm của riêng họ, do đó, bất cứ khi nào bạn nhấn vào lược đồ url đó, họ nên đề xuất với người dùng để tải xuống ứng dụng, thay vì quay lại sai. Bạn đã cố gắng xác định một lược đồ url hợp lệ thực sự sẽ mở một album thực sự trong Apple Music hoặc phát một bài hát thực tế? Ex .: URL(string: "music://trackID=3214534"). Có thể lược đồ url rõ ràng này sẽ được xử lý theo cách thông thường, nhưng không kích hoạt app restorecảnh báo.
Starsky

Tôi đã thử một số URL sử dụng Apple Âm nhạc ca khúc và nghệ sĩ ID hợp lệ mà không có vẻ liên kết sâu với Apple âm nhạc: URL(string: "music://trackId=1377813289")!, URL(string: "music://track=1377813289"), URL(string: "music://artist=562555")!, URL(string: "music://artistId=562555")!. Cách duy nhất tôi có thể liên kết sâu là thông qua một cái gì đó như URL(string: "https://music.apple.com/us/artist/562555")!, nhưng điều này rõ ràng không giúp ích gì vì đây là HTTP.
David Chopin

bạn đã liệt kê "âm nhạc: //" trong info.plist với LSApplicationQueriesScheme?. Nếu không, canOpenUrl được cho là misBehave.
Karthick Ramesh

1
Thật không may, danh sách trắng lược đồ trong thông tin của tôi.plist không thay đổi hành vi. Vấn đề của tôi là luôn UIApplication.shared.canOpenURL(URL(string: "music://")!)luôn quay trở lại true, ngay cả khi ứng dụng Apple Music bị xóa. Tôi cần nó để trở lại falsekhi ứng dụng bị xóa. Làm trắng sơ đồ url sẽ không khắc phục vấn đề này (tôi đã thử).
David Chopin

bạn đã tìm thấy một giải pháp tốt hơn cho điều đó?
Martin Mlostek

Câu trả lời:


3

Giải pháp tốt nhất tôi có, mặc dù tôi hy vọng có một thứ tốt hơn ngoài đó, là sử dụng MPMusicPlayer.prepareToPlay(completionHandler:)để kiểm tra xem có lỗi khi thử phát một bản nhạc hay không:

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")
    }

}

Tôi không chắc làm thế nào điều này có thể áp dụng cho bất kỳ ai sử dụng Apple Music trong ứng dụng của họ cho bất kỳ điều gì ngoài việc phát các bản nhạc, nhưng điều này dường như chắc chắn hoạt động như một kiểm tra khi bạn chuẩn bị chơi séc. Bất cứ khi nào tôi gặp phải lỗi đó, tôi chỉ cần tạo một cảnh báo cho cá nhân họ biết có đăng ký Apple Music nhưng không cài đặt ứng dụng.

Tuy nhiên, sẽ rất tuyệt nếu có thể kiểm tra mà không cần một số trình xử lý hoàn thành vì điều đó sẽ cho phép kiểm tra boolean được tích hợp vào các câu lệnh có điều kiện (thông qua if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something }).


Chà, giải pháp này hoạt động bằng cách kiểm tra lỗi, nhưng nó hơi rắc rối và yêu cầu thực thi mã theo trình xử lý hoàn thành. Tốt hơn là nên có một cách để kiểm tra đơn giản, cho dù đó có phải là một phần của khung MusicKit hay không, liệu ứng dụng có được cài đặt hay không.
David Chopin

Nhưng có, câu trả lời này là một cách giải quyết sử dụng các lỗi khi chuẩn bị phát một bản nhạc. Một nhà phát triển có thể cần biết nếu Apple Music được cài đặt mà không phát một bản nhạc.
David Chopin

1
Đây vẫn là giải pháp tốt nhất bạn tìm thấy?
Martin Mlostek

Thật không may, có
David Chopin

0

May mắn thay, Apple cung cấp cho bạn một phương thức trả về false nếu không có ứng dụng nào được cài đặt trên thiết bị được đăng ký để xử lý lược đồ của URL hoặc nếu bạn chưa khai báo lược đồ của URL trong tệp Info.plist của bạn; mặt khác, đúng

func canOpenURL(_ url: URL) -> Bool

Theo dõi tôi đang đăng các chương trình url

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

Thêm những cái bạn sẽ tiếp tục sử dụng vào tập tin info.plist của bạn.

Sau này, sử dụng 'canOpenURL' để kiểm tra thêm thông tin kiểm tra tài liệu của Apple

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


Lược đồ url của Apple Music luôn quay trở lại truekhi chuyển qua canOpenUrl. Đó là vấn đề chính tôi muốn giải quyết với câu hỏi này.
David Chopin

Bạn đã chỉ định 'Ứng dụng âm nhạc' trong LSApplicationQueriesScheme chưa?
Zeeshan Ahmed

kiểm tra câu trả lời một lần nữa tôi đã cập nhật nó
Zeeshan Ahmed

Theo nhận xét của Karthick Ramesh, trước đây tôi đã thử các lược đồ URL trong danh sách trắng mà không thay đổi hành vi
David Chopin

0

Một giải pháp khả thi đang thực hiện như sau: Thiết lập mã thông báo dành cho nhà phát triển thông qua API Apple Music (Được sử dụng để bạn có thể truy vấn các điểm cuối Apple Music REST). Gửi yêu cầu đến chức năng StoreKit sau đây ( Tài liệu ):

requestUserToken(forDeveloperToken:completionHandler:)

Nếu mã thông báo dành cho nhà phát triển của bạn hợp lệ và giá trị mã thông báo người dùng được trả về vẫn là 0 / null thì người dùng thiết bị không phải là thuê bao của dịch vụ Apple Music. Một lỗi được tạo với mã trạng thái HTTP là 401 (Không được phép). Điều này vẫn yêu cầu bạn kiểm tra lỗi tuy nhiên không yêu cầu thử và phát một bản nhạc cụ thể (Đặc biệt vì một số lý do nếu id bài hát nội dung mà việc kiểm tra của bạn trở nên không hợp lệ hoặc thay đổi).

Đối với sự cố tài khoản đã đăng nhập vào thiết bị và có đăng ký nhưng không tải xuống ứng dụng Music: Xử lý lỗi khi cố gắng phát nội dung cụ thể và cung cấp thông tin cho người dùng hoặc sử dụng nội dung không yêu cầu đăng ký Apple Music thay thế khi xảy ra lỗi


1
Vâng, vì vậy tôi đã biết cách kiểm tra xem người dùng có đăng ký hay không . Câu trả lời của tôi cung cấp ở trên giải quyết việc xử lý lỗi thực tế. Giải pháp Tôi đang tìm kiếm là đúng cho dù bạn có thể nói nếu người dùng có ứng dụng của Apple Âm nhạc cài đặt vào thiết bị mà không cần phải cố gắng để chơi một ca khúc.
David Chopin

0

Có, chúng tôi có thể kiểm tra hầu hết các Ứng dụng bằng cách thực hiện theo các bước sau:

  1. Sử dụng các URL sâu hoặc URL Scheme cho ứng dụng đặc biệt mà bạn muốn mở, thêm rằng vào info.plist
  2. Sử dụng cùng một URL và gọi phương thức này
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

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

Đây không phải là vấn đề, câu hỏi được nêu UIApplication.shared.canOpenUrl(URL(string: “music://”)!)luôn luôn trả về true, ngay cả khi ứng dụng chưa được cài đặt.
David Chopin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.