Utiliser le moteur de Safari

liquidliquid Membre
11:37 modifié dans API AppKit #1
Voila, je commence à  m'intéresser au développement, sous mac
(ça tombe mal cocoa-x.com est HS de puis un bout de temps :) )
Bref, j'explore un peu à  droite et à  gauche pour avoir un peu un idée de ce qui est faisable.
Je me demander donc, si , il n'était pas possible, par le biais d'api(s), d'utiliser le moteur de rendu de safari en vue, de récupérer une image/une photo d'un site web

merci d'avance de vos réponses, remarques, idées.

Réponses

  • NoNo Membre
    11:37 modifié #2
    Oui c'est possible.
    L'api du webkit (le moteur de rendu de safari) est entièrement disponible pour les programmes via les webviews.
  • NoNo Membre
    11:37 modifié #3
    dans 1220896729:

    (ça tombe mal cocoa-x.com est HS de puis un bout de temps :) )

    Un des membres de OC, Ceroce, nous a raconté une intéressante histoire au sujet de cocoa-x.com sur son blog...
  • NseaProtectorNseaProtector Membre
    11:37 modifié #4
    Tu trouveras même des exemples dans ton dossier developer/examples/webkit
    Regarde minibrowser par exemple.
    Sinon il y'a Shiira, un navigateur basé sur le webkit ou le code source est disponible:
    http://shiira.jp/download/en.php

  • liquidliquid Membre
    11:37 modifié #5
    Ooooh!!!!  <3 (pardon l'emballement <img src="http://www.boxavenue.fr/image/produits/small/carton_verres.jpg" alt="carton_verres.jpg" class="bbcode_img" />)
    merci à  tous trois pour cette réponse Archi Rapide
    Je tacherai de me documenter sur ces sujets...
    A bientôt (quasiment sûr) pour de nouvelle questions
  • Paisible.frPaisible.fr Membre
    11:37 modifié #6
    dans 1220896999:

    dans 1220896729:

    (ça tombe mal cocoa-x.com est HS de puis un bout de temps :) )

    Un des membres de OC, Ceroce, nous a raconté une intéressante histoire au sujet de cocoa-x.com sur son blog...

    Ah où ça ?
    J'ai parcouru le blog de ceroce mais j'ai rien vu, pas la moindre allusion.
    J'ai mal cherché ? J'ai mal lu entre les lignes ?

    Une URL pour éclairer ma lanterne ?
  • NoNo Membre
    11:37 modifié #7
    dans 1220899760:

    Ah où ça ?
    J'ai parcouru le blog de ceroce mais j'ai rien vu, pas la moindre allusion.
    J'ai mal cherché ? J'ai mal lu entre les lignes ?
    Une URL pour éclairer ma lanterne ?

    Consulte le profil de Ceroce.
    Dans sa signature, il y a 2 adresses : choisis la seconde (celle de blogspot).
    Enfin, lit le billet "L'arrivée de Mac OS X" du 5 septembre.
  • Paisible.frPaisible.fr Membre
    11:37 modifié #8
    dans 1220900500:

    dans 1220899760:

    Ah où ça ?
    J'ai parcouru le blog de ceroce mais j'ai rien vu, pas la moindre allusion.
    J'ai mal cherché ? J'ai mal lu entre les lignes ?
    Une URL pour éclairer ma lanterne ?

    Consulte le profil de Ceroce.
    Dans sa signature, il y a 2 adresses : choisis la seconde (celle de blogspot).
    Enfin, lit le billet "L'arrivée de Mac OS X" du 5 septembre.


    Ok je comprends mieux maintenant ;)

    Merci
  • AntilogAntilog Membre
    11:37 modifié #9
    Y'a ça: BYOB: Build Your Own Browser
    http://www.macdevcenter.com/pub/a/mac/2004/01/23/webkit.html

    Ca date un peu, mais le principe est là :
    un browser avec 0 ligne de code
  • CéroceCéroce Membre, Modérateur
    11:37 modifié #10
    dans 1220896999:

    Un des membres de OC, Ceroce, nous a raconté une intéressante histoire au sujet de cocoa-x.com sur son blog...

    Quoi, y'a des gens qui lisent mon blog ?!  :o
  • Paisible.frPaisible.fr Membre
    11:37 modifié #11
    dans 1220909826:

    Y'a ça: BYOB: Build Your Own Browser
    http://www.macdevcenter.com/pub/a/mac/2004/01/23/webkit.html

    Ca date un peu, mais le principe est là :
    un browser avec 0 ligne de code


    Moi j'aime bien le navigateur minute comme tutorial de l'ami Sylvain Gamel.

    Sylvain si tu me lis  :o
  • liquidliquid Membre
    11:37 modifié #12
    dans 1220937191:

    Moi j'aime bien le navigateur minute comme tutorial de l'ami Sylvain Gamel.

    Sylvain si tu me lis  :o


    Je vais essayer de faire ce tuto; en revanche je risque fortement de revenir à  la charge .... j'ai du mal avec les (tuto avec les) anciennes version Xcode/interfaceBuilder (oui  ... il y a un début à  tout)

    [size=5pt]encore merci pour votre aide chaleureuse[/size]
  • liquidliquid Membre
    11:37 modifié #13
    Premier petit probleme ... sur le tuto "http://sgamel.free.fr/spip.php?article79";

    Pour vous situer "ou" j'en suis je viens de finir la premiere video
    j'attaque donc la "seconde" partie

    La chose qui me "perturbe" et de n'avoir pas la meme interface
    (en haut Xcode 3 en dessous la vidéo)

    mainmenukk2.png

    Enfin ce n'est même pas une question d'interface c'est carrément le contenu qui est différent
    d'apres ce que j'ai pu lire à  droite et à  gauche sur internet , on ne peu plus faire cela directement d'interface builder il faut utiliser Xcode ... ???
    Bref , je suis dans le flou, que dois-je faire pour creer le controller "SafariExpressController" ?

    Merci d'avance de votre aide ...
  • 11:37 modifié #14
    1) Repasse à  la première "View Mode" dans IB.
    2) Crées un nouveau fichier avec XCode (Objective-C Class)
    3) Nomme le comme il se doit (SafariExpressControl)
    4) Retourne sur IB
    5) Cherche "le cube bleu" dans la bibliothèque d'objets
    6) Dépose-le avec les différents éléments de ton mainmenu.nib
    7) Clique dessus une fois qu'il apparaà®t
    8) Va dans l'onglet "i" dans l'inspecteur de IB (avant dernier onglet)
    9) Tu vois un champs de texte pour "Class name". Tape le début de ta classe (SafariExpressControl) et une fois que le nom complet apparait, appuie bien sur entrée pour valider.

    Et normalement ta belle classe se trouve maintenant instancié ds ton mainmenu.nib
  • liquidliquid Membre
    11:37 modifié #15
    Sa y est ... j'ai fini le tuto (merci à  toi Eaglelouk)
    ceci étant j'ai encore une question ,
    si j'ai bien compris
    Le  ".m" est pour les actions
    et le .h pour ...   :o euh les outlets .. ???
  • 11:37 modifié #16
    dans 1221323970:

    Sa y est ... j'ai fini le tuto (merci à  toi Eaglelouk)
    ceci étant j'ai encore une question ,
    si j'ai bien compris
    Le  ".m" est pour les actions
    et le .h pour ...   :o euh les outlets .. ???


    En gros ouaip :D Mais le .h sert plus que ça. Les outlets sont des variables objet (d'ailleurs j'appelle ça objet tout court), on peut aussi y définir des variables comme "int x;". Et le .h sert à  aussi à  déclarer des méthodes & actions persos.
  • AliGatorAliGator Membre, Modérateur
    11:37 modifié #17
    En fait pour être encore plus précis (désolé Louka j'ai pas résisté :D) :

    - Le ".h" c'est ce qu'on appelle l'interface de ta classe. Pas au sens "interface graphique" bien sûr, mais au sens que ça montre juste les possibilités de ta classe. Dedans tu déclares donc les variables que contient ta classe, et tu listes juste les méthodes qu'elle contient.
    L'avantage c'est qu'ainsi n'importe qui ne connaissant pas ta classe mais voulant l'utiliser (car après tout une clase est aussi souvent faite pour être réutilisée) savent quelles méhodes/fonctions/actions sont disponibles et peuvent être appelées

    - Le ".m" c'est ce que l'on appelle l'implémentation de ta classe. En gros ça contient l'intelligence même de ta classe : dedans tu mets le code de tes méthodes (et de tes IBActions qui sont des méthodes au statut un peu particulier mais des méthodes quand même) en détail.

    L'idée c'est que si on a besoin d'utiliser une classe, on a pas besoin de savoir comment elle est codée sous le capot, de savoir quel est le code qui est mis dans la méthode machin, du moment qu'elle fait ce qu'elle dit, la manière de le faire importe peu. Donc il suffit de regarder le .h et on a directement un résumé des possibilités de la classe sans éplucher le .m


    Au final, dans le .h, tu mets les variables d'instance (variables attachées à  ta classe), y compris la déclaration des IBOutlets, mais aussi la signature de tes méthodes (juste son nom et liste des arguments, sans le corps de la méthode avec son code), y compris celle de tes IBActions.
    Dans le .m, le code de tes méthodes et IBActions.
  • liquidliquid Membre
    11:37 modifié #18
    encore une fois ... merci à  vous ;)

    Actuellement je cherche à  transformer mon navigateur en ceci:
    capturaxq0.png
    A Droite La capture , à  gauche  la page "html"
    (voir aussi
    http://vodpod.com/watch/638749-desaurl-0-1 [lien 1]
    http://lists.apple.com/archives/cocoa-dev/2008/Apr/msg00877.html [lien 2]
    )
    l'auteur du logiciel que je "copie" à  utiliser, d'apres le lien 2 le code suivant:
    &nbsp; &nbsp;NSRect&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; frame = [theView frame];<br />&nbsp; &nbsp;NSBitmapImageRep&nbsp; &nbsp; *rep = [theView&nbsp; <br />bitmapImageRepForCachingDisplayInRect:frame];<br />&nbsp; &nbsp;[theView cacheDisplayInRect:frame toBitmapImageRep:rep];<br />&nbsp; &nbsp;NSData&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *data = [rep representationUsingType:NSTIFFFileType&nbsp; <br />properties:nil];<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;NSImage *image = [[NSImage alloc] initWithSize:[rep size]];<br />&nbsp; &nbsp;[image addRepresentation:rep];<br />&nbsp; &nbsp;[but setImage:image];<br />
    


    La premiere interrogation que je me pose : quel est , selon vous, l'object que je dois utiliser (dans interface builder pour "representer la partie droite")

    j'ai essayer en vain de bidouiller quelques trucs avec un
    NSimageView
    et  avec un
    NSView : custom view

    PS : 0078.gif
  • 11:37 modifié #19
    Avec une NSImageView tout simplement.
  • liquidliquid Membre
    11:37 modifié #20
    Oki je confirme ça marche...
    tout doucement j'avance ... ce soir j'ai obtenu un morceau de screenshot de google  :adios!:
    ( A bientôt pour de nouvelles aventures nouveaux problèmes )
  • clampinclampin Membre
    11:37 modifié #21
    Bonjour,

    J'ai fait le tutoriel et j'ai un petit warning

    <br />- (void) webView: (WebView *) sender <br />&nbsp; &nbsp; &nbsp; &nbsp; didStartProvisionalLoadForFrame: (WebFrame *) frame<br />{<br />	<br />	[loadProgress startAnimation: self];<br />	if ( frame == [sender mainFrame] ) {<br />		NSString *url = [[[[frame provisionalDataSource] request] URL] absoluteString];<br />		[urlInput setStringValue:url];<br />	}<br />}<br />
    


    j'ai le warning suivant...

    safariExpressController.m:18: warning: no '-provisionalDataSource' method found

    Je suis sous 10.4.11.....

    Pourtant lorsque je le compile... tout a l'air de bien se dérouler....
  • 11:37 modifié #22
    En effet c'est plutôt bizarre.
    Tu n'as pas oublié d'importer le WebKit ?
  • clampinclampin Membre
    11:37 modifié #23
    J'ai bien inclus le framework pourtant
  • 11:37 modifié #24
    dans 1221475482:

    J'ai bien inclus le framework pourtant

    Oui je suis con, sinon t'aurais eu un Error et non pas un Warning.
    Enfin bon ça marche c'est l'essentiel  :o
  • liquidliquid Membre
    11:37 modifié #25
    Coucou,
    Voici un screenshot de mon avancée;
    captureyt1.th.png

    Cependant j'ai encore besoin de vos lumières
    d'une part mon appli n'est pas encore satisfaisante étant donnée que la capture ne corresponds qu'a la partie visible;

    ceci étant, ceci n'est dramatique dans le sens ou je voudrais faire "disparaitre" la partie navigateur pour avoir quelque chose du type :
    on entre l'url, on clic sur un bouton et on génere l'apercu du site...

    voici mon code dans l'état actuel
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br />#import &lt;WebKit/WebView.h&gt;<br /><br />@interface SafariExpressController : NSObject {<br />&nbsp; &nbsp; IBOutlet NSTextField *URLInput;<br />&nbsp; &nbsp; IBOutlet WebView *webView;<br />&nbsp; &nbsp; IBOutlet NSImageView *frame;<br /><br />}<br />- (IBAction)goURL:(id)sender;<br />- (IBAction)MakePicture:(id)sender;<br />@end<br />
    

    <br />#import &quot;SafariExpressController.h&quot;<br /><br />@implementation SafariExpressController<br />- (IBAction)goURL:(id)sender {<br />	[webView takeStringURLFrom: URLInput];<br /><br />}<br /><br />- (IBAction)MakePicture:(id)sender {<br />NSRect	 frame2 = [webView frame];<br />NSBitmapImageRep	*rep = [webView bitmapImageRepForCachingDisplayInRect:frame2];<br />[webView cacheDisplayInRect:frame2 toBitmapImageRep:rep];<br />NSData	 *data = [rep representationUsingType:NSPNGFileType properties:nil];<br />NSImage *image = [[NSImage alloc] initWithData:data];<br /> <br />[frame setImage:image];<br />}<br />@end<br /><br />
    

    Je vous épargne les dizaines de lignes de code mort visant à  créer un WebView "virtuel";

    Ps:Il s'agit certainement de méconnaissance de ma part , j'ai encore un peu de mal avec avec l'objective-c ... mais je me soigne... ;)
  • 11:37 modifié #26
    Si je comprend bien tu nous donnes ton code mais tu veux virer la webview tout en rendant ton code actuel fonctionnel ?
    Ce que je comprend pas ds ce genre de solution c'est qu'en fait ds tous les cas il faut charger la page pour pouvoir créer l'aperçu  :o ... bon j'y vais plus directement : c'est pour faire quoi exactement ce petit soft ? :D

    Sinon, si tu ne veux plus voir ta webview ds l'interface, mets la simplement dans une NSView ds ton .nib (sans oublier de relier l'outlet webview et le ressourceLoadDelegate). Comme ça ça sera invisible aux yeux de l'utilisateur.
    Pour moi c'est la solution la plus simple possible  :o
  • liquidliquid Membre
    11:37 modifié #27
    dans 1221598916:

    Si bon j'y vais plus directement : c'est pour faire quoi exactement ce petit soft ? :D

    ben dans l'idée, il s'agirai un logiciel de capture (d'une image) d'un site web , dans la mesure du possible, (je verrai comment faire plus tard, déjà  je commence par une appli basic non pas une appli en basic  ;D... je complexifirai plus tard...) disponible dans la barre de menu. 
    pas spécialement pour concurrencer les softs deja existant (j'ai pas cette ambition là  , mais il faut bien commencer par quelque chose ...)

    dans 1221598916:

    Sinon, si tu ne veux plus voir ta webview ds l'interface, mets la simplement dans une NSView ds ton .nib (sans oublier de relier l'outlet webview et le ressourceLoadDelegate). Comme ça ça sera invisible aux yeux de l'utilisateur.
    Pour moi c'est la solution la plus simple possible  :o

    oki je teste dès ce soir...
  • 11:37 modifié #28
    Mais je confirme quand même que l'idée peut-être sympa... tu pourras nous pondre un nouveau système pour visionner toutes les pages de Safari comme le propose, il me semble, firefox pour son navigateur...  :o
  • liquidliquid Membre
    11:37 modifié #29
    dans 1221598916:

    Sinon, si tu ne veux plus voir ta webview ds l'interface, mets la simplement dans une NSView ds ton .nib (sans oublier de relier l'outlet webview et le ressourceLoadDelegate). Comme ça ça sera invisible aux yeux de l'utilisateur.
    Pour moi c'est la solution la plus simple possible  :o

    euuh  :o   (oui je suis encore en Cocoa Accompagnée)
    si Je comprends bien :
    >J'ouvre MainMenu.nib avec InterfaceBuilder
    Et c'est la que je suis pas sur de comprendre
    > Je supprime ma Webview
    >je la remplace par un NSView ...  et je rajoute un outlet  (Euh ben la en fait je nage)



  • NoNo Membre
    11:37 modifié #30
    On ne peut pas utiliser une webview si elle est cachée/masquée/invisible.
    Le screen-shot ne fonctionnera donc pas.

    Le mieux est de commencer par une webview (dans une fenêtre).
    Dès qu'il faut prendre le screen-shot (par un bouton, ou suite au delegate webView:didFinishLoadForFrame:), il faut créer l'image, puis masquer la webview et enfin créer ou afficher une NSImageView de même taille à  la même position que la webview masquée.
Connectez-vous ou Inscrivez-vous pour répondre.