Basé sur la Variant Response avec Ruby on Rails, et la gemme Browser pour différencier les appareils, en utilisant un design réactif et Turbolinks pour optimiser l’expérience utilisateur.
2.5 Individu?
- 1 Développeur full-stack (Moi ^_^)
- 1 Programmeur Ruby
- 0,5 Développeur front-end (gestionnaire de produit en partie)
Multi-plateformes?
- Ordinateur : navigateur, WeChat pour PC (la version PC de WeChat prend en charge la connexion WeChat)
- Tablette : navigateur, App (Android & iOS), WeChat
- Téléphone mobile : navigateur, App (Android & iOS), WeChat
Ces plateformes ne sont pas seulement utilisées pour l’accès mais doivent également prendre en charge les notifications push et les paiements :
- Canaux de notification : e-mail, SMS, WeChat, App Push
- Canaux de paiement : Alipay, WeChat Pay, UnionPay
Solutions
- Réduire autant que possible le volume de travail de développement (personnel limité)
- Tirer le meilleur parti des technologies RoR existantes
- Différencier les plateformes spécifiques en se basant sur les informations de l’agent utilisateur
Partir de RoR
- Utiliser Turbolinks pour optimiser l’expérience de chargement de la page Web
- Éviter d’utiliser des cadres MVC frontaux pour augmenter le volume de travail
- Utiliser un design réactif + une partie de la page Variant Response
- Ne pas créer de pages séparées pour chaque plateforme
Différencier les plateformes en se basant sur le navigateur
- La double signification du navigateur : le navigateur Web et la gemme browser
- Chaque plateforme a son propre agent utilisateur
- Étendre la gemme browser pour déterminer le type de plateforme actuelle
- Imprimer le type de plateforme dans la classe du corps pour permettre aux CSS d’ajuster les styles en conséquence
Étapes spécifiques
1. Utiliser et étendre la gemme browser pour déterminer le type de plateforme
Browser::NAMES[:smileback] = 'SmileBack' # Notre identifiant d'agent utilisateur personnalisé pour notre application
Browser::NAMES[:wechat] = 'Wechat'
Browser::NAMES[:desktop] = 'Desktop'
class Browser
module Meta
class Smileback < Base
def meta
'smileback' if browser.smileback?
end
end
class Wechat < Base
def meta
'wechat' if browser.wechat?
end
end
class Desktop < Base
def meta
'desktop' if browser.desktop?
end
end
end
module Consoles
def smileback?
!(ua =~ /smileback/i).nil?
end
def wechat?
!(ua =~ /MicroMessenger/i).nil?
end
def desktop?
!mobile? && !wechat? && !smileback?
end
end
end
2. Ajouter des informations de navigateur à la classe du corps HTML pour faciliter l’application du CSS
<body class="<%= Browser.new(ua: request.env['HTTP_USER_AGENT']).to_s %>"> <!-- La classe va afficher quelque chose comme chrome moderne mac webkit bureautique ou iphone ios mobile moderne autre safari5 webkit --!>
body { /* Style par défaut */ }
body.desktop { /* Style personnalisé pour les navigateurs de bureau */ }
body.mobile { /* Style personnalisé pour les navigateurs mobiles */ }
body.wechat { /* Style personnalisé pour WeChat */ }
3. Utiliser Variant Response pour les pages ayant des différences importantes pour créer deux ou plusieurs ensembles de vues
# application_controller.rb
before_action :detect_browser
private
def detect_browser
request.variant = :mobile if Browser.new(ua: request.env['HTTP_USER_AGENT']).mobile?
end
Les pages qui nécessitent une séparation, créez-les dans le format suivant :
app/views/pages/home.erb
app/views/pages/home.html+mobile.erb # Le format de nom de fichier est le format de réponse + nom de l'appareil
4. Ajouter un assistant pour les cas complexes, comme les paiements
# application_helper.rb
def browser
@_browser ||= Browser.new(ua: request.env['HTTP_USER_AGENT'])
end
/ Trop paresseux pour convertir en format erb, le suivant est en format slim
- if browser.smileback?
a.button href="jdxlsmileback://recharges/#{resource.id}/pay" Paiement Alipay
= link_to 'Paiement UnionPay', pay_recharge_path(resource, unionpay: true), 'data-no-turbolink' => true
- elsif browser.wechat?
- if current_user.weixin_id
= link_to 'Paiement WeChat', '#', id: 'wepay', class: 'button'
= link_to 'Paiement UnionPay', pay_recharge_path(resource, unionpay: true), 'data-no-turbolink' => true
- else
= link_to 'Paiement UnionPay', pay_recharge_path(resource, unionpay: true), 'data-no-turbolink' => true, class: 'button'
- elsif browser.mobile?
= link_to 'Paiement Alipay', pay_recharge_path(resource, alipay: true), class: 'button', 'data-no-turbolink' => true
= link_to 'Paiement UnionPay', pay_recharge_path(resource, unionpay: true), 'data-no-turbolink' => true
- else
= link_to 'Paiement Alipay', pay_recharge_path(resource, alipay: true), class: 'button', 'data-no-turbolink' => true
= link_to 'Paiement WeChat', pay_recharge_path(resource, scan_wepay: true)
= link_to 'Paiement UnionPay', pay_recharge_path(resource, unionpay: true), 'data-no-turbolink' => true
Autres expériences
- Pour l’application iOS, nous avons utilisé un shell avec WKWebView, qui a de meilleures performances que UIWebView mais aussi plus de restrictions. Vous pouvez Googler pour plus de détails.
- Pour l’application Android, nous avons utilisé le WebView par défaut et nous n’avons pas encore trouvé de meilleur remplaçant.
- Nous avons précédemment encapsulé nos propres canaux de paiement, mais nous avons maintenant découvert que Ping++ est également très bon, alors vous pouvez l’essayer.