2017-07-12 4 views
2

J'ai une application iOS avec une extension Aujourd'hui. Nous sommes en test (TestFlight) en ce moment, et avons testé sur une dizaine d'appareils. Le widget associé s'affiche correctement sur tous ces périphériques, sauf un. Sur un appareil, le Widget affiche le message redoutable "Impossible de charger". Nous avons essayé de redémarrer l'appareil, la suppression/réinstallation de l'application, etc.Aujourd'hui Extension "Impossible de charger" sur des périphériques limités

En regardant le journal de l'appareil, j'ai vu cela comme la première référence gênante:

container: WGMajorListViewController> Unable to load widget view controller with service (com.mycompany.MyApp.myApp-Today-Extension): Couldn\M-b\M^@\M^Yt communicate with a helper application. 
container: WGMajorListViewController> No longer waiting on connection semaphore (<OS_dispatch_semaphore: 0x174c85410>) 
container: WGMajorListViewController> Severed remote view controller connection 
container: WGMajorListViewController> Widget disconnected unexpectedly 
container: WGMajorListViewController> Aborting active life cycle sequence: <WGWidgetLifeCycleSequence: 0x175035460; sequenceID: com.mycompany.MyApp.myApp-Today-Extension.WGMajorListViewController.7/11/17, 3:13:00 PM; currentState: WGWidgetLifeCycleSequenceStateDidRequestRemoteView> 
container: WGMajorListViewController> Remote view controller disconnected unexpectedly 
container: WGMajorListViewController> Attempting to reconnect to remote view controller 

code de l'extension ne fait aucune tentative pour ouvrir l'application hôte, donc l'erreur m'a étonné. Peut-être cela fait référence à une application d'aide interne (iOS)?

Les caractères d'échappement impair de cette première ligne figurent dans le journal. Après ces lignes, il essaie à nouveau, peut-être deux fois de plus, puis échoue. Finalement, je vois Can't request remote view controller that is blacklisted et l'appareil ne pas essayer à nouveau jusqu'à ce que le redémarrage:

mediaserverd(CoreMedia)[27] <Notice>: -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.mycompany.MyApp.myApp-Today-Extension with pid '257' is now Terminated. Background entitlement: NO 
mediaserverd(CoreMedia)[27] <Notice>: -CMSessionMgr- cmsmHandleApplicationStateChange: CMSession: Client com.mycompany.MyApp.myApp-Today-Extension with pid '259' is now Terminated. Background entitlement: NO 
symptomsd(SymptomEvaluator)[121] <Notice>: 257 com.mycompany.MyApp.myApp-Today-Extension: Terminated (most elevated: Terminated) 
symptomsd(SymptomEvaluator)[121] <Notice>: 259 com.mycompany.MyApp.myApp-Today-Extension: Terminated (most elevated: Terminated) 
symptomsd(SymptomEvaluator)[121] <Notice>: Entry, display name com.mycompany.MyApp.myApp-Today-Extension uuid (null) pid 257 isFront 0 
symptomsd(SymptomEvaluator)[121] <Notice>: Duplicate removal of display name com.mycompany.MyApp.myApp-Today-Extension 
symptomsd(SymptomEvaluator)[121] <Notice>: Entry, display name com.mycompany.MyApp.myApp-Today-Extension uuid (null) pid 259 isFront 0 
symptomsd(SymptomEvaluator)[121] <Notice>: Duplicate removal of display name com.mycompany.MyApp.myApp-Today-Extension 
container: WGMajorListViewController> End sequence '(null)' with reason: disappearance transition 
container: WGMajorListViewController> Can't end sequence as argument sequence ((null)) doesn't match active sequence ((null)), or there's no active sequence 
container: WGMajorListViewController> Begin sequence with reason: appearance transition 
container: WGMajorListViewController> Initiating new life cycle sequence: '<WGWidgetLifeCycleSequence: 0x17522b6e0; sequenceID: com.mycompany.MyApp.myApp-Today-Extension.WGMajorListViewController.7/11/17, 3:13:12 PM; currentState: WGWidgetLifeCycleSequenceStateQuiescent>' 
container: WGMajorListViewController> Connection requested with reason: 'appearance transition' 
container: WGMajorListViewController> Will request remote view controller 
container: WGMajorListViewController> Can't request remote view controller that is blacklisted 

Je ne vois aucune exploitation forestière à partir du code d'extension lui-même, ni aucun signe qu'il est en fait le lancement.

L'appareil en question est un iPhone 7 Plus, exécutant la version publique d'iOS 10.3.2. Le widget fonctionne bien sur tous les autres périphériques, dont beaucoup sont également 10.3.2. Aucun des autres n'est l'iPhone 7 Plus. Le widget fonctionne très bien dans le simulateur iPhone 7 Plus.

