找到最好的調整Spotify應用程序,免費享受Spotify Premium。在2024年下載iOS 18,iOS 17,iOS 16和iOS 15的Spotify ++,無需越獄。這些版本的Spotify ++與所有iPhone和iPad兼容。
iOS的Spotify ++是為iPhone,iPad和iPod Pro設備設計的Spotify的修改版本。這是最新的最新列表的最佳Spotify調整應用程序,以節省您的時間。
Spotify調整名稱 | 描述 |
---|---|
EeveeSpotify | 這項調整使Spotify認為您有高級訂閱,可以像Spotilife一樣免費聆聽。它還提供了其他功能,例如自定義歌詞。 |
Spotify++ | iOS的Spotify ++是針對iPad和iPhone等蘋果設備量身定制的流行音樂流媒體應用的修改版本。由第三方創作者開發的這款調整應用程序在沒有訂閱的情況下解鎖Spotify Premium功能,授予您無廣告的體驗和點播歌曲播放。 |
Spotube | Sponsube是iOS的音樂播放器,並獲得Spotify API支持。它是Spotify的替代方法,允許用戶在Spotify播放列表和庫中無限制地訪問其整個音樂集合。利用Spotify的強大數據API,Spotsube與YouTube,Piped.video或Jiosaavn等平台無縫集成,提供免費的,無廣告的音樂流。 |
Spotilife | Spotilife是Spotify iOS應用程序調整,可刪除廣告,刪除有限的跳過並幾乎解鎖其他所有優質功能。 |
從版本Spotify ++開始,該應用攔截了Spotify請求,以加載用戶數據,對其進行測試並實時修改參數。此方法高度穩定且有效,使用戶可以在Spotify ++設置中選擇動態的高級修補方法。
登錄後,Spotify獲取用戶數據並將其緩存在offline.bnk
文件中,位於/Library/Application Support/PersistentCache
目錄中。它以專有二進制格式存儲數據,包括每個值之前的長度字節和其他約定。諸如player-license
, financial-product
, streaming-rules
等的鑰匙決定了用戶的功能。
調整在初始化期間對此文件進行補丁;然後,假設用戶具有優質訪問權限,則將Spotify加載。但是,由於具有動態長度和各種字節的挑戰,可能不會發生實際修補。該調整從當前offline.bnk
文件中提取用戶名,並將其插入premiumblank.bnk
,一個包含所有預設溢價值的文件,替換offline.bnk
。如果Spotify重新加載用戶數據,則可以將用戶切換到免費計劃,從而觸髮帶有選項快速重新啟動應用程序並重置數據的選項。
此外,該調整將SPTFreeTierArtistHubRemoteURLResolver
中的trackRowsEnabled
設置為true
,從而使Spotify不僅可以在藝術家頁面上加載名稱。儘管此功能可以停止,但類似於Spotilife,但在最新的Spotify 8.9 ##版本中仍然有效。 (Spotilife還修改了offline.bnk
,但變化晦澀的字節對新版本沒有影響)。
要在Sideloaded應用中打開Spotify鏈接,請確保在設置> Safari>擴展程序中激活和訪問權限。
發現Spotify ++,這是針對iOS設備量身定制的Spotify的增強版。享受無訂閱,無廣告音樂和視頻流,高清播放等優質功能。在iPhone或iPad上輕鬆下載並安裝Spotify ++,而無需越獄。在其他任何人面前訪問最新的iOS版本和訪問獨家內容。
特徵 | 描述 |
---|---|
免費的優質功能 | 訪問Spotify Premium功能,無需訂閱,包括無廣告收聽。 |
無廣告體驗 | 在音樂和視頻流媒體會話期間消除沒有廣告的中斷。 |
高清播放 | 在完整的高清模式下享受清晰的音頻和視頻質量。 |
無限的跳過 | 跳過沒有限制的軌道,使您可以完全控制音樂播放列表。 |
導入音樂 | 輕鬆從設備的存儲中導入軌道到Spotify ++,從而擴展您的音樂庫。 |
免費下載 | 免費下載Spotify ++,並無需任何費用即可增強您的音樂體驗。 |
無需越獄 | 無需越獄就可以在iOS設備上安全地安裝Spotify ++。 |
iOS兼容性 | 與iOS 15和iOS 16兼容,可確保最新的Apple設備上的最佳性能。 |
沒有強迫洗牌 | 按照您喜歡的順序收聽您的音樂,沒有Spotify ++中的強迫shuffle功能。 |
下載收藏夾 | 通過在應用程序中下載來保存喜愛的曲目,以供離線聆聽。 |
首先,讓我們改進Song
模型,包括更多屬性,例如fileURL
播放音頻和用於跟踪當前播放狀態的isPlaying
:
struct Song {
let id : Int
let title : String
let artist : String
let album : String
let duration : Int // in seconds
let artwork : String // image name or URL
let fileURL : URL // URL to audio file
var isPlaying : Bool = false
}
接下來,讓我們更新我們的AudioPlayer
類,以使用AVPlayer
支持更高級的音頻播放功能:
import AVFoundation
class AudioPlayer {
static let shared = AudioPlayer ( )
private var player : AVPlayer ?
private var currentSong : Song ?
func play ( song : Song ) {
if currentSong ? . id == song . id {
// If the same song is already playing, toggle play/pause
if player ? . rate == 0 {
player ? . play ( )
} else {
player ? . pause ( )
}
} else {
// Play a new song
currentSong = song
player = AVPlayer ( url : song . fileURL )
player ? . play ( )
// Update the isPlaying state of the song
song . isPlaying = true
}
}
func pause ( ) {
player ? . pause ( )
if let song = currentSong {
song . isPlaying = false
}
}
func stop ( ) {
player ? . pause ( )
player = nil
if let song = currentSong {
song . isPlaying = false
}
}
func seek ( to time : TimeInterval ) {
player ? . seek ( to : CMTime ( seconds : time , preferredTimescale : 1 ) )
}
}
現在,讓我們增強我們的Swiftui觀點,以包括播放控件(Play/Pause,Seek Bar):
import SwiftUI
import AVFoundation
struct ContentView : View {
@ State private var songs : [ Song ] = [
Song ( id : 1 , title : " Song 1 " , artist : " Artist A " , album : " Album X " , duration : 180 , artwork : " song1 " , fileURL : Bundle . main . url ( forResource : " song1 " , withExtension : " mp3 " ) ! ) ,
Song ( id : 2 , title : " Song 2 " , artist : " Artist B " , album : " Album Y " , duration : 200 , artwork : " song2 " , fileURL : Bundle . main . url ( forResource : " song2 " , withExtension : " mp3 " ) ! )
// Add more songs as needed
]
@ State private var isPlaying = false
@ State private var currentSong : Song ?
@ State private var currentTime : TimeInterval = 0
@ State private var duration : TimeInterval = 0
var body : some View {
NavigationView {
VStack {
if let song = currentSong {
VStack {
Image ( song . artwork )
. resizable ( )
. aspectRatio ( contentMode : . fit )
. frame ( width : 200 , height : 200 )
Text ( song . title )
. font ( . title )
. padding ( . top , 8 )
Text ( song . artist )
. font ( . headline )
. foregroundColor ( . gray )
. padding ( . bottom , 8 )
Text ( timeToString ( time : currentTime ) + " / " + timeToString ( time : duration ) )
. font ( . caption )
. foregroundColor ( . gray )
. padding ( . bottom , 16 )
HStack {
Button ( action : {
self . previous ( )
} ) {
Image ( systemName : " backward.fill " )
. font ( . title )
. foregroundColor ( . blue )
}
. padding ( . trailing , 40 )
Button ( action : {
self . playPause ( )
} ) {
Image ( systemName : isPlaying ? " pause.circle.fill " : " play.circle.fill " )
. font ( . system ( size : 80 ) )
. foregroundColor ( . blue )
}
Button ( action : {
self . next ( )
} ) {
Image ( systemName : " forward.fill " )
. font ( . title )
. foregroundColor ( . blue )
}
. padding ( . leading , 40 )
}
. padding ( . top , 32 )
Slider ( value : Binding (
get : { self . currentTime } ,
set : { newValue in
self . seek ( to : newValue )
}
) , in : 0 ... duration )
. padding ( . horizontal )
}
. onAppear {
self . play ( song : song )
}
} else {
Text ( " Select a song to play " )
. font ( . title )
. foregroundColor ( . gray )
}
List ( songs , id : . id ) { song in
SongRow ( song : song , isSelected : song . id == self . currentSong ? . id )
. onTapGesture {
self . currentSong = song
}
}
. navigationBarTitle ( " Music Player " )
}
}
. onReceive ( Timer . publish ( every : 1 , on : . main , in : . common ) . autoconnect ( ) ) { _ in
if self . isPlaying , let player = AudioPlayer . shared . player {
self . currentTime = player . currentTime ( ) . seconds
self . duration = player . currentItem ? . duration . seconds ?? 0
}
}
}
private func play ( song : Song ) {
AudioPlayer . shared . play ( song : song )
isPlaying = true
}
private func playPause ( ) {
if let song = currentSong {
if isPlaying {
AudioPlayer . shared . pause ( )
} else {
play ( song : song )
}
isPlaying . toggle ( )
}
}
private func seek ( to time : TimeInterval ) {
AudioPlayer . shared . seek ( to : time )
}
private func next ( ) {
guard let currentIndex = songs . firstIndex ( where : { $0 . id == currentSong ? . id } ) , currentIndex < songs . count - 1 else {
return
}
currentSong = songs [ currentIndex + 1 ]
}
private func previous ( ) {
guard let currentIndex = songs . firstIndex ( where : { $0 . id == currentSong ? . id } ) , currentIndex > 0 else {
return
}
currentSong = songs [ currentIndex - 1 ]
}
private func timeToString ( time : TimeInterval ) -> String {
let minutes = Int ( time ) / 60
let seconds = Int ( time ) % 60
return String ( format : " %02d:%02d " , minutes , seconds )
}
}
struct SongRow : View {
let song : Song
let isSelected : Bool
var body : some View {
HStack {
Image ( song . artwork )
. resizable ( )
. aspectRatio ( contentMode : . fit )
. frame ( width : 50 , height : 50 )
VStack ( alignment : . leading ) {
Text ( song . title )
. font ( . headline )
Text ( song . artist )
. font ( . subheadline )
}
Spacer ( )
if isSelected {
Image ( systemName : " speaker.fill " )
. foregroundColor ( . blue )
. padding ( . trailing , 20 )
}
}
. padding ( 8 )
}
}
iPhone 16(即將到來的),iPhone 15 Pro Max,iPhone 15 Pro,iPhone 15 Plus,iPhone 15,iPhone 14 Pro Max,iPhone 14 Pro,iPhone 14 Plus,iPhone 14。
iPhone 13 Pro Max,iPhone 13 Pro,iPhone 13 Mini,iPhone 13,iPhone 12 Pro Max,iPhone 12 Pro,iPhone 12 Mini,iPhone 12,iPhone 11 Pro Max,iPhone 11 Pro,iPhone 11,iPhone XS Max,iPhone XS ,iPhone XR,iPhoneX。
Spotify for iOS 18:
Spotify for iOS 17:
iOS 17.6,iOS 17.5.1,iOS 17.5,iOS 17.4.1,iOS 17.4.1,iOS 17.4,iOS 17.3.1,iOS 17.3,iOS 17.3,iOS 17.2.1,iOS 17.2,iOS 17.2,ios 17.1.2,ios 17.1.2,ios 17.1.1,17.1.1,17.1.1,17.1.1, iOS 17.1,iOS 17.0.3,iOS 17.0.2,iOS 17.0.1,iOS 17。
Spotify for iOS 16:
iOS 16.7.5,iOS 16.7.4,iOS 16.7.3,iOS 16.7.2,iOS 16.7.2,iOS 16.7.1,iOS 16.7,iOS 16.7,iOS 16.6.1,ios 16.6,ios 16.6, ios 16.5.1,ios 16.5.1,ios 16.5,ios 16.5,ios 16.5,ios 16.5,ios 16.5,ios 16.5, 16.4.1,iOS 16.4,iOS 16.3.1,iOS 16.3,iOS 16.2,iOS 16.1.2 ,iOS 16.1.1,iOS 16.1,iOS 16.0.3,ios 16.0.3,ios 16.0.2,ios 16.0.2,ios 16.0.1,ios 16.0.1,ios 16。
Spotify for iOS 15:
iOS 15.8.2,iOS 15.8.1,iOS 15.8,iOS 15.7.9,iOS 15.7.9,iOS 15.7.8,iOS 15.7.7,iOS 15.7.7,iOS 15.7.6,ios 15.7.7.5 ,iOS 15.7.5,ios 15.7.4,iOS 15.7.4,iOS 15.7.4,ios 15.7.7 。 ,iOS 15.1.1,iOS 15.1,iOS 15.0.2,iOS 15.0.1,iOS 15。
Spotify for iOS 14:
iOS 14.8.1,iOS 14.8,iOS 14.7.1,iOS 14.7,iOS 14.7,iOS 14.6,iOS 14.5.1,iOS 14.5,iOS 14.5,ios 14.4.2,ios 14.4.1,ios 14.4.1 ,ios 14.4,ios 14.4,ios 14.3,ios 14.3,ios 14.2,ios 14.2,ios 14.2,iOS 14.2 .1,iOS 14.2,iOS 14.1,iOS 14.0.1,iOS 14。
Spotify for iOS 13:
iOS 13.7,iOS 13.6.1,iOS 13.6,iOS 13.5.1,iOS 13.5.1,iOS 13.5,iOS 13.4.1,iOS 13.4,iOS 13.4,iOS 13.3.1,iOS 13.3,ios 13.3,iOS 13.2.3,iOS 13.2.3,ios 13.2.2,13.2.2, iOS 13.2,iOS 13.1.3,iOS 13.1.2,iOS 13.1.1,iOS 13.1,iOS 13。
Spotify for iOS 12:
iOS 12.5.7,iOS 12.5.6,iOS 12.5.5,iOS 12.5.4,iOS 12.5.3,iOS 12.5.2,iOS 12.5.2,iOS 12.5.1,iOS 12.5,ios 12.4.9 ,ios 12.4.9,ios 12.4, .8,iOS 12.4.7,iOS 12.4.6,iOS 12.4.5,iOS 12.4.4,iOS 12.4.3,iOS 12.4.2,iOS 12.4.1,iOS 12.4, iOS 12.4,iOS 12.3.2,ios 12.3.1,iOS 12.3.1 ,iOS 12.3,iOS 12.2,iOS 12.1.4,iOS 12.1.3,iOS 12.1.2,iOS 12.1.1,iOS 12.1,iOS 12.0. 1,iOS 12.0.1,iOS 12。
該項目是開源的,並由麻省理工學院許可證管轄。歡迎您在許可協議中概述的條件下利用,修改和分配。
我們向個人和團隊的奉獻精神和努力使Spotify ++項目成為可能。他們的貢獻非常寶貴: