2011-09-28 7 views
3

J'ai commencé à coder il y a environ un an sur iOS et j'ai commencé à écrire Objective C et j'ai réussi à produire quelques applications. J'assiste à mon premier jour de piratage la semaine prochaine et j'ai imaginé une idée de chasse au trésor qui implique des codes QR. J'ai réussi à trouver des classes ObjC pour gérer le décodage d'un code QR mais rien à encoder/générer en premier lieu.Comment utiliser le code C (libqrencode) dans un projet iOS

J'ai trouvé des liens vers quelques frameworks de l'objectif C sur le hub git, mais tous semblaient avoir des problèmes en suspens. Ensuite, j'ai trouvé ce fil ici:

Is there any QR Encoding Library in Cocoa?

Cela m'a pointé dans la direction de libqrencode une « bibliothèque » C que je devrais être en mesure de se rendre au travail dans iOS étant un surensemble de C.

Malheureusement, je n'ai pas la moindre idée de l'origine de mon projet. Quelqu'un peut-il expliquer les étapes de base de ce que je dois faire pour que je puisse au moins intelligemment Google. Jusqu'ici j'ai lu sur la définition des chemins de recherche et la création de bibliothèques statiques, mais aucune idée si c'est même la bonne voie à suivre.

Toute aide appréciée - essayez et restez simple mes connaissances se terminent à l'écriture des VC de base.

Répondre

1

Je recommanderais le Objective C QR Encoder, qui est un codeur Apache sous licence QR écrit en Objective C.

+0

Oui, j'ai vu celui-là juste une honte sur le manque de soutien japonais en cas de problèmes. Pas un problème alors que c'est juste un hack proj je suppose ... tu en connais d'autres? –

1

Jetez un oeil à ce libqrencode xcode project. Cela ne vous donne qu'une bibliothèque compilée, pas d'exemple d'utilisation.

1

Voici ce que vous avez à faire en général pour toute bibliothèque statique C:

  1. comprennent la bibliothèque dans un projet XCode, allez au projet puis sélectionnez l'onglet « construire des phases », et il ouvre la "link binary avec les bibliothèques" section - ajoutez votre bibliothèque statique libqrencode là. Accédez à l'onglet "Paramètres de construction" du projet et recherchez "en-tête", puis ajoutez le chemin d'accès à l'emplacement de la bibliothèque pour conserver les en-têtes dans les "chemins de recherche d'en-tête".

Vous pouvez maintenant inclure les fichiers d'en-tête dans des fichiers Objective-C et appeler directement dans la bibliothèque.

Un point de départ général de recherche Google serait "ajouter la bibliothèque C au projet iPhone XCode". Ce n'est pas vraiment une compétence CS, CS est plus ésotérique que les chemins de recherche ...

+0

Excepté pour la bibliothèque doit être compilé pour l'architecture de bras (armv7/armv7s) pour qu'il fonctionne sur les appareils iOS. – Samsinite

+0

Vous pouvez définir explicitement quelles architectures sont requises pour votre application, la valeur par défaut est armv7/armv7s. Mais si vous définissez la valeur de "Architectures", vous pouvez simplement dire armv7 (au lieu de ARCHS_STANDARD_32BIT), et cela ne demandera pas à la bibliothèque de prendre en charge armv7s. –

1

libqrencode est sous licence LGPL. Pour que votre code reste propriétaire, il doit lier à libqrencode d'une manière qui permet à l'utilisateur de remplacer la bibliothèque par une version modifiée (1). C'est impossible à faire dans l'App Store. Votre code doit être sous licence GPL pour utiliser libqrencode, et le code sous licence GPL n'est pas autorisé dans l'App Store (2). Par conséquent, vous ne pouvez pas utiliser libqrencode dans une application App Store.

Cela dit, est un code ici qui peut être utilisé dans un projet iOS pour l'interface avec libqrencode:

#import <libqrencode/qrencode.h> 

void freeRawData(void *info, const void *data, size_t size) { 
    free((unsigned char *)data); 
} 

- (UIImage *)quickResponseImageForString:(NSString *)dataString withDimension:(int)imageWidth { 

    QRcode *resultCode = QRcode_encodeString([dataString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1); 

    unsigned char *pixels = (*resultCode).data; 
    int width = (*resultCode).width; 
    int len = width * width; 

    if (imageWidth < width) 
     imageWidth = width; 

    // Set bit-fiddling variables 
    int bytesPerPixel = 4; 
    int bitsPerPixel = 8 * bytesPerPixel; 
    int bytesPerLine = bytesPerPixel * imageWidth; 
    int rawDataSize = bytesPerLine * imageWidth; 

    int pixelPerDot = imageWidth/width; 
    int offset = (int)((imageWidth - pixelPerDot * width)/2); 

    // Allocate raw image buffer 
    unsigned char *rawData = (unsigned char*)malloc(rawDataSize); 
    memset(rawData, 0xFF, rawDataSize); 

    // Fill raw image buffer with image data from QR code matrix 
    int i; 
    for (i = 0; i < len; i++) { 
     char intensity = (pixels[i] & 1) ? 0 : 0xFF; 

     int y = i/width; 
     int x = i - (y * width); 

     int startX = pixelPerDot * x * bytesPerPixel + (bytesPerPixel * offset); 
     int startY = pixelPerDot * y + offset; 
     int endX = startX + pixelPerDot * bytesPerPixel; 
     int endY = startY + pixelPerDot; 

     int my; 
     for (my = startY; my < endY; my++) { 
      int mx; 
      for (mx = startX; mx < endX; mx += bytesPerPixel) { 
       rawData[bytesPerLine * my + mx ] = intensity; //red 
       rawData[bytesPerLine * my + mx + 1] = intensity; //green 
       rawData[bytesPerLine * my + mx + 2] = intensity; //blue 
       rawData[bytesPerLine * my + mx + 3] = 255;   //alpha 
      } 
     } 
    } 

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rawData, rawDataSize, (CGDataProviderReleaseDataCallback)&freeRawData); 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
    CGImageRef imageRef = CGImageCreate(imageWidth, imageWidth, 8, bitsPerPixel, bytesPerLine, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 

    UIImage *quickResponseImage = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 
    CGColorSpaceRelease(colorSpaceRef); 
    CGDataProviderRelease(provider); 
    QRcode_free(resultCode); 

    return quickResponseImage; 
} 
+2

J'ai vérifié avec l'auteur et il a confirmé que libqrencode peut être utilisé sous une licence de style bsd. Vous pouvez lui demander une permission spéciale - https://github.com/fukuchi/libqrencode – surajz

3

Here's a blogpost d'un gars qui a créé un projet XCode travaillant avec la bibliothèque inclus et exemple de code. L'exemple de code est le même que @conradev publié comme l'une des réponses. J'ai testé cela dans Xcode 4.3 et fonctionne à merveille.

J'ai essayé d'inclure la lib originale dans un de mes projets et ai lamentablement échoué mais j'ai inclus ceux dans ce projet et tout a fonctionné sans n'importe quel ajustement ainsi je suis positif qu'il n'a changé aucun paramètre dans le projet Xcode . Créez simplement un nouveau projet, faites glisser les fichiers qrencode lib de ce projet, collez le code de @ conradev et tout fonctionne comme prévu.

Questions connexes