Le même périphérique exécute la version App Store du widget, bien que cette version soit construite avec iOS 9 avec Xcode 7. La nouvelle version utilise 10.3 comme base SDK, en utilisant Xcode 8.3.3.

Des pensées?

+0

J'ai trouvé un autre iPhone 7 Plus (iOS 10) et un iPhone 6 Plus (iOS 11 dev seed) - tous les deux ont connu le même problème. Plusieurs iPhones «plus petits» (6 etc.) exécutent bien le Widget. L'iPhone 7 Plus Simulator fonctionne également très bien. –

+0

J'aurais dû ajouter: Lorsque vous connectez le Xcode sur un appareil défaillant, le code ne s'exécute jamais. J'ai mis un point d'arrêt sur la première ligne de viewDidLoad du ViewController de Today Extension, et il ne frappe jamais. La seule note dans la console de Xcode est '' '' Le programme s'est terminé avec le code de sortie: 0'''''. –

+0

J'ai également reçu l'erreur "Impossible de demander le contrôleur de vue à distance qui est sur liste noire" sur un iPhone 6s (et en utilisant PaintCode) et cela m'a aidé à installer une autre version de mon application via TestFlight. Erreur. Cependant, cette fois, cela a fonctionné sans l'erreur. Je ne sais pas ce qui l'a causé, mais peut-être que cette information aide à comprendre le vrai problème à l'avenir. – Dominique

Répondre

2

Wow, c'était bizarre. La racine du problème était une mauvaise image, ou plus spécifiquement un mauvais code d'image (exporté de PaintCode). Le code semble provoquer des problèmes de "Storyboard" sur les périphériques "Plus", qui sont 3x. Le Storyboard n'a jamais été initialisé. J'utilise (et j'aime) PaintCode, et j'utilise son code d'image partout où je peux. Tout est un vecteur, utilisable à n'importe quelle taille. Bon produit. Quoi qu'il en soit, vous pouvez utiliser des images PaintCode dans Storyboards en attribuant le code PaintCode à un objet glissé dans le Storyboard. Ensuite, faites glisser le contrôle de cet objet vers un UIImageView sur le même Storyboard. Au moment de l'exécution, l'image est parfaitement dessinée, quelle que soit la résolution de l'appareil ou la taille de l'image.

Le Storyboard du widget possède trois images, toutes issues de PaintCode. L'une des trois images causait le problème. Si j'ai enlevé l'image, tout va bien. Rajoutez-le, le widget ne se lance jamais et affiche "Impossible de charger". L'image n'est pas complexe, proche de ce que je peux dire. Juste une icône de vecteur dessiné dans Sketch.

Je ne pouvais pas comprendre pourquoi cette image se comportait mal. J'ai joué avec les paramètres de PaintCode, exporté de plusieurs façons, pas de changement. J'ai donc utilisé Sketch pour créer un fichier PDF, et j'ai utilisé l'élément typique du catalogue d'actifs pour l'image.

En regardant à travers la console, je ne vois absolument aucun indice, même rétrospectivement. J'ai supposé que puisque le code Swift n'a jamais commencé, et que c'était seulement un problème de taille "Plus", il y a peut-être eu un problème de Storyboard. Mon intuition une fois que j'ai supprimé toutes les contraintes AutoLayout un fichier Storyboard corrompu. J'ai donc recréé par storyboard Widget, et les tests en cours de route. Il s'est cassé quand j'ai ajouté les images de PaintCode. Une fois que j'ai eu ceci, je suis retourné à mon Storyboard original, ai sorti l'image gênante, et le Widget s'est bien montré.

Je vais découper le projet et envoyer une copie aux gens de PixelCut, donc ils sont au courant. Si elles ont une solution de contournement, je posterai ici.

+0

Avez-vous trouvé une solution de contournement pour cela :)? –

+0

@JonathaANTOINE: Ma solution de contournement consistait à utiliser ici un actif statique standard (PDF dans un catalogue d'actifs), plutôt qu'un actif généré dynamiquement (PaintCode). Je n'avais pas vraiment besoin du dynamisme dans ce cas, donc je n'ai rien perdu en devenant statique. –

+0

Merci! J'ai le même problème que vous, mais j'ai besoin d'images dynamiques à distance :( –

3

Il y a une fois de plus quand cela se produira et si, dans la section Run Diagnostics de la cible de votre système, vous avez activé le désinfectant Thread Sanitizer/Undefined Behavior Sanitizer. Il semble ne pas aimer ces options.