2014-06-17 13 views
17

ho ottenuto un app di test che sto scrivendo con Swift, voglio indirizzare iOS 7. Ma abilitare la notifica locale ho bisogno di aggiungererapida, scrivere il codice per iOS 7 e 8

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound 
    | UIUserNotificationType.Alert 
    | UIUserNotificationType.Badge, 
    categories: nil)) 

Ma questa chiamata è non disponibile in iOS 7, così ho aggiunto

var version:NSString = UIDevice.currentDevice().systemVersion as NSString; 
if version.doubleValue >= 8 { 
    // ios 8 code 
} 

iOS blocco 8 codice viene eseguito solo in sotto iOS 8 (testato), ma quando eseguire l'applicazione in iOS 7 ho ancora

dyld : Simbolo non trovato: _OBJC_CLASS _ $ _ UIUserNotificationSettings di riferimento da: /var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely prevista in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/AC73969D-1A4C-45AC-99CA-0B3982C1EE36/Timely.app/Timely

Penso che sia perché il binario contiene simbolo di api che non esiste in iOS 7, ma come faccio risolvo questo?

+0

Quando vedete questo errore? – jrturton

+0

all'avvio dell'app, ma ho questo blocco nell'app delegato, il codice funziona in iOS 8 e nessun errore rimuove il blocco in ios 7 –

+0

Si sta compilando questo con il giusto sdk, non è vero?Quindi, anche se avvii questa app su un dispositivo iOS7, dovresti compilarla con l'ultimo sdk di base ... – Alexander

risposta

2

Purtroppo, penso che si esegue in una limitazione della corrente, vedere questo

What is the Swift preprocessor equivalent to iOS version check comparison?

L'unico modo per aggirare il problema è quello di aggiungere un file Objective-C, e quindi utilizzare #if macro e fare due funzioni di supporto chiamate da Swift (una per iOS8 e una per iOS7). Mi aspetto che questo problema verrà risolto ad un certo punto.

+2

'# if non è adatto qui. la versione del sistema non è decisa in fase di compilazione. lo stesso binario può essere utilizzato su ios7 e ios8 –

+0

questo in realtà ha funzionato, controllando la versione del sistema UIDevice in objc, l'app non si lamentava del simbolo di unknow, peccato che fosse un tale hack –

+0

È solo per ora. Sono abbastanza sicuro che questo è un bug. Potresti voler archiviare un radar. –

1

In Beta6 sembra che alcuni (tutti?) Dei problemi di collegamento siano stati corretti. Le app collegate con UIAlertAction e UIAlertController non erano in grado di avviarsi su 7.1, ma ora verranno avviate. Non puoi ancora usarli in 7.1, ma puoi provare per la versione iOS e usare gli oggetti più vecchi.

0

mi sono imbattuto in un problema simile, quindi per chiunque abbia questo, qui è un'altra soluzione possibile:

Se andate al vostro destinazione> Generale> quadri collegati e biblioteche, si dovrebbe vedere UIKit (se non, aggiungere esso). Assicurarsi che si dice "opzionale" invece di "Required" accanto ad essa ...

0

Si tratta di una specie di hack sporco ma funziona per me:

if(UIApplication.sharedApplication().respondsToSelector("isRegisteredForRemoteNotifications")){ println("is iOS8") } 
0

C'è un very good answer da Prasath , ma è scritto in Objective-C ,
così mi hanno scritto qualcosa di simile in rapida:

(testato in Xc ode 6)

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    // ... 

    // Set Notification 

    if UIApplication.sharedApplication().respondsToSelector(Selector("registerUserNotificationSettings:")) { 

     // Notifications for iOS 8 
     let notificationSettings = UIUserNotificationSettings(forTypes: .Alert | .Sound, categories: nil) 
     UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings) 
    } 
    else { 
     // Notifications for iOS < 8 
     UIApplication.sharedApplication().registerForRemoteNotificationTypes(.Alert | .Sound) 
    } 

    // ... 

    return true 
} 

Speranza che aiuta

Problemi correlati